维特比算法(Viterbi Algorithm)是一种动态规划算法,用于在隐马尔可夫模型(Hidden Markov Model, HMM)中寻找最可能的隐藏状态序列(即最优路径),给定一个观察序列。维特比算法广泛应用于语音识别、自然语言处理、生物信息学等领域。
隐马尔可夫模型简介
在介绍维特比算法之前,先简单回顾一下隐马尔可夫模型(HMM)的组成部分:
- 状态集合(States): 隐藏状态的集合,通常用 𝑆={𝑠1,𝑠2,…,𝑠𝑁}S={s1,s2,…,sN} 表示。
- 观测集合(Observations): 可以观测到的输出集合,通常用 𝑉={𝑣1,𝑣2,…,𝑣𝑀}V={v1,v2,…,vM} 表示。
- 初始状态概率(Initial State Probabilities): 各个隐藏状态的初始概率,通常用 𝜋={𝜋𝑖}π={πi} 表示,其中 𝜋𝑖=𝑃(𝑠𝑖)πi=P(si)。
- 状态转移概率(State Transition Probabilities): 从一个状态转移到另一个状态的概率,通常用 𝐴={𝑎𝑖𝑗}A={aij} 表示,其中 𝑎𝑖𝑗=𝑃(𝑠𝑗∣𝑠𝑖)aij=P(sj∣si)。
- 观测概率(Observation Probabilities): 在给定状态下生成某个观测值的概率,通常用 𝐵={𝑏𝑗(𝑜𝑡)}B={bj(ot)} 表示,其中 𝑏𝑗(𝑜𝑡)=𝑃(𝑜𝑡∣𝑠𝑗)bj(ot)=P(ot∣sj)。
维特比算法步骤
维特比算法通过动态规划的方式计算最可能的隐藏状态序列。其主要步骤包括初始化、递归计算和回溯。
1. 初始化
对于每个状态 𝑠𝑖si,初始化时间 𝑡=1t=1 的维特比概率和路径:
𝛿1(𝑖)=𝜋𝑖⋅𝑏𝑖(𝑜1)δ1(i)=πi⋅bi(o1)
𝜓1(𝑖)=0ψ1(i)=0
其中 𝛿𝑡(𝑖)δt(i) 表示在时间 𝑡t 时处于状态 𝑠𝑖si 并观测到部分序列 𝑜1,𝑜2,…,𝑜𝑡o1,o2,…,ot 的最大概率,𝜓𝑡(𝑖)ψt(i) 是路径指针,用于记录路径信息。
2. 递归计算
对于时间 𝑡=2,3,…,𝑇t=2,3,…,T 和每个状态 𝑠𝑗sj,计算:
𝛿𝑡(𝑗)=max1≤𝑖≤𝑁[𝛿𝑡−1(𝑖)⋅𝑎𝑖𝑗]⋅𝑏𝑗(𝑜𝑡)δt(j)=1≤i≤Nmax[δt−1(i)⋅aij]⋅bj(ot)
𝜓𝑡(𝑗)=argmax1≤𝑖≤𝑁[𝛿𝑡−1(𝑖)⋅𝑎𝑖𝑗]ψt(j)=arg1≤i≤Nmax[δt−1(i)⋅aij]
其中 𝛿𝑡−1(𝑖)δt−1(i) 是前一个时间步处于状态 𝑠𝑖si 的最大概率, 𝑎𝑖𝑗aij 是状态转移概率, 𝑏𝑗(𝑜𝑡)bj(ot) 是在状态 𝑠𝑗sj 观测到 𝑜𝑡ot 的概率。
3. 终止
计算时间 𝑇T 时的最优路径概率和终止状态:
𝑃∗=max1≤𝑖≤𝑁𝛿𝑇(𝑖)P∗=1≤i≤NmaxδT(i)
𝑞𝑇∗=argmax1≤𝑖≤𝑁𝛿𝑇(𝑖)qT∗=arg1≤i≤NmaxδT(i)
4. 回溯
通过路径指针 𝜓ψ 回溯得到最优状态序列:
𝑞𝑡∗=𝜓𝑡+1(𝑞𝑡+1∗)对于 𝑡=𝑇−1,𝑇−2,…,1qt∗=ψt+1(qt+1∗)对于 t=T−1,T−2,…,1
示例
假设我们有一个隐马尔可夫模型,具有以下参数:
- 状态集合 𝑆={𝑠1,𝑠2}S={s1,s2}
- 观测集合 𝑉={𝑜1,𝑜2}V={o1,o2}
- 初始状态概率:𝜋={0.6,0.4}π={0.6,0.4}
- 状态转移概率矩阵:
𝐴=[0.70.30.40.6]A=[0.70.40.30.6]
- 观测概率矩阵:
𝐵=[0.50.50.40.6]B=[0.50.40.50.6]
假设观测序列 𝑂={𝑜1,𝑜2}O={o1,o2}。
初始化
𝛿1(1)=0.6⋅0.5=0.3δ1(1)=0.6⋅0.5=0.3
𝛿1(2)=0.4⋅0.4=0.16δ1(2)=0.4⋅0.4=0.16
递归计算
𝛿2(1)=max(0.3⋅0.7,0.16⋅0.4)⋅0.5=max(0.21,0.064)⋅0.5=0.21⋅0.5=0.105δ2(1)=max(0.3⋅0.7,0.16⋅0.4)⋅0.5=max(0.21,0.064)⋅0.5=0.21⋅0.5=0.105
𝜓2(1)=argmax(0.3⋅0.7,0.16⋅0.4)=1ψ2(1)=argmax(0.3⋅0.7,0.16⋅0.4)=1
𝛿2(2)=max(0.3⋅0.3,0.16⋅0.6)⋅0.6=max(0.09,0.096)⋅0.6=0.096⋅0.6=0.0576δ2(2)=max(0.3⋅0.3,0.16⋅0.6)⋅0.6=max(0.09,0.096)⋅0.6=0.096⋅0.6=0.0576
𝜓2(2)=argmax(0.3⋅0.3,0.16⋅0.6)=2ψ2(2)=argmax(0.3⋅0.3,0.16⋅0.6)=2
终止
𝑃∗=max(𝛿2(1),𝛿2(2))=max(0.105,0.0576)=0.105P∗=max(δ2(1),δ2(2))=max(0.105,0.0576)=0.105
𝑞2∗=argmax(𝛿2(1),𝛿2(2))=1q2∗=argmax(δ2(1),δ2(2))=1
回溯
𝑞1∗=𝜓2(𝑞2∗)=𝜓2(1)=1q1∗=ψ2(q2∗)=ψ2(1)=1
因此,最可能的隐藏状态序列是 {𝑠1,𝑠1}{s1,s1}。
维特比算法的优点
- 效率高: 维特比算法使用动态规划,时间复杂度为 𝑂(𝑁2𝑇)O(N2T),其中 𝑁N 是状态数,𝑇T 是观察序列的长度。
- 准确性高: 它能找到给定观察序列的最优隐藏状态序列。
维特比算法通过以上步骤有效地解决了HMM中最优路径问题,是处理序列数据的重要工具。