Beispiel #1
0
/* UpdateMeans: use acc values to calc new estimate of means */
static int UpdateMeans(HMMSet *hset, int px, HLink hmm)
{
   int i,s,m,k,M,N,vSize,nmapped;
   float occim;
   MuAcc *ma;
   StateElem *se;
   StreamElem *ste;
   MixtureElem *me;
   Vector mean;
   
   N = hmm->numStates; nmapped=0;
   se = hmm->svec+2; 
   for (i=2; i<N; i++,se++){
      ste = se->info->pdf+1; 
      for (s=1;s<=S;s++,ste++){
         vSize = hset->swidth[s];
         me = ste->spdf.cpdf + 1; M = ste->nMix;
         for (m=1;m<=M;m++,me++)
            if (MixWeight(hset,me->weight) > MINMIX){
               mean = me->mpdf->mean;
               ma = (MuAcc*)GetHook(mean);
               if (ma != NULL){
                  occim = ma->occ;
                  if (occim > 0.0) {
		    if (occim > minObs) nmapped++;
		    for (k=1; k<=vSize; k++)
		      mean[k] = ( mean[k] * mapTau + (ma->mu[k] + mean[k]*occim) )/( mapTau + occim );
                  } 
                  SetHook(mean,NULL);
               }
            }
      }
   }
   return(nmapped);
}
Beispiel #2
0
            HError(2319,"HERest: Label File format expected");

         if((lff = Str2Format(GetStrArg())) == ALIEN)

            HError(-2389,"HERest: Warning ALIEN Label file format set");

         break;

      case 'H':

         if (NextArg() != STRINGARG)

            HError(2319,"HERest: HMM macro file name expected");

         strcpy(up_hmmMMF,GetStrArg());

         AddMMF(&hset,up_hmmMMF);

         break;     

      case 'I':
Beispiel #3
0
/* UpdateVars: use acc values to calc new estimate of variances */
static void UpdateVars(HMMSet *hset, int px, HLink hmm)
{
   int i,s,m,k,M,N,vSize;
   float occim,x,muDiffk,dmu;
   Vector minV;
   VaAcc *va;
   MuAcc *ma;
   StateElem *se;
   StreamElem *ste;
   MixtureElem *me;
   Vector mean,var;
   Covariance cov;
   Boolean mixFloored,shared;
   
   N = hmm->numStates;
   se = hmm->svec+2; 
   for (i=2; i<N; i++,se++){
      ste = se->info->pdf+1;
      for (s=1;s<=S;s++,ste++){
         minV = vFloor[s];
         me = ste->info->spdf.cpdf + 1; 
         M = ste->info->nMix;
         for (m=1;m<=M;m++,me++)
	   if (MixWeight(hset,me->weight) > MINMIX){
               cov = me->mpdf->cov;
               va = GetHook(cov.var);
               mean = me->mpdf->mean;
               vSize = VectorSize(mean);
               ma = GetHook(mean);
               if (va != NULL){
                  occim = va->occ;
                  mixFloored = FALSE;
                  if (occim > 0.0){
                     shared = (GetUse(cov.var)>1 || ma==NULL || ma->occ<=0.0) ? TRUE : FALSE;
                     if (me->mpdf->ckind==DIAGC) {
		         var = cov.var;
			 for (k=1; k<=vSize; k++){
			   if (shared) muDiffk = 0.0;
			   else {
			     dmu = (ma->mu[k])/(mapTau+occim);
			     muDiffk = 2*dmu*ma->mu[k] - dmu*dmu*occim;
			   }
                           x = (mapTau*var[k]  + va->cov.var[k] - muDiffk) / (mapTau + occim);
                           if (applyVFloor && x<minV[k]) {
                             x = minV[k];
                              nFloorVar++;
                              mixFloored = TRUE;
			    }
			   cov.var[k] = x;
			 }
       		     }
                     else { /* FULLC */
		       HError(999,"MAP estimation of full covariance matrices not supported");
		     }
		  }
                  if (mixFloored == TRUE) nFloorVarMix++;
		  SetHook(cov.var,NULL);
               }
            }
      }
   }
}