zoukankan      html  css  js  c++  java
  • 隐马尔可夫模型(六)——隐马尔可夫模型的评估问题(前向后向相结合算法)

    重新回顾:

        前向变量αt(i):在时刻t,在已知模型μ=(A,B,π)的条件下,状态处于si,输出序列为O102...Ot,前向变量为αt(i)

        后向变量βt(i):在时刻t,在已知模型μ=(A,B,π)和状态处于si的条件下,输出序列为Ot+1Ot+2...OT,后向变量为βt(i)

    公式推导:

        P(O,qt=si|μ) = P(O1O2...OT, qt=si|μ)

                             =P(O1O2...Ot, qt=si,Ot+1Ot+2...OT|μ)

                             =P(O1O2...Ot, qt=si|μ) * P(Ot+1Ot+2...OT|O1O2...Ot, qt=si,μ)

                             =P(O1O2...Ot, qt=si|μ) * P(Ot+1Ot+2...OT|qt=si,μ)

                             =αt(i) *  βt(i)

         P(O|μ)=

    案例分析:

       

          分析:

            P(q4=s3|O,M) =  P(q4=s3, O|M)/P(O|M)

                                = P(O,q4=s3|M)/P(O|M)

                                = α4(3) *  β4(3)

         程序:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
            float a[3][3] = {{0.5,0.2,0.3},{0.3,0.5,0.2},{0.2,0.3,0.5}};
            float b[3][2] = {{0.5,0.5},{0.4,0.6},{0.7,0.3}};
            float result_b[8][3];
            float result_f[8][3];
            float result, result_t;
            int list[8] = {0,1,0,0,1,0,1,1};
            result_b[7][0] = 1;
            result_b[7][1] = 1;
            result_b[7][2] = 1;
            result_f[0][0] = 0.2 * 0.5;
            result_f[0][1] = 0.4 * 0.4;
            result_f[0][2] = 0.4 * 0.7;
            //Backward
            int i,j,k, count = 7;
            for (i=6; i>=0; i--)
            {
                for(j=0; j<=2; j++)
                {
                    result_b[i][j] = 0;
                    for(k=0; k<=2; k++)
                    {
                       result_b[i][j] += result_b[i+1][k] * a[j][k] * b[k][list[count]];
                    }
                }
                count -= 1;
            }
           for (i=0; i<=7; i++)
            {
                for(j=0; j<=2; j++)
                {
                    printf("b[%d][%d]= %f\n",i+1,j+1, result_b[i][j]);
    
                }
            }
            printf("Backward:%f\n", result_b[0][0]*0.2*0.5+result_b[0][1]*0.4*0.4+result_b[0][2]*0.4*0.7);
            //Forward
            count = 1;
            for (i=1; i<=7; i++)
            {
                for(j=0; j<=2; j++)
                {
                    result_f[i][j] = 0;
                    for(k=0; k<=2; k++)
                    {
                        result_f[i][j] += result_f[i-1][k] * a[k][j] * b[j][list[count]];
                    }
                }
                count += 1;
            }
            for (i=0; i<=7; i++)
            {
                for(j=0; j<=2; j++)
                {
                    printf("a[%d][%d]= %f\n", i+1, j+1, result_f[i][j]);
                }
            }
            result = result_f[7][0] + result_f[7][1] + result_f[7][2];
            printf("Forward: %f\n", result);
            
            result_t = 0;
            for (i=0; i<=2; i++)
            {
                result_t += result_f[3][i] * result_b[3][i];
            }
            printf("Result:%f\n", result_f[3][2]*result_b[3][2]/result_t);
    
            return 0;
    }

            运行结果 

                                     

                        

  • 相关阅读:
    WM有约(二):配置信息
    ASP+Wrod、excel打印程序示例
    用stream直接下载文件
    ASP判断gif图像尺寸的方法
    白菜世纪RSS无刷新聚合器(1221修正)
    ASP.NET常用代码
    图片超过规定的大小就按原图片大小缩小
    javascript弹出窗口总结
    asp excel sql 关系大总结
    打开窗口
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/2803182.html
Copyright © 2011-2022 走看看