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)相乘。仅此而已。