隐马尔科夫模型-前向算法

转载自  隐马尔科夫模型-前向算法

隐马尔科夫模型-前向算法

在该篇文章中讲了隐马尔科夫模型(HMM)一基本模型与三个基本问题 隐马尔科夫模型-基本模型与三个基本问题,这篇文章总结一下隐马尔科夫链(HMM)中的前向与后向算法,首先给出这俩个算法是为了解决HMM的第一个基本问题。

先回忆一下第一个问题:

第一个问题是求,给定模型的情况下,求某种观测序列出现的概率。
比如,给定的HMM模型参数已知,求出三天观察是(Dizzy,Cold,Normal)的概率是多少?(对应的HMM模型参数已知的意思,就是说的A(trainsition_probability),B(emission_probability),pi矩阵是已经知道的。)
相关条件如下图所示:

由上图所示,也就是说,可以写成如下代码:

trainsition_probability = [[0.7,0.3],[0.4,0.6]]     emission_probability = [[0.5,0.4,0.1],[0.1,0.3,0.6]]   

pi = [0.6,0.4]

在第一个问题中,我们需要求解出三天观察是(Dizzy,Cold,Normal)的概率是多少?

这里为了演示简单,我只求解出俩天观察为(Dizzy,Cold)的概率是多少!

这个问题太好求解了,最暴力的方法就是将路径全部遍历一遍。下面尽可能通俗易懂的说明一下:
首先画出时间序列状态图如下:

下面,我详细走一遍一条路径的暴力算法,这样既可以避开公式的晦涩,也不失正确性。其它路径完全类似

第一天为Healthy的概率为:0.6

在第一天为Healthy的基础上,观察为Dizzy的概率为:P(Dizzy|Healthy)=0.6*P(Healthy->Dizzy)=0.6*0.1=0.06

然后求出在第一天为Healthy的基础上,并且第一天表现为Dizzy的前提下,第二天也为Healthy的概率为:
P(Healthy|Healthy,Dizzy) = P(Dizzy|healthy)*07 = 0.06*0.7
上面求完的时候,代表下图中的红线已经转移完了。

好,那么当在前面基础上,第二天观察为Cold的概率为:
P(Cold|(Healthy,Dizzy),(Healthy)) = P(Healthy|Healthy,Dizzy)*
0.4 = 0.06*0.7*0.4
现在我们已经完成一条路径的完整结果了。

就是在第一天隐含状态为Healthy和第二天隐含状态为Healthy的基础上,观察序列为Dizzy,Cold的概率为
P(Dizzy,Cold|Healthy,Healthy) = 0.06*0.7*0.4=0.0168

那么同理,我们就可以求出其它三条路径。
(1)在第一天隐含状态为Healthy和第二天隐含状态为Fever的基础上,观察序列为Dizzy,Cold的概率
(2)在第一天隐含状态为Fever和第二天隐含状态为Healthy的基础上,观察序列为Dizzy,Cold的概率
(3)在第一天隐含状态为Fever和第二天隐含状态为Fever的基础上,观察序列为Dizzy,Cold的概率

然后最后的第一个问题的结果就是将这四个结果相加起来就可以了。是不是很简单,那么为了还需要前向后向算法来解决这个事呢?

其实这个算法在现实中是不可行的。我给的例子由于是为了讲解容易,状态值和观察值都很小,但是实际中的问题,隐状态的个数是非常大的。

那么我们的计算量是不可以忍受的。

我们可以稍微估计一下,加入状态值是N个,观察值是K个。总共观察长度为T。

那么我们的路径总个数就是N的T次方,我的天,这个复杂度已经接受不了了,到达了每个隐含状态的时候,还需要算一遍观察值出现的概率(每个隐状态计算一遍到观察值的概率)。又要乘以NT(当然这已经对前面很大复杂度构成不了多少作用了)

所以我们得出结论,暴力法在这里并不实用,于是就引出了前向后向算法。它们都是基于动态规划思想求解。下面介绍一下:

1、前向算法

我们首先定义一下前向概率

定义:给定隐马科夫模型lamda,定义到时刻t为止的观测序列为01,02,03....0t且状态为qi的概率为前向概率,记作

可以递推地求得前向概率及观测序列概率

下面,我们可以整理一下前向算法的流程:

