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;
}
Ejemplo n.º 2
0
            /* *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;
}