bool HMMSoftAutomaton::iterateTrain() { int idx, idy; initIterate(); // 对所有的template做迭代 for(idx = 0; idx < templates->size(); idx++) { calcAlphaBeta((*templates)[idx]); // 1. 根据alpha 和 beta的缓存更新template的feature在各个状态的分布 updateTemplateNode(idx); // 2. 更新计算s->sNxt , 累加而已 updateTemplateTransfer(idx); } bool bigChange = updateTransfer(); /* for(int i = 1;i <= stateNum; i++) { for(int j = 1;j <= stateNum; j++) { printf("%lf ", transferCost[i][j]); } puts(""); } */ for(idx = 1; idx <= stateNum; idx++) { getState(idx)->gaussianTrain(gaussNum); } return bigChange; }
/* *data[0..nharmonics], *var[0..2*nharmonics] */ double calcChiReduction(int nharmonics, const float *cosdata, const float *sindata, const float *cosvar, const float *sinvar, gsl_matrix *alpha, gsl_vector *beta, gsl_vector *x) { double chisqred; calcAlphaBeta(nharmonics, cosdata, sindata, cosvar, sinvar, alpha, beta); /* alpha and beta are now fully set. Time to solve */ /* Stick in your thumb and pull out a plum: solve by Householder */ gsl_linalg_HH_solve(alpha, beta, x); /* x = alpha^-1 beta */ gsl_blas_ddot(x, beta, &chisqred); return chisqred; }