Exemplo n.º 1
0
double Hmm::getPseudoCounts(PseudoCounts& counts)
{
  double PofObs = obsProb(); // this call includes a forward() call.
  backward();
  //  print();

  // Compute the pseudo counts of transitions, emissions, and initializations
  for (unsigned int t = 0; t<_timeSlots.size(); t++) {
    TimeSlot* ts = _timeSlots[t];
    TimeSlot::iterator it = ts->begin();

    // P(X_t=s|e_1:T) = alpha_s(t)*beta_s(t)/P(e_t+1:T|e_1:t)
    // The value sum below is log P(e_t+1:T|e_1:t)
    vector<double> logprobs;
    for (; it!=ts->end(); it++) {
      logprobs.push_back((*it)->logAlpha()+(*it)->logBeta());
    }
    double sum = sumLogProb(logprobs);

    // add the pseudo counts into counts
    for (it = ts->begin(); it!=ts->end(); it++) {
      HmmNode* node = *it;
      
      //stateCount=P(X_t=s|e_1:T) 
      double stateCount = node->logAlpha()+node->logBeta()-sum; 

      counts.stateCount().add(node->state(), stateCount);
      vector<Transition*>& ins = node->ins();
      unsigned int k;
      for (k = 0; k<ins.size(); k++) {
	Transition* trans = ins[k];
	HmmNode* from = trans->_from;
	double transCount = from->logAlpha()+getTransProb(trans)
	  +getEmitProb(trans)+node->logBeta()-PofObs;
//	cerr << _str2id.getStr(node->state()) << '\t' 
//	     << _str2id.getStr(trans->_obs) << '\t'
//	     << exp(transCount) << endl;
	counts.emitCount().add(node->state(), trans->_obs, transCount);
      }
      vector<Transition*>& outs = node->outs();
      for (k = 0; k<outs.size(); k++) {
	Transition* trans = outs[k];
	HmmNode* to = trans->_to;
	double transCount = node->logAlpha()+getTransProb(trans)
	  +getEmitProb(trans)+to->logBeta()-PofObs;
	counts.transCount().add(node->state(), to->state(), transCount);
      }
    }
  }
  //  counts.print(_str2id);
  return PofObs;
}
Exemplo n.º 2
0
// Compute P(e_1:T) = sum_s P(e_1:T, x_T=s) = sum_s alpha_s(T);
double Hmm::obsProb()
{
  if (_timeSlots.size()<1)
    return 1; // no observations

  forward();
  TimeSlot* last = _timeSlots[_timeSlots.size()-1];
  vector<double> alphaT;
  for (TimeSlot::iterator it = last->begin(); it!=last->end(); it++) {
    alphaT.push_back((*it)->logAlpha());
  }
  return sumLogProb(alphaT);  
}
Exemplo n.º 3
0
void Hmm::forward()
{
  // compute forward probabilities at time 0
  TimeSlot* t0 = _timeSlots[0];
  HmmNode* init = (*t0)[0];
  init->logAlpha(0);

  // compute forward probabilities at time t using the alpha values for time t-1
  for (unsigned int t = 1; t<_timeSlots.size(); t++) {
    TimeSlot* ts = _timeSlots[t];
    for (TimeSlot::iterator it = ts->begin(); it!=ts->end(); it++) {
      vector<Transition*>& ins = (*it)->ins();
      vector<double> logProbs(ins.size());
      for (unsigned int i = 0; i<ins.size(); i++) {
	Transition* trans = ins[i];
	double logProb = trans->_from->logAlpha()+getTransProb(trans)+getEmitProb(trans);
	logProbs[i] = logProb;
      }
      (*it)->logAlpha(sumLogProb(logProbs));
    }
  }
}
Exemplo n.º 4
0
int MaxEntModel::getProbs(MaxEntEvent& event, vector<double>& probs)
{
  probs.clear();
  probs.assign(_classes, 0);
  int max = -1;
  for (unsigned int c = 0; c<_classes; c++) {
    double s = 0;
    for (unsigned int f = 0; f<event.size(); f++) {
      FtMap::iterator it = _index.find(event[f]);
      if (it!=_index.end()) 
	s += _lambda[it->second+c];
    }
    probs[c] = s;
    if (max<0 || probs[max]<s)
      max = c;
  }
  double sum = sumLogProb(probs);
  for (unsigned int i = 0; i<_classes; i++) {
    probs[i] = exp(probs[i])/exp(sum);
  }
  return max;
}
Exemplo n.º 5
0
void Hmm::backward()
{
  int T = _timeSlots.size()-1;
  if (T<1) // no observation
    return;
  for (int t = T; t>=0; t--) {
    TimeSlot* ts = _timeSlots[t];
    for (TimeSlot::iterator it = ts->begin(); it!=ts->end(); it++) {
      HmmNode* node = *it;
      if (t==T)
	node->logBeta(0);
      else {
	vector<Transition*>& outs = node->outs();
	vector<double> logProbs(outs.size());
	for (unsigned int i = 0; i<outs.size(); i++) {
	  Transition* trans = outs[i];
	  double logProb = trans->_to->logBeta()+getTransProb(trans)+getEmitProb(trans);
	  logProbs[i] =logProb;
	}
	node->logBeta(sumLogProb(logProbs));
      }
    }
  }
}