由于隐马尔可夫模型预测问题的两个算法,维特比算法和近似算法在处理过长序列时会出现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)=max1≤j<N[δt−1(j)aji]bi(Ot)i=1,2,…,N
记录当前状态:
ψt(i)=argmax1⩽j⩽N[δt−1(j)aji]i=1,2,…,N
(3) 终止:
P∗=max1⩽i⩽NδT(i)i∗T=argmax1≤i≤N[δT(i)]
(4) 最优路径回溯.对于 t=T−1,T−2,⋯,1
i∗t=ψt+1(i∗t+1)
求得的最优路径也就是最可能的状态序列为:
I∗=(i∗1,i∗2,⋯,i∗T)
对原始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)=max1≤j<N[δt−1(j)aji]bi(Ot)i=1,2,…,N
记录当前状态:
ψt(i)=argmax1⩽j⩽N[δt−1(j)aji]i=1,2,…,N
对中间状态变量δt进行发大
δt=δt/max(δt)
(3) 终止:
P∗=max1⩽i⩽NδT(i)i∗T=argmax1≤i≤N[δT(i)]
(4) 最优路径回溯.对于 t=T−1,T−2,⋯,1
i∗t=ψt+1(i∗t+1)
求得的最优路径也就是最可能的状态序列为:
I∗=(i∗1,i∗2,⋯,i∗T)
该算法下求得的最优路径与原算法求得的最优路径相同。
证明:
设原算法的中间变量为δ,ψ,最优路径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)=max1≤j<N[δ1(j)aji]bi(O2)i=1,2,…,N
ψ2(i)=argmax1⩽j⩽N[δ1(j)aji]
δ′2(i)=max1≤j<N[δ′2(j)aji]bi(O2)=max1≤j<N[δ1(j)/max(δt)aji]bi(O2)=max1≤j<N[δ1(j)aji]bi(O2)/max(δ1)=δ2(i)/max(δ1)i=1,2,…,N
ψ′2(i)=argmax1⩽j⩽N[δ′1(j)aji]=argmax1⩽j⩽N[δ1(i)/max(δ1)aji]=argmax1⩽j⩽N[δ1(i)aji]=ψ2(i)
令
a=max(δ′2)=max1≤i≤N[δ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∗′=max1⩽i⩽Nδ′T(i)=max1≤i≤N[δT(i)/max(δt)]=max1≤i≤N[δT(i)]=P∗
i∗′T=argmax1≤i≤N[δ′T(i)]=argmax1≤i≤N[δT(i)/max(δt)]=argmax1≤i≤N[δT(i)]=i∗T
最优路径回溯.对于 t=T−1,T−2,⋯,1
i∗′t=ψ′t+1(i∗′t+1)=ψt+1(i∗t+1)=i∗t
求得的最优路径也就是最可能的状态序列为:
I∗′=(i∗′1,i∗′2,⋯,i∗′T)=(i∗1,i∗2,⋯,i∗T)=I∗
得证。
近似算法
前向算法
- 计算初值
α1(i)=πibi(o1),i=1,2,⋯,N
- 递推计算 t+1 时刻,状态为 qi 的向前概率:
αt+1(i)=[N∑j=1αt(j)aji]bi(ot+1),i=1,2,⋯,N
后向算法
- 计算初值:
βT(i)=1,i=1,2,⋯,N
βt(i)=N∑j=1aijbj(ot+1)βt+1(j),i=1,2,⋯,N
近似算法
γt(i)=αt(i)βt(i)P(O∣λ)=αt(i)βt(i)∑Nj=1αt(j)βt(j)
在每一时刻 t 最有可能的状态 i∗t 是:
i∗t=argmax1⩽i⩽N[γt(i)],t=1,2,⋯,T
从而得到状态序列 I∗ :
I∗=(i∗1,i∗2,⋯,i∗T)
与改进Viterbi算法类似,在计算前向算法的中间状态概率αt(i)和后向算法的中间状态概率βt(i)时,对两个概率进行放大
αt(i)=αt(i)/max(αt)βt(i)=βt(i)/max(βt)
则改进近似算法中的前向和后向算法的计算流程如下:
前向算法
- 计算初值
α1(i)=πibi(o1),i=1,2,⋯,N
α1(i)=α1(i)/max(α1)
- 向前递推
αt+1(i)=[N∑j=1αt(j)aji]bi(ot+1),i=1,2,⋯,N
αt+1(i)=αt+1(i)/max(αt+1)
后向算法
- 计算初值:
βT(i)=1,i=1,2,⋯,N
βT(i)=βT(i)/max(βT)
- 向后递推
βt(i)=N∑j=1aijbj(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)∑Nj=1αt(j)βt(j)
在每一时刻 t 最有可能的状态 i∗t 是:
i∗t=argmax1⩽i⩽N[γt(i)],t=1,2,⋯,T
从而得到状态序列 I∗ :
I∗=(i∗1,i∗2,⋯,i∗T)
改进近似算法得到的状态序列与原始算法相同
证明:
设原算法中前向算法和后向算法的中间状态概率分别为α,β,改进近似算法中前向算法和后向算法的中间状态概率分别为α′,β′
前向算法
t=1时
α1(i)=πibi(o1),i=1,2,⋯,N
α′1(i)=α1(i)/max(α1)i=1,2,⋯,N
t=2时
α2(i)=[N∑j=1α1(j)aji]bi(o2),i=1,2,⋯,N
α′2(i)=[∑Nj=1α′1(j)aji]bi(o2)=[∑Nj=1α1(i)/max(α1)aji]bi(o2)=[∑Nj=1α1(i)aji]bi(o2)/max(α1)=α2(i)/max(α1)i=1,2,⋯,N
令
a=max(α′2)=max1≤i≤N[α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=T−1时
βT−1(i)=N∑j=1aijbj(oT)βT(j),i=1,2,⋯,N
β′T−1(i)=∑Nj=1aijbj(OT)β′T(j)=∑Nj=1aijbj(OT)βT(i)/max(βT)=β′T−1(i)/max(βT)i=1,2,⋯,N
令
a=max(β′T−1)=max1≤i≤N[βT−1(i)/max(βT)]=max(βT−1)/max(βT)
则
β′T−1(i)=β′T−1(i)/a={βT−1(i)/max(βT)}/{max(βT−1)/max(βT)}=βT−1(i)/max(βT−1)
递推可得
β′t(i)=βt(i)/max(βt)t=1,2,⋯T−1
改进近似算法
γ′t(i)=α′t(i)β′t(i)∑Nj=1α′t(j)β′t(j)=αt(i)βt(i)/{max(αt)max(βt)}∑Nj=1αt(j)βt(j)/{max(αt)max(βt)}=αt(i)βt(i)∑Nj=1αt(j)βt(j)=γt(i)i=1,2,⋯,N
在每一时刻 t 最有可能的状态 i∗t 是:
i∗′t=argmax1⩽i⩽N[γ′t(i)]=argmax1⩽i⩽N[γt(i)]=i∗tt=1,2,⋯,T
从而得到状态序列 I∗′ :
I∗′=I∗=(i∗1,i∗2,⋯,i∗T)
得证。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人