最近自己会把自己个人博客中的文章陆陆续续的复制到CSDN上来,欢迎大家关注我的 个人博客,以及我的github。
本文将讲解有关隐马尔可夫模型的相关知识,主要包括隐马尔可夫模型的概念、两个基本假设、三个基本问题,以及解决这三个基本问题的前向-后向算法、Baum-Welch 算法和 Viterbi 算法等内容。
本文主要是依据李航老师的《统计学习方法》和邹博老师的机器学习教学视频总结编写的。文中所用到的有关机器学习的基本概念和方法可以参考本人博客中该系列之前的文章,或者直接上网搜索相关的内容。以下文章所列出的公式以及公式的推导读者们最好是在草稿本上自己推导一遍。由于本人水平所限,文章中难免有错误和不当之处,欢迎大家多多批评指正!
一、隐马尔可夫模型
如上图所示,隐马尔可夫模型(HMM)一个关于时序的概率模型,红色圆圈是隐藏的不可观测的序列,被称为状态序列,其中 i t i_t it 的值只取决于它的前一个状态 i t − 1 i_{t-1} it−1;绿色的矩形是可观测的序列,被称为观测序列。序列的每一个位置可以看作是一个时刻。
举个例子,在天气预报中,每天的天气情况就是 HMM 中的观测序列,而每一天对应的气压情况就是 HMM 中的状态序列,我们假设它是不可观测的,并且假设天气与气压有关。
为了后面描述的方便,下面先来引入几个定义。
设 Q 是所有可能的状态(红色圆圈)的结合,V 是所有可能的观测(绿色矩形)的集合:
Q
=
(
q
1
,
q
2
,
.
.
.
,
q
N
)
Q=(q_1,q_2,...,q_N)
Q=(q1,q2,...,qN)
V = ( v 1 , v 2 , . . . , v M ) V=(v_1,v_2,...,v_M) V=(v1,v2,...,vM)
其中 N 是可能的状态数,M 是可能的观测数。
设 I 是长度为 T 的状态序列,O 是对应的观测序列:
I
=
(
i
1
,
i
2
,
.
.
.
,
i
T
)
I=(i_1,i_2,...,i_T)
I=(i1,i2,...,iT)
O = ( o 1 , o 2 , . . . , o T ) O=(o_1,o_2,...,o_T) O=(o1,o2,...,oT)
HMM可用符号 λ \lambda λ 表示,该模型可由初始概率分布 π \pi π、状态转移概率分布 A 和观测概率分布 B 确定,即 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π)。
**(1) 初始概率分布
π
\pi
π **就是图中第一个红色圆圈
i
1
i_1
i1 取每个值的概率:
π
=
(
π
1
,
π
2
,
.
.
.
,
π
N
)
\pi=(\pi_1,\pi_2,...,\pi_N)
π=(π1,π2,...,πN)
π i = P ( i 1 = q i ) , i = 1 , 2 , . . . N \pi_i=P(i_1=q_i),\quad i=1,2,...N πi=P(i1=qi),i=1,2,...N
其中 q i q_i qi 就是上面提到过的可能的状态。
**(2) 状态转移概率分布 A **就是在时刻 t 的红色圆圈
i
t
i_t
it 的状态为
q
i
q_i
qi 的条件下,下一个时刻的红色圆圈
i
t
+
1
i_{t+1}
it+1 的状态变为
q
j
q_j
qj 的概率:
A
=
[
a
i
j
]
N
×
N
A=[a_{ij}]_{N\times N}
A=[aij]N×N
a i j = P ( i t + 1 = q j ∣ i t = q i ) a_{ij}=P(i_{t+1}=q_j|i_t=q_i) aij=P(it+1=qj∣it=qi)
**(3) 观测概率分布 B **是指在时刻 t 红色圆圈
i
t
i_t
it 的状态是
q
i
q_i
qi 的条件下,该时刻的观测值为
v
k
v_k
vk 的概率:
B
=
[
b
j
(
k
)
]
N
×
M
B=[b_j(k)]_{N\times M}
B=[bj(k)]N×M
b j ( k ) = P ( o t = v k ∣ i t = q j ) b_j(k)=P(o_t=v_k|i_t=q_j) bj(k)=P(ot=vk∣it=qj)
沿用上面天气预报的例子,在该例子中,每天的气压情况只与前一天的气压情况有关,则如果我们得知了第一天的气压情况(初始概率分布 π \pi π),又得知了每相邻两天气压的变化规律(状态转移概率分布 A)以及每天气压和天气之间的情况(观测概率分布 B),那么我们就可以预测第 T 天的天气情况了。
二、HMM 的两个基本假设和三个基本问题
1. 两个基本假设
(1) 齐次马尔科夫性假设:
假设隐藏的马尔科夫链(即图中红色圆圈形成的链条)在任意时刻 t 的状态只依赖于其前一个时刻。
(2) 观测独立假设:
假设任意时刻的观测只依赖于该时刻的马尔科夫链的状态。
2. 三个基本问题
(1) 概率计算问题:
给定模型 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π) 和观测序列 O = ( o 1 , o 2 , . . . , o T ) O=(o_1,o_2,...,o_T) O=(o1,o2,...,oT) 计算在模型 λ \lambda λ 下观测序列 O 出现的概率 P ( O ∣ λ ) P(O|\lambda) P(O∣λ)。也就是计算模型和观测序列之间的匹配程度。
(2) 学习问题:
已知观测序列 O = ( o 1 , o 2 , . . . , o T ) O=(o_1,o_2,...,o_T) O=(o1,o2,...,oT),估计模型 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π) 的参数,使得在该模型下观测序列出现的概率 P ( O ∣ λ ) P(O|\lambda) P(O∣λ) 最大。也就是如何构造一个模型去最好的拟合观测数据。
(3) 预测问题:
又称解码问题。已知模型 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π) 和观测序列 O = ( o 1 , o 2 , . . . , o T ) O=(o_1,o_2,...,o_T) O=(o1,o2,...,oT),求对给定观测序列条件下,概率 p ( I ∣ O ) p(I|O) p(I∣O) 最大的状态序列 I = ( i 1 , i 2 , . . . , i T ) I=(i_1,i_2,...,i_T) I=(i1,i2,...,iT)。也就是给定观测序列,求最有可能的对应的状态序列。
针对以上三个基本问题,对每个问题的求解都提出了一种比较高效的解决方法,下面就是来分别介绍这些算法。
三、概率计算问题
再放一遍最开始的图,以便和公式对照着看。
1. 直接计算法
要解决的问题是计算模型和观测序列之间的匹配程度 P ( O ∣ λ ) P(O|\lambda) P(O∣λ)。可以先求出在给定模型 λ \lambda λ 的前提下,生成状态序列 I 的概率 P ( I ∣ λ ) P(I|\lambda) P(I∣λ),然后再求出模型和状态序列已知的情况下,生成观测序列 O 的概率 P ( O ∣ I , λ ) P(O|I,\lambda) P(O∣I,λ)。这样就可以利用公式 P ( O , I ∣ λ ) = P ( O ∣ I , λ ) ⋅ P ( I ∣ λ ) P(O,I|\lambda)=P(O|I,\lambda)\cdot P(I|\lambda) P(O,I∣λ)=P(O∣I,λ)⋅P(I∣λ) 来计算了。其实也就是算出了 P ( O ∣ λ ) P(O|\lambda) P(O∣λ),只不过还多求出了状态序列。
但是由于对于一个已知的观测序列 O = ( o 1 , o 2 , . . . , o T ) O=(o_1,o_2,...,o_T) O=(o1,o2,...,oT) 来说,它可能是由多个不同的状态序列来生成的。先要想明白这句话是为什么。因为——每个状态 i t i_t it 都以一定的概率生成对应的观测 o t o_t ot,而每个状态 i t i_t it 又以一定的概率生成下一个状态 o t + 1 o_{t+1} ot+1。
所以可以通过枚举所有可能的长度为 T 的状态序列
I
=
(
i
1
,
i
2
,
.
.
.
,
i
T
)
I=(i_1,i_2,...,i_T)
I=(i1,i2,...,iT),然后对概率求和就可以得到最终的结果了。其公式如下:
P
(
O
∣
λ
)
=
∑
I
P
(
O
∣
I
,
λ
)
⋅
P
(
I
∣
λ
)
P(O|\lambda)=\sum_I{P(O|I,\lambda)\cdot P(I|\lambda)}
P(O∣λ)=I∑P(O∣I,λ)⋅P(I∣λ)
但是这种暴力枚举的方式时间复杂度太高了,所以人们又提出了“前向-后向算法”来解决这个问题。
2. 前向算法
前向-后向算法利用了类似于动态规划的思路来求解 P ( O ∣ λ ) P(O|\lambda) P(O∣λ),前向算法从前往后计算概率,后向算法从后往前计算概率。
首先定义前向概率:给定隐马尔可夫模型
λ
\lambda
λ,定义到时刻 t 为止的部分观测序列为
O
=
(
o
1
,
o
2
,
.
.
.
,
o
t
)
O=(o_1,o_2,...,o_t)
O=(o1,o2,...,ot),并且第 t 个时刻的状态为
q
i
q_i
qi 的概率为前向概率。记作:
α
t
(
i
)
=
P
(
o
1
,
o
2
,
.
.
.
,
o
T
,
i
t
=
q
i
∣
λ
)
\alpha_t(i)=P(o_1,o_2,...,o_T,i_t=q_i|\lambda)
αt(i)=P(o1,o2,...,oT,it=qi∣λ)
用前向概率计算
P
(
O
∣
λ
)
P(O|\lambda)
P(O∣λ) 过程如下:
(1) 初值
α
1
(
i
)
=
π
i
b
i
(
o
1
)
,
i
=
1
,
2
,
.
.
.
,
N
\alpha_1(i)=\pi_ib_{i}(o_1),\quad i=1,2,...,N
α1(i)=πibi(o1),i=1,2,...,N
α
1
(
i
)
\alpha_1(i)
α1(i) 表示第 1 个状态为
q
i
q_i
qi,到此为止观测序列为
o
1
o_1
o1 的概率。就需要先以概率
π
i
\pi_i
πi 生成状态
q
i
q_i
qi。再由该状态以概率
b
i
,
o
1
b_{i,o_1}
bi,o1 生成观测
o
1
o_1
o1 。
(2) 递推
对
t
=
1
,
2
,
.
.
.
,
T
−
1
t=1,2,...,T-1
t=1,2,...,T−1
α
t
+
1
(
i
)
=
[
∑
j
=
1
N
α
t
(
j
)
a
j
i
]
b
i
(
o
t
+
1
)
,
i
=
1
,
2
,
.
.
.
,
N
\alpha_{t+1}(i)=[\sum_{j=1}^N{\alpha_t(j)a_{ji}}]b_i(o_{t+1}),\quad i=1,2,...,N
αt+1(i)=[j=1∑Nαt(j)aji]bi(ot+1),i=1,2,...,N
在已知
α
t
(
j
)
\alpha_t(j)
αt(j),即已知到前 t 个时刻为止的观测序列为
o
1
,
o
2
,
.
.
.
,
o
t
o_1,o_2,...,o_t
o1,o2,...,ot,且第 t 时刻的状态为
q
j
q_j
qj 时,求
α
t
+
1
(
i
)
\alpha_{t+1}(i)
αt+1(i) 的概率,即求到前 t+1 个时刻为止的观测序列为
o
1
,
o
2
,
.
.
.
,
o
t
,
o
t
+
1
o_1,o_2,...,o_t,o_{t+1}
o1,o2,...,ot,ot+1,且第 t+1 时刻的状态为
q
i
q_i
qi 的概率。需要先以上的基础上,以概率
a
j
i
a_{ji}
aji 由第 j 个状态
q
j
q_j
qj 生成下一个状态
q
i
q_i
qi,然后再由以概率
b
i
,
o
t
+
1
b_{i,o_{t+1}}
bi,ot+1 由下一个状态
q
i
q_i
qi 生成对应的观测
o
t
+
1
o_{t+1}
ot+1。由于 t 时刻的状态
q
j
q_j
qj 可能有多种情况,所以还需要对 j 进行求和。
(3) 终止
P
(
O
∣
λ
)
=
∑
i
=
1
N
α
T
(
i
)
P(O|\lambda)=\sum_{i=1}^N{\alpha_T(i)}
P(O∣λ)=i=1∑NαT(i)
α
T
(
i
)
\alpha_T(i)
αT(i) 表示观测序列为
O
=
(
o
1
,
o
2
,
.
.
.
,
o
T
)
O=(o_1,o_2,...,o_T)
O=(o1,o2,...,oT),并且第 T 个时刻的状态为
q
i
q_i
qi,对所有可能的状态求和就是最终要求的
P
(
O
∣
λ
)
P(O|\lambda)
P(O∣λ)。
3. 后向算法
后向概率:给定隐马尔可夫模型
λ
\lambda
λ,定义在时刻 t 状态为
q
i
q_i
qi 的条件下,从 t+1 到 T 时刻的部分观测序列为
o
t
+
1
,
o
t
+
1
,
.
.
.
,
o
T
o_{t+1},o_{t+1},...,o_T
ot+1,ot+1,...,oT 的概率为后向概率,记作:
β
t
(
i
)
=
P
(
o
t
+
1
,
o
t
+
1
,
.
.
.
,
o
T
∣
i
t
=
q
i
,
λ
)
\beta_t(i)=P(o_{t+1},o_{t+1},...,o_T|i_t=q_i,\lambda)
βt(i)=P(ot+1,ot+1,...,oT∣it=qi,λ)
可以用与前向算法类似的方式递推得到
P
(
O
∣
λ
)
P(O|\lambda)
P(O∣λ):
(1) 初值
β
T
(
i
)
=
1
,
i
=
1
,
2
,
.
.
.
,
N
\beta_T(i)=1,\quad i=1,2,...,N
βT(i)=1,i=1,2,...,N
由于 T 是最终的时刻,不存在从 T+1 到 T 的观测序列,所以概率为 1。
(2) 递推
对于
t
=
T
−
1
,
T
−
2
,
.
.
.
,
1
t=T-1,T-2,...,1
t=T−1,T−2,...,1
β
t
(
i
)
=
∑
j
=
1
N
a
i
j
b
j
(
o
t
+
1
)
β
t
+
1
(
j
)
,
i
=
1
,
2
,
.
.
.
,
N
\beta_t(i)=\sum_{j=1}^N{a_{ij}b_{j}(o_{t+1})\beta_{t+1}(j)},\quad i=1,2,...,N
βt(i)=j=1∑Naijbj(ot+1)βt+1(j),i=1,2,...,N
先从时刻 t+1 的状态
p
j
p_j
pj 以概率
b
j
(
o
t
+
1
)
b_{j}(o_{t+1})
bj(ot+1) 的概率生成对应的观测
o
t
+
1
o_{t+1}
ot+1。而状态
p
j
p_j
pj 是由时刻 t 的状态
p
i
p_i
pi 以概率
a
i
j
a_{ij}
aij 生成的。
(3) 终止
P
(
O
∣
λ
)
=
∑
i
=
1
N
π
i
b
i
(
o
1
)
β
1
(
i
)
P(O|\lambda)=\sum_{i=1}^N{\pi_ib_{i}(o_1)\beta_1(i)}
P(O∣λ)=i=1∑Nπibi(o1)β1(i)
同理,倒着递推出最终的表达式。
4. 一些概率和期望值
下面给出某些概率和期望值的计算公式,在后面的算法中会用到其中的几个。
四、学习问题
学习问题是如何构造一个模型去最好的拟合观测数据。
如果训练数据包括观测序列和状态序列,则 HMM 的学习是监督学习;若只有观测序列,则 HMM的学习需要用 EM 算法解决,是非监督学习。
1. 监督学习方法
因为训练数据包括观测序列和状态序列,所以要求的模型的参数 a i j , b i ( j ) a_{ij},b_i(j) aij,bi(j) 和 π i \pi_i πi 都可以通过统计训练数据中它们出现的频率来近似表示。
2. Baum-Welch 算法
(1)EM 算法的 E 步:
先写出 Q 函数:
Q
(
λ
,
λ
ˉ
)
=
∑
I
log
P
(
O
,
I
∣
λ
)
P
(
O
,
I
∣
λ
ˉ
)
Q(\lambda,\bar{\lambda})=\sum_I\log P(O,I|\lambda)P(O,I|\bar\lambda)
Q(λ,λˉ)=I∑logP(O,I∣λ)P(O,I∣λˉ)
其中
λ
ˉ
\bar\lambda
λˉ 是隐马尔可夫模型参数的当前估计值,
λ
\lambda
λ 是要极大化的隐马尔可夫模型参数。
因为
P
(
O
,
I
∣
λ
)
=
π
i
1
b
i
1
(
o
1
)
a
i
1
b
i
2
(
o
2
)
.
.
.
a
i
T
−
1
i
T
b
i
T
(
o
T
)
P(O,I|\lambda)=\pi_{i_1}b_{i_1}(o_1)a_{i_1}b_{i_2}(o_2)...a_{i_{T-1}i_T}b_{i_T}(o_T)
P(O,I∣λ)=πi1bi1(o1)ai1bi2(o2)...aiT−1iTbiT(oT),所以
Q
(
λ
,
λ
ˉ
)
Q(\lambda,\bar\lambda)
Q(λ,λˉ) 可以写为:
Q
(
λ
,
λ
ˉ
)
=
∑
I
log
π
i
1
P
(
O
,
I
∣
λ
ˉ
)
+
∑
I
(
∑
t
=
1
T
−
1
log
a
i
t
,
i
t
+
1
)
P
(
O
,
I
∣
λ
ˉ
)
Q(\lambda,\bar{\lambda})=\sum_I\log\pi_{i_1} P(O,I|\bar\lambda)+\sum_I(\sum_{t=1}^{T-1}\log a_{i_t,i_{t+1}})P(O,I|\bar\lambda)
Q(λ,λˉ)=I∑logπi1P(O,I∣λˉ)+I∑(t=1∑T−1logait,it+1)P(O,I∣λˉ)
+ ∑ I ( ∑ t = 1 T log b i t ( o t ) ) P ( O , I ∣ λ ˉ ) 公 式 ( 1 ) +\sum_I(\sum_{t=1}^T\log b_{i_t}(o_t))P(O,I|\bar\lambda)\quad\quad公式(1) +I∑(t=1∑Tlogbit(ot))P(O,I∣λˉ)公式(1)
(2)EM 算法的 M 步:
这一步要极大化 Q 函数求模型的参数 A , B , π A,B,\pi A,B,π 。
公式 (1) 中的第 1 项可以写为:
∑
I
log
π
i
1
P
(
O
,
I
∣
λ
ˉ
)
=
∑
i
=
1
N
log
π
i
P
(
O
,
i
1
=
i
∣
λ
ˉ
)
\sum_I\log\pi_{i_1} P(O,I|\bar\lambda)=\sum_{i=1}^N\log\pi_{i} P(O,i_1=i|\bar\lambda)
I∑logπi1P(O,I∣λˉ)=i=1∑NlogπiP(O,i1=i∣λˉ)
因为上式满足约束条件
∑
i
=
1
N
π
i
=
1
\sum_{i=1}^N{\pi_i=1}
∑i=1Nπi=1,利用拉格朗日乘子法得拉氏函数为:
L
=
∑
i
=
1
N
log
π
i
P
(
O
,
i
1
=
i
∣
λ
ˉ
)
+
γ
(
∑
i
=
1
N
π
i
−
1
)
L=\sum_{i=1}^N\log\pi_{i} P(O,i_1=i|\bar\lambda)+\gamma(\sum_{i=1}^N{\pi_i-1})
L=i=1∑NlogπiP(O,i1=i∣λˉ)+γ(i=1∑Nπi−1)
拉氏函数对
π
i
\pi_i
πi 求偏导,并令结果为 0 得:
P
(
O
,
i
1
=
i
∣
λ
ˉ
)
+
γ
π
i
=
0
公
式
(
2
)
P(O,i_1=i|\bar\lambda)+\gamma\pi_i=0\quad\quad公式(2)
P(O,i1=i∣λˉ)+γπi=0公式(2)
上式在求导后的原式的基础上两边同乘了
π
i
\pi_i
πi。上式对 i 求和得:
γ
=
−
P
(
O
∣
λ
ˉ
)
\gamma=-P(O|\bar\lambda)
γ=−P(O∣λˉ)
将其带入公式 (2) 得:
π
i
=
P
(
O
,
i
1
=
i
∣
λ
ˉ
)
P
(
O
∣
λ
ˉ
)
\pi_i=\frac{P(O,i_1=i|\bar\lambda)}{P(O|\bar\lambda)}
πi=P(O∣λˉ)P(O,i1=i∣λˉ)
同理公式 (1) 的第 2 项的约束条件为
∑
j
=
1
N
a
i
j
=
1
\sum_{j=1}^Na_{ij}=1
∑j=1Naij=1,第 3 项的约束条件为
∑
k
=
1
M
b
j
(
k
)
=
1
\sum_{k=1}^Mb_j(k)=1
∑k=1Mbj(k)=1,可以分别得:
a
i
j
=
∑
t
=
1
T
−
1
P
(
O
,
i
t
=
i
,
i
t
+
1
=
j
∣
λ
ˉ
)
∑
t
=
1
T
−
1
P
(
O
,
i
t
=
i
∣
λ
ˉ
)
a_{ij}=\frac{\sum_{t=1}^{T-1}P(O,i_t=i,i_{t+1=j}|\bar\lambda)}{\sum_{t=1}^{T-1}P(O,i_t=i|\bar\lambda)}
aij=∑t=1T−1P(O,it=i∣λˉ)∑t=1T−1P(O,it=i,it+1=j∣λˉ)
b j ( k ) = ∑ t = 1 T P ( O , i t = j ∣ λ ˉ ) I ( o t = v k ) ∑ t = 1 T P ( O , i t = j ∣ λ ˉ ) b_j(k)=\frac{\sum_{t=1}^TP(O,i_t=j|\bar\lambda)I(o_t=v_k)}{\sum_{t=1}^TP(O,i_t=j|\bar\lambda)} bj(k)=∑t=1TP(O,it=j∣λˉ)∑t=1TP(O,it=j∣λˉ)I(ot=vk)
而以上三个式子利用第三部分第4小节中的公式 (10.24) 和公式 (10.26) 就可以计算。
五、预测问题
预测问题是给定观测序列,求最有可能的对应的状态序列。解决预测问题有两个方法,一个是近似算法,另一个是维特比算法。
1. 近似算法
近似算法的思想是分别求出每个时刻最有可能的状态,把它们形成的状态序列作为预测结果。但是不能保证这种由局部最优解组合得到的状态序列就是全局最优解。
给定隐马尔可夫模型 λ \lambda λ 和观测序列 O,在时刻 t 出于状态 q i q_i qi 的概率 γ t ( i ) \gamma_t(i) γt(i) 可以由公式 (10.24) 计算得到。然后对每个时刻的状态求最大值,就得到了当前时刻最有可能的状态。
2. 维特比算法
维特比算法的本质是利用动态规划算法求解概率最优路径 I ∗ = ( i 1 ∗ , i 2 ∗ , . . . , i T ∗ ) I^*=(i_1^*,i_2^*,...,i_T^*) I∗=(i1∗,i2∗,...,iT∗),一条路径对应着一个状态序列。
最优路径有这样的特性:如果最优路径在时刻 t 的状态为 i t ∗ i_t^* it∗,那么从 i t ∗ i_t^* it∗ 到终点 i T ∗ i_T^* iT∗ (时刻 T 的状态)的这部分序列,对于任意的从时刻 t 到时刻 T 的状态序列来说都是最优的。不然就可以将其替换得到更优的序列。
所以可以先求得最优路径的终点 i T ∗ i_T^* iT∗,然后从后往前递推的得到状态节点 i T − 1 ∗ , i T − 2 ∗ , . . . , i 1 ∗ i_{T-1}^*,i_{T-2}^*,...,i_1^* iT−1∗,iT−2∗,...,i1∗,从而得到最优的路径 I ∗ = ( i 1 ∗ , i 2 ∗ , . . . , i T ∗ ) I^*=(i_1^*,i_2^*,...,i_T^*) I∗=(i1∗,i2∗,...,iT∗)。
首先引入两个变量
δ
\delta
δ 和
ψ
\psi
ψ。定义在时刻 t 状态为 i 的所有单个路径
(
i
1
,
i
2
,
.
.
.
,
i
t
)
(i_1,i_2,...,i_t)
(i1,i2,...,it) 中概率最大值为:
δ
t
(
i
)
=
max
i
1
,
i
2
,
.
.
.
,
i
t
−
1
P
(
i
t
=
i
,
i
t
−
1
,
.
.
.
,
i
1
,
o
t
,
.
.
.
,
o
1
∣
λ
)
\delta_t(i)=\max_{i_1,i_2,...,i_{t-1}}P(i_t=i,i_{t-1},...,i_1,o_t,...,o_1|\lambda)
δt(i)=i1,i2,...,it−1maxP(it=i,it−1,...,i1,ot,...,o1∣λ)
其递推式为:
δ
t
+
1
(
i
)
=
max
i
1
,
i
2
,
.
.
.
,
i
t
P
(
i
t
+
1
=
i
,
i
t
,
.
.
.
,
i
1
,
o
t
+
1
,
.
.
.
,
o
1
∣
λ
)
\delta_{t+1}(i)=\max_{i_1,i_2,...,i_t}P(i_{t+1}=i,i_t,...,i_1,o_{t+1},...,o_1|\lambda)
δt+1(i)=i1,i2,...,itmaxP(it+1=i,it,...,i1,ot+1,...,o1∣λ)
= max 1 ≤ j ≤ N [ δ t ( j ) a j i ] b i ( o t + 1 ) =\max_{1\leq j\leq N}[\delta_t(j)a_{ji}]b_i(o_{t+1}) =1≤j≤Nmax[δt(j)aji]bi(ot+1)
定义在时刻 t 状态为 i 的所有单个路径
(
i
1
,
i
2
,
.
.
.
,
i
t
−
1
,
i
)
(i_1,i_2,...,i_{t-1},i)
(i1,i2,...,it−1,i) 中概率最大的路径的第 t-1 个节点为:
ψ
t
(
i
)
=
arg
max
1
≤
j
≤
N
[
δ
t
−
1
(
j
)
a
j
i
]
\psi_t(i)=\arg\max_{1\leq j\leq N}[\delta_{t-1}(j)a_{ji}]
ψt(i)=arg1≤j≤Nmax[δt−1(j)aji]
维特比算法
(1) 初始化
δ
1
(
i
)
=
π
i
b
i
(
o
1
)
\delta_1(i)=\pi_ib_i(o_1)
δ1(i)=πibi(o1)
ψ 1 ( i ) = 0 \psi_1(i)=0 ψ1(i)=0
(2) 递推
对于
t
=
2
,
3
,
.
.
.
,
T
t=2,3,...,T
t=2,3,...,T,有
δ
t
(
i
)
=
=
max
1
≤
j
≤
N
[
δ
t
−
1
(
j
)
a
j
i
]
b
i
(
o
t
)
\delta_t(i)==\max_{1\leq j\leq N}[\delta_{t-1}(j)a_{ji}]b_i(o_t)
δt(i)==1≤j≤Nmax[δt−1(j)aji]bi(ot)
ψ t ( i ) = arg max 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] \psi_t(i)=\arg\max_{1\leq j\leq N}[\delta_{t-1}(j)a_{ji}] ψt(i)=arg1≤j≤Nmax[δt−1(j)aji]
(3) 终止
P
∗
=
max
1
≤
i
≤
N
δ
T
(
i
)
P^*=\max_{1\leq i\leq N}\delta_T(i)
P∗=1≤i≤NmaxδT(i)
i T ∗ = arg max 1 ≤ i ≤ N [ δ T ( i ) ] i_T^*=\arg\max_{1\leq i\leq N}[\delta_T(i)] iT∗=arg1≤i≤Nmax[δT(i)]
(4) 最优路径回溯
对于
t
=
T
−
1
,
T
−
2
,
.
.
.
,
1
t=T-1,T-2,...,1
t=T−1,T−2,...,1,有
i
t
∗
=
ψ
t
+
1
(
i
t
+
1
∗
)
i_t^*=\psi_{t+1}(i_{t+1}^*)
it∗=ψt+1(it+1∗)
至此,得到最优路径(序列)
I
∗
=
(
i
1
∗
,
i
2
∗
,
.
.
.
,
i
T
∗
)
I^*=(i_1^*,i_2^*,...,i_T^*)
I∗=(i1∗,i2∗,...,iT∗)。