输入:隐马尔可夫模型,观测序列

输出:观测序列概率

(1)初值

前向概率的定义中一共限定了两个条件。

一是到当前为止的观测序列,另一个是当前的状态。所以初值的计算也有两项(观测和状态),一项是初始状态概率,另一项是发射到当前观测的概率。

(2)递推对t=1,2,3,.....,T-1

每次递推同样由两部分构成,大括号中是当前状态为i且观测序列的前t个符合要求的概率,括号外的是状态i发射观测t+1的概率。

下面稍微解释一下公式:

(3)终止

由于到了时间T,一共有N种状态发射了最后那个观测,所以最终的结果要将这些概率加起来(因为每个隐状态都可能产生我们需要的观测值,所以都要加起来)。

公式可以用下面的转移图表示,假设我要求第二层某个结点的前向概率,等于前一层所有结点到该结点的转移,如下图:

由于每次递推都是在前一次的基础上进行的,所以降低了复杂度(计算只存在于相邻的俩个时间点)。计算如下图所示:

下方标号表示时间节点,每个时间点都有N种状态,所以相邻两个时间之间的递推消耗N^2次计算。

而每次递推都是在前一次的基础上做的,所以只需累加O(T)次,所以总体复杂度是O(T)个N^2,即0(TN^2),这比起我们前面说的暴力法的复杂度已经好了太多了。

到这里为止,前向算法也就讲完了。本文通过一个具体简单例子,走了一遍过程,期间有一些自己的总结和理解,希望对大家有帮助~

 

2、python实现代码

代码如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线段树初见——区间询问与改变最大值

前言 昨天某B组讲主席树,然后就作死的去听了,也没听懂(因为连线段树都不懂),然后好奇心就去问了一下老师线段树是个蛤,然后这篇博客就诞生了。 正题 首先线段树就是一个可以快速区间改变和询问的东东&am…

关系数据库理论

依赖 候选码 三大范式 公理系统 求最小函数的依赖集 例 解 模式分解

19级:班级日常分享 | 一天一瞬间

点击上方蓝色关注我们!昨天没有看到他们早读,有点失落。今天再一次去教室,还未走到门口呢,就听见教室里面的早读生透过门缝传出,甚是开心。在陪他们早读的时候,自己顺便读了几篇散文和古诗古文,…

在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序

前言 Visual Studio 2017已经发布了很久了。做为集成了Asp.Net Core 1.1的地表最强IDE工具,越来越受.NET系的开发人员追捧。 随着Google Angular4的发布。我一直在想,怎么能够用这个地表最强IDE工具编写Angular4的Asp.Net Core项目。经过不懈的研究。终…

机器学习中向量化编程总结记录

转载自 机器学习中向量化编程总结记录 向量化编程总结记录 很多时候,我们在实现算法的时候,总会碰到累和的伪代码: 比如下面这个: 为了简单我这里只重复5次,但是原理是一样的。 很显然我们要得到这个结果&#xf…

Spring整合Mybatis-完成用户登录

①导入的jar包: ②在src下创建并配置applicationcontext.xml文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

【jzoj】2018.2.7NOIP普及组——某【BC】组模拟赛

前言 ……终于改完了&#xff0c;像之前小L一样崩溃。今天C组和B组一起做题&#xff0c;所以…… 正题 题目1&#xff1a;教主的花园&#xff08;jzoj1792&#xff09; 一平面直角坐标系&#xff0c;在x轴的位置建立一堵墙&#xff0c;墙上有n道门&#xff0c;给出门的位置&a…

刘奕佳: 我的职校新生活 | 班级日常分享

点击上方蓝色关注我们&#xff01;时光匆匆&#xff0c;一转眼到了开学季&#xff0c;校园里弥漫着浓重的书香之气踏入校园&#xff0c;映入眼帘的就是雄伟的教学楼&#xff0c;意气风发的朗朗书声&#xff0c;让人情不自禁的陷入深深的学习中。实训楼当熟悉的上下课铃声又在我…

一个非常好的依存句法可视化工具

转载自 一个非常好的依存句法可视化工具 一个非常好的依存句法可视化工具 在依存句法研究中&#xff0c;常见的CONLL格式的句法树库&#xff0c;一眼看上去就不是太明白整棵树的结构。 这里分享推荐一个南京大学nlp实验室制作的一个依存句法可视化工具&#xff0c;效果如图…

