前向变量的归纳关系图如下,其实也就是我上一段讲的东西:
t时刻已经输出到Ot了,然后先让所有可能的状态转移到状态sj
,然后再让sj
发射出符号O(t+1)。
由此我们得到了前向算法,首先依照初始状态概率分布和初始输出符号O1对状态进行初始化,然后依照递推公式计算出所有的αT(i)
,将其求和即得到P(O|µ)。
前向算法的时间复杂度为O(T*N^2),N^2是两层相乘,T是层数。
求解P(O|µ),除了前向算法之外,相应的,我们还要提出一个后向算法。
对应于前向变量,我们定义一个后向变量βt(i)
,βt(i)
是在给定模型µ,并且t时刻状态为si
的条件下,HMM输出观察序列O(t+1)O(t+2)...OT的概率。这里和前向变量有一个明显的不同,对于前向变量,条件只有模型µ,说的是『输出O1O2...OT,且状态为si
的概率』,而后向变量说的是『状态为si
的条件下,输出O(t+1)O(t+2)...OT的概率』,条件除了µ之外,状态si
也成了前提条件。后向变量表达式如下:
我们思考一下怎么用后向变量表示P(O|µ),看着后向变量的表达式,我们考虑,如果t=1呢?那么后向变量βt(i)
就成了初始状态为si
然后输出后续观察序列为O2O3...OT的概率了,那还缺什么?缺两部分,一个是初始状态,而且我们要考虑所有可能的si
初始状态,第二个就是我们还缺观察序列的第一个符号,也就是O1,那么我们只要让s1
输出O1
就可以了,也即我们用后向变量表示出了P(O|µ),如下式:
∑求和考虑了所有的初始状态,然后πi给出了任意初始状态的出现概率,然后后面bi(O1)
是该初始状态发射出观察符号O1的概率。
对照前向算法,我们还缺后向变量的递推公式,我们想一下t+1时刻的后向变量和t时刻的后向变量的关系,因为最后我们需要的是β1(i)
,所以我们的递推公式应该是由β(t+1)(j)
得到β(t)(i)
,β(t)(i)
是状态为si
下,后续输出为O(t+1)O(t+2)...OT,β(t+1)(j)
是状态为sj
下,后续状态为O(t+2)O(t+3)...OT的概率。我们考虑一下由β(t+1)(j)
到β(t)(i)
需要什么,首先我们缺一个输出符号O(t+1),这个输出符号正是由t+1时刻的状态sj
输出的,所以我们需要乘以一个bj(O(t+1))
,然后我们的状态不对,我们需要由状态sj
转移到si
,所以需要乘以aij
,而且t时刻对应状态si
下,t+1
时刻对应的状态sj
是任意的,所以我们需要∑求和。
我们参考一下后向变量的归纳关系图,和我上一段讲的是一个意思:
t+1时刻后面的O(t+2)已经有了,缺O(t+1),我们就让所有可能的sj
都去生成O(t+1),然后再让这些sj
都转化成β(t)(i)
里面的那个si
。
由此我们得到了后向算法,首先初始化βT(i)
=1,然后根据递推公式计算出β1(i)
,最后按照前面的公式通过β1(i)
计算出P(O|µ)。
然后其实更一般的,我们可以采用前向算法和后向算法相结合的方法来计算P(O|µ):