double MaxEnt::getFeaExpects( double *expects ) { int i, j, k; for( i = 0; i < featureSize; i ++ ) expects[i] = 0; double *probs = new double[classNumber]; double log_Likelihood = 0; for( i = 0; i < M; i ++ ) { SpElem *vec = x[i]; getProbs( vec, probs ); log_Likelihood += log(probs[y[i]]); for( j = 0; vec[j].index != -1; j ++ ) for( k = 0; k < classNumber; k ++ ) expects[vec[j].index*classNumber+k] += probs[k] * vec[j].value; } delete []probs; return log_Likelihood; }
double MaxEntModel::getExpects(EventSet& events, vector<double>& expects) { expects.clear(); expects.assign(_lambda.size(), 0); double sumLogProb = 0; for (unsigned int i = 0; i<events.size(); i++) { MaxEntEvent& e = *events[i]; vector<double> probs; getProbs(e, probs); for (unsigned long c = 0; c < _classes; ++c) { double count = probs[c] * e.count(); for (unsigned long j = 0; j < e.size(); j++) { FtMap::iterator it = _index.find(e[j]); if (it!=_index.end()) expects[it->second + c] += count; } } sumLogProb += log(probs[e.classId()]); } return sumLogProb; }
int MaxEnt::predict( vector<string> feature, vector<pair<string,double> > &labelProbs ) { if ( !model->modelBuildDone() ) { fprintf( stderr, "maxent model has not been build!\n"); return -1; } int i, j; SpElem *x = new SpElem[feature.size()+1]; int id; for( i = 0, j = 0; i < feature.size(); i ++ ) if ( model->getFeaId(feature[i],id) ) { x[j].index = id; x[j].value = 1; j ++; } x[j].index = -1; x[j].value = 0; double *probs = new double[classNumber]; getProbs( x, probs ); labelProbs.clear(); int maxProbIndex = -1; for( i = 0; i < classNumber; i ++ ) { if ( i == 0 || probs[i] > probs[maxProbIndex] ) maxProbIndex = i; string clsName; if ( !model->getClsName(i,clsName) ) fprintf( stderr, "index %d doesn't have a class name\n", i ); labelProbs.push_back(pair<string,double>(clsName,probs[i])); } delete []x; delete []probs; return maxProbIndex; }
double *Sequence::getProbs() { double ps[probs.size()]; getProbs(ps); return ps; }