Viterbi算法应用于HMM的识别问题,也称解码问题。它通过应用了动态规划的思想避免了复杂度很高的运算,为识别时效性提供了强有力的支持。这个算法并不难理解,这里只是对其一个细节进行阐述。
Viterbi算法实际上解决
P(I|O,λ)
最大化的问题,给定观测序列求其最可能对应的状态序列。算法首先需要导入两个变量
δ
和
ψ
。
δ
是在时刻t状态为i的所有单个路径
(i1,i2,...,it)
中概率的最大值:
δt(i)=maxi1,i2,...,it?1P(it=i,it?1,...,i1,ot,...,o1|λ)
由定义可得变量
δ
的递推公式:
δt+1(i)=maxi1,i2,...,itP(it+1=i,it,...,i1,ot+1,...,o1|λ)
=max1≤j≤N[δt(j)aji]bi(ot+1)
算法在设定初始值
δ1(i)=πibi(oi)
之后就不断迭代,终止情况是:
P?=max1≤j≤NδT(i)
算法的主体就是这样,那么现在问题来了。识别问题我们要解决 P(I|O,λ) 最大的问题,到这里Viterbi算法怎么成了 P(I,O|λ) ?
个人觉得,还是应为
P(I,O|λ)=P(I|O,λ)P(O|λ)
,而
P(O|λ)
相对最大化问题而言是个常数,可以省去。但是为什么要省去呢?这是因为
δt+1(i)
的迭代过程中
δt(i)
要和
aji
相乘,而
aji
是转移概率,表示为:
aji=P(it+1=qi|it=qj)
再经过齐次马尔科夫假设,可以扩展为:
aji=P(it+1=qi|it=qj,o1,o2,...,ot)
这样其才能和
δt(j)
相乘。仅此而已。