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

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

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

先回忆一下第一个问题:
第一个问题是求,给定模型的状况下,求某种观测序列出现的几率。
算法

好比,给定的HMM模型参数已知,求出三天观察是(Dizzy,Cold,Normal)的几率是多少?(对应的HMM模型参数已知的意思,就是说的A(trainsition_probability),B(emission_probability),pi矩阵是已经知道的。)ide

相关条件以下图所示:
隐马尔科夫模型-前向算法
spa

由上图所示,也就是说,能够写成以下代码:
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]


3d

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

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

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

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

下面,我详细走一遍一条路径的暴力算法,这样既能够避开公式的晦涩,也不失正确性。其它路径彻底相似it

第一天为Healthy的几率为:0.6io

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

而后求出在第一天为Healthy的基础上,而且第一天表现为Dizzy的前提下,次日也为Healthy的几率为:
P(Healthy|Healthy,Dizzy) = P(Dizzy|healthy)07 = 0.060.7

上面求完的时候,表明下图中的红线已经转移完了。

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

好,那么当在前面基础上,次日观察为Cold的几率为:
P(Cold|(Healthy,Dizzy),(Healthy)) = P(Healthy|Healthy,Dizzy)0.4 = 0.060.7*0.4
如今咱们已经完成一条路径的完整结果了。

就是在第一天隐含状态为Healthy和次日隐含状态为Healthy的基础上,观察序列为Dizzy,Cold的几率为
P(Dizzy,Cold|Healthy,Healthy) = 0.060.70.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实现代码

代码以下:

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

近期文章预告:
《隐马尔科夫模型-后向算法》
《隐马尔科夫模型-维特比算法》
《深刻浅出讲解支持向量机(SVM)》


推荐阅读文章:
隐马尔科夫模型-基本模型与三个基本问题
深刻浅出理解决策树算法(一)-核心思想
带你搞懂朴素贝叶斯分类算法


全是通俗易懂的硬货!只需置顶~欢迎关注交流~

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

相关文章
相关标签/搜索