当前位置: 首页 > news >正文

隐马尔可夫模型(四)——隐马尔可夫模型的评估问题(后向算法)

对于HMM的评估问题,利用动态规划可以用前向算法,从前到后算出前向变量;也可以采用后向算法,从后到前算出后向变量。

先介绍后向变量βt(i):给定模型μ=(A,B,π),并且在时间 时刻t 状态为si 的前提下,输出序列为Ot+1Ot+2...OT的概率,即

                                    βt(i)=P(Ot+1Ot+2...OT|qt=si,μ)

归纳过程

    假设仍然有3个状态

                  

    当t=T时,按照定义:时间t  状态q输出为OT+1......的概率,从T+1开始的输出是不存在的(因为T时刻是终止终止状态),即T之后是空,是个必然事件,因此βt(i)=1,1≤1≤N

    当t=T-1时,

                          

                 βT-1(i)=P(OT|qT-1=si,μ) = ai1*b1(OT)*βT(1)  +  ai2*b2(OT)*βT(2)  +  ai3*b3(OT)*βT(3)

      ......

    当t=1时,

       β1(1)=P(O2O3...OT|q2=s1,μ) = a11*b1(O2)*β2(1) + a12*b2(O2)*β2(2) + a13*b3(O2)*β2(3)

       β1(2)=P(O2O3...OT|q2=s1,μ) = a21*b1(O2)*β2(1) + a22*b2(O2)*β2(2) + a23*b3(O2)*β2(3)

       β1(3)=P(O2O3...OT|q2=s1,μ) = a31*b1(O2)*β2(1) + a32*b2(O2)*β2(2) + a33*b3(O2)*β2(3)

       P(O1O2...OT|μ) =    

                             =   

                             =  

后向算法

    step1 初始化:βT(i)=1, 1≤1≤N

    step2 归纳计算:

                       1≤t≤T-1, 1≤i≤N

    step3 求终结和:

                   P(O|μ)=  

时间复杂度

    计算某时刻在某个状态下的后向变量需要看后一时刻的N个状态,此时时间复杂度为O(N),每个时刻有N个状态,此时时间复杂度为N*O(N)=O(N2),又有T个时刻,所以时间复杂度为T*O(N2)=O(N2T)。

程序例证

              

后向算法

    计算P(O|M):

    step1:β4(1) = 1          β4(2) = 1          β4(3) = 1

    step2:β3(1) = β4(1)*a11*b1(white) + β4(2)*a12*b2(white) + β4(3)*a13*b3(white)

                     ...

    step3:P(O|M) = π11(1)*b1(O1) + π21(2)*b2(O1) + π31(3)*b3(O1)

程序代码

复制代码
#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[4][3];
        int list[4] = {0,1,0,1};
        result[3][0] = 1;
        result[3][1] = 1;
        result[3][2] = 1;
        int i,j,k, count = 3;
        for (i=2; i>=0; i--)
        {
            for(j=0; j<=2; j++)
            {
                result[i][j] = 0;
                for(k=0; k<=2; k++)
                {
                   result[i][j] += result[i+1][k] * a[j][k] * b[k][list[count]];
                }
            }
            count -= 1;
        }
       for (i=0; i<=3; i++)
        {
            for(j=0; j<=2; j++)
            {
                printf("b[%d][%d] = %f\n",i+1,j+1,result[i][j]);

            }
        }
        printf("backward:%f\n", result[0][0]*0.2*0.5+result[0][1]*0.4*0.4+result[0][2]*0.4*0.7);
        return 0;
}
复制代码

运行结果

             





本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/archive/2012/12/03/2800489.html,如需转载请自行联系原作者


相关文章:

  • mysql 创建日期列之timestamp
  • javascript中的数据类型、Object与Function
  • 华为交换机istack堆叠配置
  • iPhone/Mac Objective-C内存管理原理
  • 深入浅出WPF(8)——数据的绿色通道,Binding(中)
  • 基于Cisco技术的MPLS原理以及应用实现[一]
  • AIX系统学习之-CRS安装后校验
  • SSRS 2012 Report Items -- 表格类对象
  • oracle 查找OS进程id
  • linux--armv4l的安装
  • dwz(jui)刷新当前dialog的方法
  • Stucts应用引起的OutOfMemoryError
  • 跟我一起写 Makefile(一)
  • Linux使用笔记: 定制core dump文件的文件名
  • LVM 磁盘分区扩容
  • 网络传输文件的问题
  • 【Leetcode】101. 对称二叉树
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【面试系列】之二:关于js原型
  • 03Go 类型总结
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • JavaWeb(学习笔记二)
  • Java教程_软件开发基础
  • mysql 数据库四种事务隔离级别
  • node学习系列之简单文件上传
  • spring boot下thymeleaf全局静态变量配置
  • Vue 动态创建 component
  • Vue2.0 实现互斥
  • Vue小说阅读器(仿追书神器)
  • webpack4 一点通
  • yii2权限控制rbac之rule详细讲解
  • 安卓应用性能调试和优化经验分享
  • 编写高质量JavaScript代码之并发
  • 第2章 网络文档
  • 坑!为什么View.startAnimation不起作用?
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 想写好前端,先练好内功
  • 硬币翻转问题,区间操作
  • 06-01 点餐小程序前台界面搭建
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #FPGA(基础知识)
  • (33)STM32——485实验笔记
  • (done) 两个矩阵 “相似” 是什么意思?
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (八十八)VFL语言初步 - 实现布局
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)fock函数详解
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题