整理自博客:从一个实例中学习HMM前向算法
HMM在实际应用中主要用来解决3类问题:
评估问题
给定观测序列 o=o1o2o3⋅⋅⋅ot 和模型参数 λ=(A,B,π) ,怎么样有效计算这一个观测的概率。(Forward Algorithm,前向算法;Backforward Algorithm,后向算法)解码问题
给定观测序列 o=o1o2o3⋅⋅⋅ot 和模型参数 λ=(A,B,π) ,怎么样寻找满足这种观测序列意义上最优的隐含状态序列 s 。学习问题
HMM的模型参数λ=(A,B,π) 未知,如何求出这3个参数以使观测数据 o=o1o2o3⋅⋅⋅ot 出现的概率尽可能大。
本篇文章只针对问题一
在阐述算法之前,先引入几个符号:
at(i)
:表示到第
t
个观测值
问题来源
我们要解决的是模型估计问题,即计算概率 P(O|λ) 。可以用如下公式简化:
为了解决上述算法计算量大的问题,前向算法就出现了。
首先定义了一个前向变量
αt(i)
,表示在
t
时刻,到达状态
前向变量
αt(i)
:
αt(i)=P(o1o2⋅⋅⋅ot,qt=i|λ)
初值:
α1(i)=P(o1,q1=i)=πibi(o1)
最后有递推关系:
为什么这样就可以简化计算复杂度呢?其原因很简单,因为每一次的
at(i)
,我们都可以用
at−1(i)
来计算,就不用重复计算了。如下图所示:
举例
题目:HMM模型如下,试通过前向算法计算产生观察符号序列 O={ABAB} 时每个时刻的 αt(i) 和总概率。其中,初始概率矩阵 n=(1,0,0) ,即开始处于状态1。
按照上面的公式理论,我们的递推一次解出 at(i) 。解法如下:
t=1
时:
t=2
时:
t=3
时:
t=4
时:
所以最后的结果:
P(O|λ)=α4(1)+α4(2)+α4(3)=0.0717679
最后将其计算过程示意图表示如下: