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;
}
示例#2
0
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;
}
示例#4
0
 double *Sequence::getProbs()
 {
   double ps[probs.size()];
   getProbs(ps);
   return ps;
 }