Viterbi算法

来源:互联网 发布:阿里云ecs传文件 编辑:程序博客网 时间:2024/05/16 01:54

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|λ)
=max1jN[δt(j)aji]bi(ot+1)
算法在设定初始值δ1(i)=πibi(oi)之后就不断迭代,终止情况是: 
P?=max1jNδ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)相乘。仅此而已。
0 0