维特比(Viterbi)算法,近似算法序列过长导致出现0概率而使程序运行失败的处理方法

原始Viterbi算法

(1) 初始化 (初始状态向量乘以第一个观测 o1 ) :

δ1(i)=πibi(o1),i=1,2,,Nψ1(i)=0,t=1,2,,N

(2) 递推,对于 t=2,3,,T

δt(i)=max1j<N[δt1(j)aji]bi(Ot)i=1,2,,N

记录当前状态:

ψt(i)=argmax1jN[δt1(j)aji]i=1,2,,N

(3) 终止:

P=max1iNδT(i)iT=argmax1iN[δT(i)]

(4) 最优路径回溯.对于 t=T1,T2,,1

it=ψt+1(it+1)

求得的最优路径也就是最可能的状态序列为:

I=(i1,i2,,iT)

对原始Viterbi算法进行改进,在计算t时刻的局部状态δt后,对δt进行发大处理

δt=δt/max(δt)

改进Viterbi算法

(1) 初始化 (初始状态向量乘以第一个观测 o1 ) :

δ1(i)=πibi(o1),i=1,2,,Nψ1(i)=0,t=1,2,,N

对中间状态变量δt进行发大

δ1=δ1/max(δ1)

(2) 递推,对于 t=2,3,,T

δt(i)=max1j<N[δt1(j)aji]bi(Ot)i=1,2,,N

记录当前状态:

ψt(i)=argmax1jN[δt1(j)aji]i=1,2,,N

对中间状态变量δt进行发大

δt=δt/max(δt)

(3) 终止:

P=max1iNδT(i)iT=argmax1iN[δT(i)]

(4) 最优路径回溯.对于 t=T1,T2,,1

it=ψt+1(it+1)

求得的最优路径也就是最可能的状态序列为:

I=(i1,i2,,iT)

该算法下求得的最优路径与原算法求得的最优路径相同

证明:

设原算法的中间变量为δ,ψ,最优路径I,改进算法的中间变量为δ,ψ,最优路径I

t=1时:

δ1(i)=πibi(o1),i=1,2,,Nψ1(i)=0,t=1,2,,N

a=max(δ1)

δ1(i)=δ1(i)/a=δ1(i)/max(δ1)i=1,2,,N

ψ1(i)=ψ1(i)

t=2时:

δ2(i)=max1j<N[δ1(j)aji]bi(O2)i=1,2,,N

ψ2(i)=argmax1jN[δ1(j)aji]

δ2(i)=max1j<N[δ2(j)aji]bi(O2)=max1j<N[δ1(j)/max(δt)aji]bi(O2)=max1j<N[δ1(j)aji]bi(O2)/max(δ1)=δ2(i)/max(δ1)i=1,2,,N

ψ2(i)=argmax1jN[δ1(j)aji]=argmax1jN[δ1(i)/max(δ1)aji]=argmax1jN[δ1(i)aji]=ψ2(i)

a=max(δ2)=max1iN[δ2(i)/max(δ1)]=max(δ2)/max(δ1)

δ2(i)=δ2(i)/a={δ2(i)/max(δ1)}/{max(δ2)/max(δ1)}=δ2(i)/max(δ2)

同理可递推得到以下结论

δt(i)=δt(i)/max(δt)i=2,3,,N

ψt(i)=ψt(i)i=2,3,N

终止条件

P=max1iNδT(i)=max1iN[δT(i)/max(δt)]=max1iN[δT(i)]=P

iT=argmax1iN[δT(i)]=argmax1iN[δT(i)/max(δt)]=argmax1iN[δT(i)]=iT

最优路径回溯.对于 t=T1,T2,,1

it=ψt+1(it+1)=ψt+1(it+1)=it

求得的最优路径也就是最可能的状态序列为:

I=(i1,i2,,iT)=(i1,i2,,iT)=I

得证。

近似算法

前向算法

  1. 计算初值

α1(i)=πibi(o1),i=1,2,,N

  1. 递推计算 t+1 时刻,状态为 qi 的向前概率:

αt+1(i)=[j=1Nαt(j)aji]bi(ot+1),i=1,2,,N

后向算法

  1. 计算初值:

βT(i)=1,i=1,2,,N

βt(i)=j=1Naijbj(ot+1)βt+1(j),i=1,2,,N

近似算法

γt(i)=αt(i)βt(i)P(Oλ)=αt(i)βt(i)j=1Nαt(j)βt(j)

在每一时刻 t 最有可能的状态 it 是:

it=argmax1iN[γt(i)],t=1,2,,T

从而得到状态序列 I :

I=(i1,i2,,iT)

与改进Viterbi算法类似,在计算前向算法的中间状态概率αt(i)和后向算法的中间状态概率βt(i)时,对两个概率进行放大

αt(i)=αt(i)/max(αt)βt(i)=βt(i)/max(βt)

则改进近似算法中的前向和后向算法的计算流程如下:

前向算法

  1. 计算初值

α1(i)=πibi(o1),i=1,2,,N

α1(i)=α1(i)/max(α1)

  1. 向前递推

αt+1(i)=[j=1Nαt(j)aji]bi(ot+1),i=1,2,,N

αt+1(i)=αt+1(i)/max(αt+1)

后向算法

  1. 计算初值:

βT(i)=1,i=1,2,,N

βT(i)=βT(i)/max(βT)

  1. 向后递推

βt(i)=j=1Naijbj(ot+1)βt+1(j),i=1,2,,N

βt(i)=βt(i)/max(βt)

近似算法

γt(i)=αt(i)βt(i)P(Oλ)=αt(i)βt(i)j=1Nαt(j)βt(j)

在每一时刻 t 最有可能的状态 it 是:

it=argmax1iN[γt(i)],t=1,2,,T

从而得到状态序列 I :

I=(i1,i2,,iT)

改进近似算法得到的状态序列与原始算法相同

证明:

设原算法中前向算法和后向算法的中间状态概率分别为α,β,改进近似算法中前向算法和后向算法的中间状态概率分别为α,β

前向算法

t=1

α1(i)=πibi(o1),i=1,2,,N

α1(i)=α1(i)/max(α1)i=1,2,,N

t=2

α2(i)=[j=1Nα1(j)aji]bi(o2),i=1,2,,N

α2(i)=[j=1Nα1(j)aji]bi(o2)=[j=1Nα1(i)/max(α1)aji]bi(o2)=[j=1Nα1(i)aji]bi(o2)/max(α1)=α2(i)/max(α1)i=1,2,,N

a=max(α2)=max1iN[α2(i)/max(α1)]=max(α2)/max(α1)

α2(i)=α2(i)/a={α2(i)/max(α1)}/{max(α2)/max(α1)}=α2(i)/max(α2)

递推可得

αt(i)=αt(i)/max(αt)t=2,3,T

后向算法

t=T

βT(i)=1i=1,2,,N

βT(i)=βT(i)/max(βT)i=1,2,,N

t=T1

βT1(i)=j=1Naijbj(oT)βT(j),i=1,2,,N

βT1(i)=j=1Naijbj(OT)βT(j)=j=1Naijbj(OT)βT(i)/max(βT)=βT1(i)/max(βT)i=1,2,,N

a=max(βT1)=max1iN[βT1(i)/max(βT)]=max(βT1)/max(βT)

βT1(i)=βT1(i)/a={βT1(i)/max(βT)}/{max(βT1)/max(βT)}=βT1(i)/max(βT1)

递推可得

βt(i)=βt(i)/max(βt)t=1,2,T1

改进近似算法

γt(i)=αt(i)βt(i)j=1Nαt(j)βt(j)=αt(i)βt(i)/{max(αt)max(βt)}j=1Nαt(j)βt(j)/{max(αt)max(βt)}=αt(i)βt(i)j=1Nαt(j)βt(j)=γt(i)i=1,2,,N

在每一时刻 t 最有可能的状态 it 是:

it=argmax1iN[γt(i)]=argmax1iN[γt(i)]=itt=1,2,,T

从而得到状态序列 I :

I=I=(i1,i2,,iT)

得证。

posted @   久漫  阅读(172)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示