DDD理论学习系列(8)-- 应用服务amp;amp;领域服务

1. 引言 单从字面理解&#xff0c;不管是领域服务还是应用服务&#xff0c;都是服务。而什么是服务&#xff1f;从SOA到微服务&#xff0c;它们所描述的服务都是一个宽泛的概念&#xff0c;我们可以理解为服务是行为的抽象。从前缀来看&#xff0c;根据DDD的经典分层架构&…

纪念中学15-5(=10)天感想

来自水lao ten days の 感想 前言 时光飞逝&#xff0c;转眼间&#xff0c;纪念中学的10天生活就那么过去了。回想起刚来&#xff0c;仿佛就在昨天。今天我将要离开这里&#xff0c;总感觉有无限的遗憾&#xff0c;无限的失落。可是花朵总是要谢&#xff0c;时光不停流逝。我…

祝张远远和杨凯博同学生日快乐 | 班级日常分享

点击上方蓝色关注我们&#xff01;首先祝张远远和杨凯博同学生日快乐&#xff01;上午丁老师和我说&#xff0c;今天是张远远同学的生日&#xff0c;于是我们就简单的商量了下&#xff0c;准备弄个活动&#xff0c;祝一下张远远同学生日快乐&#xff01;待下午时&#xff0c;获…

开放对静态资源的访问

前端控制器先进行处理&#xff0c;处理不了的交给default… 缺一不可

通俗理解维特比算法

转载自 通俗理解维特比算法 本文假定读者有一定的隐马模型基础&#xff01;或者大家可以参考这两篇文章。 隐马尔科夫模型-基本模型与三个基本问题和隐马尔科夫模型-前向算法 维特比算法说白了就是动态规划实现最短路径&#xff0c;只要知道“动态规划可以降低复杂度”这一…

使用docker-compose搭建AspNetCore开发环境

1 使用docker-compose搭建开发环境 我们的目标很简单&#xff1a;使用docker-compose把若干个docker容器组合起来就成了。 首先使用Nginx代理所有的Web程序&#xff0c;这样只需要在主机上监听一个端口就可以了&#xff0c;不污染主机。再组合各Web程序、Redis/Memcached、Sq…

珍惜、珍爱!

点击上方蓝色关注我们&#xff01;这是一篇付费文章&#xff0c;其实目的就是不让人看&#xff0c;哈哈哈&#xff01;不让别人看为什么还要写&#xff1f;因为写了才痛快&#xff01;

SpringAOP的SchemaBase方式

文章目录1、SpringAOP的专业概念:2、SpringAOP的SchemaBase方式基本流程SchemaBase方式环绕通知方式实现AOPSchemaBase方式的异常通知SpringAOP的SchemaBase方法的参数1、SpringAOP的专业概念: 真实对象: 要进行功能扩展的对象,相当于A对象 代理对象: 完成功能扩展的对象,相当于…

ssl2661-廉价最短路径【SPFA】

前言 这是一篇迟到的博客 题目 找一条最廉价的最短路径 输入输出&#xff08;建议无视&#xff09; Input 输入文件第一行有两个整数m和n&#xff0c;用一个空格隔开&#xff0c;其中&#xff0c;m是顶点数&#xff0c;而n是边数。接下来的n行给出所有的边及其价值&#…

自然语言处理的十个发展趋势

转载自 哈工大刘挺教授&#xff1a;自然语言处理的十个发展趋势 近日&#xff0c;由中国人工智能学会、阿里巴巴集团 & 蚂蚁金服主办&#xff0c;CSDN、中国科学院自动化研究所承办的第三届中国人工智能大会&#xff08;CCAI 2017&#xff09;在杭州国际会议中心盛大开幕…

SpringAOP的Aspectj方式*

SpringAOP的Aspectj介绍 问题: 目前我们已经能够使用SpringAOP的SchemaBased方式来实现功能扩展。在使用SchemaBased方式实现功能扩展时&#xff0c;发现一个扩展代码就需要声明对应的实现了指定的接口的类&#xff0c;这样造成代码的结构体系过于繁杂。一个通知一个类。 解决…