首先我们定义一个前向变量αt(i)
,αt(i)
是给定模型µ下,在时间t,HMM输出了序列O1O2...Ot,并且当前状态为si
的概率:
前向算法的主要思想是,如果可以快速的计算前向变量αt(i)
,那么就可以利用αt(i)
计算出P(O|µ),因为P(O|µ)其实就是所有状态qt
下观察到序列O1O2...OT的概率:
因为αT(i)
就是输出O1O2...OT,且状态为si
的概率,其实我们要的只是输出O1O2...OT,si
为哪个都可以,所以这里利用全概率公式的思想,我们把时刻T下出现任意状态且观察到O1O2...OT的概率相加,即得到了观察到O1O2...OT的概率。
我们还可以观察出前向变量αt(i)
的递推公式,因为t+1时刻的前向变量α(t+1)(j)
实际上就是t时刻之后,状态序列增加了一个sj
,然后观察序列多输出了一个O(t+1)。所以我们先根据前面提过的全概率公式的思想计算出输出序列O1O2...Ot的概率,然后因为状态由所有可能的状态si
变到了某一特定sj
所以自然要乘一个对应的aij
,然后我们就得到了t+1时刻下的状态序列,这个状态序列的最后一个状态是sj
。然后为了得到输出序列O1O2...OtO(t+1),只需要再多乘一个bj(O(t+1))
,也即状态sj
发射出符号O(t+1)的概率,因为前面已经是O1O2...Ot了。也即如下式: