前言
隐马尔科夫模型有三个基本问题:概率计算问题,学习问题,预测问题。本博客介绍概率计算问题的前向与后向算法。阅读本文前请先学习隐马尔科夫模型——基本概念
什么是概率计算问题
给定模型
λ=(A,B,π)和观测序列
O=(o1,o2,...,oT),计算在模型下观测序列O出现的概率
P(O∣λ)
结合先前讨论的盒子实验问题,就是要计算出现某个随机球序列的概率是多少。
直接计算法
最直观容易理解的方法是,先穷举出所有长度为T的状态序列,然后根据各个状态序列和观测序列,求出所有状态序列下,可以得到给定观测序列的概率。最后对所有可能的状态序列求和。比如我们得到了的观测序列是{红,白,白},那么我们首先穷举出所有长度为3状态序列组合;对于每一个可能确定的状态序列,比如{盒子1,盒子2,盒子3},求出此状态序列产生的概率
P(I∣λ),此概率再乘以此状态下产生已知观测队列的概率
P(O∣I,λ),得到
P(O,I∣λ)。然后把所有可以得到该观测序列的概率求和。
事实上,这种算法计算量太大,并不可行。
前向算法
前向概率
给定模型
λ,从时刻1到时刻t可观测序列为
o1,o2,...,ot且状态为
qi的概率记做前向概率
αt(i)=P(o1,o2,...,ot,it=qi∣λ)
前向算法过程描述
前向算法与维特比算法的思想类似,都是要利用确定观测序列下的状态序列概率。唯一修改的地方,维特比求的是状态序列的最大概率,前向算法求的是所有情况下生成观测序列的概率和。
- 初始化:
α1(i)=πibi(o1),i=1,2,...,N
- 递推:对于t=1,2,3,…,T-1
αt(i)=[j=1∑Nαt(j)aji]bi(ot+1)代表到时刻t+1,已知观测序列
o1,o2,...,ot+1,状态为
qi的前向概率。
- 终止:
P(O∣λ)=i=1∑NαT(i)
减少计算量的原因在于每一次计算直接引用前一个时刻的计算结果,避免重复计算。
举例计算
下面的例子是先前提到[盒子实验问题](http://blog.csdn.net/wqy20140101/article/details/78867544)更简单版本。请务必先阅读先前的盒子问题。![这里写图片描述](https://img-blog.csdn.net/20171222163316696?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3F5MjAxNDAxMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ## 后向算法 ##
后向概率
给定模型
λ,时刻t状态为
qi的条件下,从时刻t+1到时刻T可观测序列为
ot+1,ot+2,...,oT的概率记做后向概率
βt(i)=P(ot+1,ot+2,...,oT∣i=qi,λ)
- 初始化:
βT(i)=1,i=1,2,...,N
- 递归:对t=T-1,T-2,…,1
βt(i)=j=1∑Naijbj(ot+1)βt+1(j),i=1,2,...,N
- 终止:
P(O∣λ)=i=1∑Nπibi(o1)β1(i)
后续
由前向概率和后向概率我们可以得到一些单个状态和两个状态概率的计算公式。这里不再讨论。我们还可以得到一些有用的期望值,具体内容可以参看李航《统计学习方法》第十章。