隐马尔可夫模型
0. 马尔可夫模型介绍
1. 隐马尔可夫模型的基本概念
隐马尔可夫模型(hidden Markov model,HMM)是可用于标注问题的统计学习模型,描述隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型。在语音识别、自然语言处理、生物信息、模式识别等领域有广泛应用。
1.1 隐马尔可夫模型的定义
**定义:**隐马尔可夫模型是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测从而产生观测随机序列的过程。隐藏的马尔可夫链随机生成的状态的序列,称为状态序列(state sequence);每个状态生成一个观测,而由此产生的观测的随机序列,称为观测序列(observation sequence)。序列的每个位置又可以看作是一个时刻。
定义很概括很抽象,可以结合之后的例子进行理解。
1.2 符号说明:
- 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}是所有可能的观测的集合;
- I = ( i 1 , i 2 , . . . , i T ) I=(i_1,i_2,...,i_T) I=(i1,i2,...,iT)是长度为T的状态序列;
- O = ( o 1 , o 2 , . . . , o T ) O=(o_1,o_2,...,o_T) O=(o1,o2,...,oT)是对应I的观测序列;
- A = [ a i j ] N × N A=[a_{ij}]_{N×N} A=[aij]N×N是状态转移概率矩阵,其中 a i j = P ( i t + 1 = q j ∣ i t = q i ) , i = 1 , 2 , . . . , N ; j = 1 , 2 , . . . , N a_{ij}=P(i_{t+1}=q_j|i_t=q_i),i=1,2,...,N;j=1,2,...,N aij=P(it+1=qj∣it=qi),i=1,2,...,N;j=1,2,...,N表示在时刻t时,从状态 q i q_i qi转移到时刻t+1的状态 q j q_j qj的概率。
- B = [ b j ( k ) ] N × M B=[b_j(k)]_{N×M} B=[bj(k)]N×M是观测概率矩阵,其中 b j ( k ) = P ( o t = v k ∣ i t = q j ) , k = 1 , 2 , . . . , M ; j = 1 , 2 , . . . , N b_j(k)=P(o_t=v_k|i_t=q_j),k=1,2,...,M;j=1,2,...,N bj(k)=P(ot=vk∣it=qj),k=1,2,...,M;j=1,2,...,N表示在t时刻处于状态 q j q_j qj的条件下,生成观测量 v k v_k vk的概率。
- π \pi π是初始状态概率向量: π = ( π i ) \pi=(\pi_i) π=(πi),其中 π i = P ( i 1 = q i ) , i = 1 , 2 , . . . , N \pi_i=P(i_1=q_i),i=1,2,...,N πi=P(i1=qi),i=1,2,...,N是时刻t=1处于状态 q i q_i qi的概率。
隐马尔可夫模型可以由
π
,
A
\pi,A
π,A决定状态序列,B决定观测序列,三者称为隐马尔可夫三要素。所以,隐马尔可夫模型的参数可以用如下方式表示:
λ
=
(
A
,
B
,
π
)
\lambda=(A,B,\pi)
λ=(A,B,π)
1.3 隐马尔可夫模型的前提假设
1).齐次马尔可夫性假设:隐藏的马尔可夫链在任意时刻t的状态只依赖于其前一时刻的状态,与其他时刻的状态及观测无关,也与时刻t无关:
P
(
i
t
∣
i
t
−
1
,
o
t
−
1
,
.
.
.
,
i
1
,
o
1
)
=
P
(
i
t
∣
i
t
−
1
)
,
t
=
1
,
2
,
.
.
.
,
T
P(i_t|i_{t-1},o_{t-1},...,i_1,o_1)=P(i_t|i_{t-1}),t=1,2,...,T
P(it∣it−1,ot−1,...,i1,o1)=P(it∣it−1),t=1,2,...,T
2).观测独立性:假设任意时刻的观测只依赖于该时刻的马尔可夫链的状态,与其他观测及状态无关:
P
(
o
t
∣
i
T
,
o
T
,
i
T
−
1
,
o
T
−
1
,
.
.
.
,
i
t
+
1
,
o
t
+
1
,
i
t
,
i
t
−
1
,
o
t
−
1
,
.
.
.
,
i
1
,
o
1
=
P
(
o
t
∣
i
t
)
P(o_t|i_T,o_T,i_{T-1},o_{T-1},...,i_{t+1},o_{t+1},i_t,i_{t-1},o_{t-1},...,i_1,o_1=P(o_t|i_t)
P(ot∣iT,oT,iT−1,oT−1,...,it+1,ot+1,it,it−1,ot−1,...,i1,o1=P(ot∣it)
1.4 隐马尔科夫模型的示例
已知:
盒子编号 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
红球数 | 5 | 3 | 6 | 8 |
白球数 | 5 | 7 | 4 | 2 |
按照下述方式抽球,产生一个描述每次抽球颜色的观测序列:
1).开始,从4个盒子中以等概率随机选取1个盒子,从这个盒子里随机抽出1个球,记录其颜色然后放回;
2).然后,从当前盒子随机转移到下一个盒子,规则是:如果当前盒子是盒1,那么下一个盒子一定是盒2;如果当前盒子是盒2或3,那么分别以0.4和0.6的概率转移到左边或右边的盒子;如果当前是盒4,那么各以0.5的概率留在盒4或转移到盒3;
3).确定转移的盒子后,再从该盒子里抽球,记录颜色后放回;
4).重复5次上述过程,得到观测序列:
O
=
(
红
,
红
,
白
,
白
,
红
)
O=(红,红,白,白,红)
O=(红,红,白,白,红)
在上述问题中,隐马尔可夫模型的状态集合为:
Q
=
{
盒
1
,
盒
2
,
盒
3
,
盒
4
}
,
N
=
4
Q=\{盒1,盒2,盒3,盒4\},N=4
Q={盒1,盒2,盒3,盒4},N=4
观测集合是:
V
=
{
红
,
白
}
,
M
=
2
V=\{红,白\},M=2
V={红,白},M=2
状态序列盒观测序列的长度均为T=5;
初始概率分布为:
π
=
(
0.25
,
0.25
,
0.25
,
0.25
)
T
\pi=(0.25,0.25,0.25,0.25)^T
π=(0.25,0.25,0.25,0.25)T
状态转移概率分布为:
A
=
[
0
1
0
0
0.4
0
0.6
0
0
0.4
0
0.6
0
0
0.5
0.5
]
A= \begin{bmatrix} 0& 1& 0& 0\\ 0.4 &0 &0.6 &0\\ 0 &0.4 &0 &0.6\\ 0 &0 &0.5 &0.5\\ \end{bmatrix}
A=⎣⎢⎢⎡00.400100.4000.600.5000.60.5⎦⎥⎥⎤
观测概率分布为:
B
=
[
0.5
0.5
0.3
0.7
0.6
0.4
0.8
0.2
]
B= \begin{bmatrix} 0.5&0.5\\ 0.3& 0.7\\ 0.6& 0.4\\ 0.8& 0.2\\ \end{bmatrix}
B=⎣⎢⎢⎡0.50.30.60.80.50.70.40.2⎦⎥⎥⎤
所以,根据上述分析可以得到,该案例中观测序列的生成过程为:
1).按照初始状态分布
π
\pi
π产生状态
i
1
i_1
i1;
2).令t=1;
3).按照状态
i
t
i_t
it的观测概率分布
b
i
t
(
k
)
b_{i_t}(k)
bit(k)生成
o
t
o_t
ot;
4).按照状态
i
t
i_t
it的状态转移概率分布
{
a
i
t
i
t
+
1
}
\{a_{i_ti_{t+1}}\}
{aitit+1}产生状态
i
t
+
1
,
i
t
+
1
=
1
,
2
,
.
.
.
,
N
i_{t+1},i_{t+1}=1,2,...,N
it+1,it+1=1,2,...,N;
5).令t=t+1,如果t<T,重复上述步骤3,4,否则终止。
1.5 隐马尔可夫模型的3个基本问题
研究隐马尔可夫模型通常有三个基本问题:
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)。即给定观测序列,求最有可能的对应状态序列。
2.概率计算问题算法
理论上,要解决隐马尔可夫的概率计算问题,直接根据已知条件 λ = ( 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)直接计算就可以得到。但是,这种做法实际上并不可行,因为算法时间复杂度是 O ( T N T ) O(TN^T) O(TNT),在数据量较大的情况下是不行的。所以,通常使用下述算法进行计算:前向-后向算法。
2.1 前向算法
前向概率的定义:给定隐马尔可夫模型
λ
\lambda
λ,定义到时刻t的部分观测序列为
o
1
,
o
2
,
.
.
.
,
o
t
o_1,o_2,...,o_t
o1,o2,...,ot且状态为
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∣λ)
可以用递推法求前向概率
α
t
(
i
)
\alpha_t(i)
αt(i)和观测序列概率
P
(
O
∣
λ
)
P(O|\lambda)
P(O∣λ):
- 输入:隐马尔可夫模型参数 λ \lambda λ和观测序列O;
- 输出:观测序列概率
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),i=1,2,...,N α1(i)=πibi(o1),i=1,2,...,N
2). 递推公式进行递推,对$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)=\bigg[\sum_{j=1}^N \alpha_t(j)a_{ji}\bigg]b_i(o_{t+1}),i=1,2,...,N αt+1(i)=[j=1∑Nαt(j)aji]bi(ot+1),i=1,2,...,N
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)
说明:
1).前向概率的初值就是模型分别处于各个状态 q i q_i qi下,观测到 o 1 o_1 o1的概率;
2).递推公式表达的就是,对应状态 q i q_i qi的第t+1刻的前向概率是,第t刻的所有前向概率分别从自己的状态 q j q_j qj转移到状态 q i q_i qi的概率之和,再乘以由第t+1刻的状态 q i q_i qi观测到 o t + 1 o_{t+1} ot+1的概率,如下图:
3).第三步是因为 α 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∣λ,表示观测到序列 o 1 , o 2 , . . . , o T o_1,o_2,...,o_T o1,o2,...,oT的最后一项 o T o_T oT是由状态 i T = q i i_T=q_i iT=qi状态观测得到的概率。所以将每种状态的概率相加就有 P ( O ∣ λ ) = ∑ i = 1 N α T ( i ) P(O|\lambda)=\sum_{i=1}^N \alpha_T(i) P(O∣λ)=∑i=1NαT(i)。
4).易知,上述算法的时间复杂度为 O ( N 2 T ) O(N^2T) O(N2T),相比于直接计算的指数级复杂度,已经属于可接受范围内。
案例可以参见李航老师的《统计学习方法》教材,由于上述递推过程理解难度不大,故不附上案例。
2.2 后向算法
后向概率的定义:给定隐马尔可夫模型
λ
\lambda
λ,定义在时刻t且状态为
q
i
q_i
qi的条件下,从t+1到T的部分观测序列为
o
t
+
1
,
o
t
+
2
,
.
.
.
,
o
T
o_{t+1},o_{t+2},...,o_T
ot+1,ot+2,...,oT的概率为后向概率,记作:
β
t
(
i
)
=
P
(
o
t
+
1
,
o
t
+
2
,
.
.
.
,
o
T
∣
i
t
=
q
i
,
λ
)
\beta_t(i)=P(o_{t+1},o_{t+2},...,o_T|i_t=q_i,\lambda)
βt(i)=P(ot+1,ot+2,...,oT∣it=qi,λ)
可以用递推法求后向概率
β
t
(
i
)
\beta_t(i)
βt(i)和观测序列概率
P
(
O
∣
λ
)
P(O|\lambda)
P(O∣λ):
- 输入:隐马尔可夫模型参数 λ \lambda λ和观测序列O;
- 输出:观测序列概率
P
(
O
∣
λ
)
P(O|\lambda)
P(O∣λ);
1). 计算前向概率的初值:
β T ( i ) = 1 , i = 1 , 2 , . . . , N \beta_T(i)=1,i=1,2,...,N βT(i)=1,i=1,2,...,N
2). 递推公式进行递推,对$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),i=1,2,...,N βt(i)=j=1∑Naijbj(ot+1)βt+1(j),i=1,2,...,N
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)
说明:
1).后向概率的初值是人为规定的;
2).递推公式表达的就是,从后向前递推, β t ( i ) \beta_t(i) βt(i)其实就是在t+1时刻的后向概率情况下,增加上从第t时刻的 q i q_i qi状态分别转移到第t+1时刻的 q j q_j qj状态,并观测到 o t + 1 o_{t+1} ot+1的概率,如下图:
3).第三步是因为 P ( O ∣ λ ) = β 0 ( i ) P(O|\lambda)=\beta_0(i) P(O∣λ)=β0(i)。所以将每种状态的0时刻后向概率相加就有 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=1Nπibi(o1)β1(i)。
4).易知,上述算法的时间复杂度为 O ( N 2 T ) O(N^2T) O(N2T),相比于直接计算的指数级复杂度,已经属于可接受范围内。
2.3 一些概率与期望值的计算
1).给定模型
λ
\lambda
λ和观测O,在t时刻处于状态
q
i
q_i
qi的概率记为:
γ
t
(
i
)
=
P
(
i
t
=
q
i
∣
O
,
λ
)
\gamma_t(i)=P(i_t=q_i|O,\lambda)
γt(i)=P(it=qi∣O,λ)
该概率可以通过前向后向概率计算:
γ
t
(
i
)
=
P
(
i
t
=
q
i
∣
O
,
λ
)
=
P
(
i
t
=
q
i
,
)
∣
λ
P
(
O
∣
λ
)
=
α
t
(
i
)
β
t
(
i
)
P
(
O
∣
λ
)
=
α
t
(
i
)
β
t
(
i
)
∑
j
=
1
N
α
t
(
j
)
β
t
(
j
)
\gamma_t(i)=P(i_t=q_i|O,\lambda)=\frac{P(i_t=q_i,)|\lambda}{P(O|\lambda)}=\frac{\alpha_t(i)\beta_t(i)}{P(O|\lambda)}=\frac{\alpha_t(i)\beta_t(i)}{\sum_{j=1}^N \alpha_t(j)\beta_t(j)}
γt(i)=P(it=qi∣O,λ)=P(O∣λ)P(it=qi,)∣λ=P(O∣λ)αt(i)βt(i)=∑j=1Nαt(j)βt(j)αt(i)βt(i)
其中,根据前向概率和后向概率的定义可知,
α
t
(
i
)
β
t
(
i
)
=
P
(
i
t
=
q
i
,
O
∣
λ
)
\alpha_t(i)\beta_t(i)=P(i_t=q_i,O|\lambda)
αt(i)βt(i)=P(it=qi,O∣λ),且
P
(
O
∣
λ
)
=
∑
i
=
1
N
P
(
i
t
=
q
i
,
O
∣
λ
)
P(O|\lambda)=\sum_{i=1}^N P(i_t=q_i,O|\lambda)
P(O∣λ)=∑i=1NP(it=qi,O∣λ),从而可以进行上述推导。
2).给定模型
λ
\lambda
λ和观测O,在t时刻处于状态
q
i
q_i
qi且在t+1时刻处于状态
q
j
q_j
qj的概率记为:
ϵ
t
(
i
,
j
)
=
P
(
i
t
=
q
i
,
i
t
+
1
=
q
j
∣
O
,
λ
)
\epsilon_t(i,j)=P(i_t=q_i,i_{t+1}=q_j|O,\lambda)
ϵt(i,j)=P(it=qi,it+1=qj∣O,λ)
该概率可以通过前向后向概率计算:
ϵ
t
(
i
,
j
)
=
P
(
i
t
=
q
i
,
i
t
+
1
=
q
j
,
O
∣
λ
)
P
(
O
∣
λ
)
=
P
(
i
t
=
q
i
,
i
t
+
1
=
q
j
,
O
∣
λ
)
∑
i
=
1
N
∑
j
=
1
N
P
(
i
t
=
q
i
,
i
t
+
1
=
q
j
,
O
∣
λ
)
=
α
t
(
i
)
a
i
j
b
j
(
o
t
+
1
)
β
t
+
1
(
j
)
∑
i
=
1
N
∑
j
=
1
N
α
t
(
i
)
a
i
j
b
j
(
o
t
+
1
)
β
t
+
1
(
j
)
\epsilon_t(i,j)=\frac{P(i_t=q_i,i_{t+1}=q_j,O|\lambda)}{P(O|\lambda)}=\frac{P(i_t=q_i,i_{t+1}=q_j,O|\lambda)}{\sum_{i=1}^N\sum_{j=1}^N P(i_t=q_i,i_{t+1}=q_j,O|\lambda)}=\frac{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}{\sum_{i=1}^N\sum_{j=1}^N \alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}
ϵt(i,j)=P(O∣λ)P(it=qi,it+1=qj,O∣λ)=∑i=1N∑j=1NP(it=qi,it+1=qj,O∣λ)P(it=qi,it+1=qj,O∣λ)=∑i=1N∑j=1Nαt(i)aijbj(ot+1)βt+1(j)αt(i)aijbj(ot+1)βt+1(j)
其中,
P
(
i
t
=
q
i
,
i
t
+
1
=
q
j
,
O
∣
λ
)
=
α
t
(
i
)
a
i
j
b
j
(
o
t
+
1
)
β
t
+
1
(
j
)
P(i_t=q_i,i_{t+1}=q_j,O|\lambda)=\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)
P(it=qi,it+1=qj,O∣λ)=αt(i)aijbj(ot+1)βt+1(j)
3).一些有用的期望值:
i.在观测O下状态i出现的期望值:
∑
t
=
1
T
γ
t
(
i
)
\sum_{t=1}^T \gamma_t(i)
∑t=1Tγt(i);
ii.在观测O下由状态i转移的期望值:
∑
t
=
1
T
−
1
γ
t
(
i
)
\sum_{t=1}^{T-1} \gamma_t(i)
∑t=1T−1γt(i);
iii.在观测O下由状态i转移到状态j的期望值:
∑
t
=
1
T
−
1
ϵ
t
(
i
,
j
)
\sum_{t=1}^{T-1} \epsilon_t(i,j)
∑t=1T−1ϵt(i,j)
3.学习问题算法
隐马尔可夫模型参数的学习,可以根据已知条件是只包含观测序列还是也包含对应状态序列划分为监督学习和无监督学习。
3.1 监督学习隐马尔可夫模型
监督学习方法很简单,就是已知数据集
{
(
O
1
,
I
1
)
,
(
O
2
,
I
2
)
,
.
.
.
,
(
O
S
,
I
S
)
}
\{(O_1,I_1),(O_2,I_2),...,(O_S,I_S)\}
{(O1,I1),(O2,I2),...,(OS,IS)}。
计算样本中t时刻处于状态i而t+1时刻处于状态j的样本频数为
A
i
j
A_{ij}
Aij,那么状态转移概率的估计是:
a
^
i
j
=
A
i
j
∑
j
=
1
N
A
i
j
,
i
=
1
,
2
,
.
.
.
,
N
;
j
=
1
,
2
,
.
.
.
,
N
\hat a_{ij}=\frac{A_{ij}}{\sum_{j=1}^NA_{ij}},i=1,2,...,N;j=1,2,...,N
a^ij=∑j=1NAijAij,i=1,2,...,N;j=1,2,...,N
计算样本中状态为j并观测为k的样本频数为
B
j
k
B_{jk}
Bjk,那么状态为j观测为k的概率估计是:
b
^
j
(
k
)
=
B
j
k
∑
k
=
1
M
B
j
k
,
j
=
1
,
2
,
.
.
.
,
N
;
k
=
1
,
2
,
.
.
.
,
M
\hat b_j(k)=\frac{B_{jk}}{\sum_{k=1}^MB_{jk}},j=1,2,...,N;k=1,2,...,M
b^j(k)=∑k=1MBjkBjk,j=1,2,...,N;k=1,2,...,M
初始状态概率
π
i
\pi_i
πi的估计值就是样本中初始状态为
q
i
q_i
qi的频数。
有监督学习学习隐马尔可夫模型比较简单,因为其中的隐藏信息其实已经显示出来了。但是有监督学习需要标注样本,这个人工成本非常高,在实际情况中基本不会使用。
3.2 无监督学习隐马尔可夫模型——Baum-Welch算法(EM算法)
由EM算法的特性可知,EM算法可以用来估计含有隐变量的马尔可夫模型,且很明显此处可观测变量为观测序列O,不可观测的隐变量为状态序列I,则隐马尔科夫模型可以写成如下形式:
P
(
O
∣
λ
)
=
∑
I
P
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
P(O|\lambda)=\sum_I P(O|I,\lambda)P(I|\lambda)
P(O∣λ)=I∑P(O∣I,λ)P(I∣λ)
具体算法步骤如下:
- 输入:观测数据 O = ( o 1 , o 2 , . . . , o T ) O=(o_1,o_2,...,o_T) O=(o1,o2,...,oT);
- 输出:隐马尔可夫模型参数;
1). 初始化:对n=0,取 a i j ( 0 ) , b j ( k ) ( 0 ) , π i ( 0 ) a_{ij}^{(0)},b_j(k)^{(0)},\pi_i^{(0)} aij(0),bj(k)(0),πi(0),得到初始模型参数 λ ( 0 ) = ( A ( 0 ) , B ( 0 ) , π ( 0 ) ) \lambda^{(0)}=(A^{(0)},B^{(0)},\pi^{(0)}) λ(0)=(A(0),B(0),π(0));
2). 递推:对n=1,2,…,求解:
a i j ( n + 1 ) = ∑ t = 1 T − 1 ϵ t ( i , j ) ∑ t = 1 T − 1 γ t ( i ) a_{ij}^{(n+1)}=\frac{\sum_{t=1}^{T-1} \epsilon_t(i,j)}{\sum_{t=1}^{T-1} \gamma_t(i)} aij(n+1)=∑t=1T−1γt(i)∑t=1T−1ϵt(i,j)
b j ( k ) ( n + 1 ) = ∑ t = 1 , o t = v k T γ t ( j ) ∑ t = 1 T γ t ( i ) b_{j}(k)^{(n+1)}=\frac{\sum_{t=1,o_t=v_k}^{T} \gamma_t(j)}{\sum_{t=1}^{T} \gamma_t(i)} bj(k)(n+1)=∑t=1Tγt(i)∑t=1,ot=vkTγt(j)
π i ( n + 1 ) = γ 1 ( i ) \pi_i^{(n+1)}=\gamma_1(i) πi(n+1)=γ1(i)
上式右端各值按已知观测序列O和当前模型参数 λ ( n + 1 ) = ( A ( n + 1 ) , B ( n + 1 ) , π ( n + 1 ) ) \lambda^{(n+1)}=(A^{(n+1)},B^{(n+1)},\pi^{(n+1)}) λ(n+1)=(A(n+1),B(n+1),π(n+1))
计算, γ t ( j ) , ϵ t ( i , j ) \gamma_t(j),\epsilon_t(i,j) γt(j),ϵt(i,j)按2.3节的公式计算。
3).算法结束,得到模型参数: λ ( n + 1 ) = ( A ( n + 1 ) , B ( n + 1 ) , π ( n + 1 ) ) \lambda^{(n+1)}=(A^{(n+1)},B^{(n+1)},\pi^{(n+1)}) λ(n+1)=(A(n+1),B(n+1),π(n+1))
4.预测问题算法
4.1 近似算法
近似算法的思路很简单,就是在每个时刻t都选择当前时刻概率最大的状态
i
t
∗
i_t^*
it∗作为预测的状态,以此类推,可以得到预测状态序列
I
∗
=
(
i
1
∗
,
i
2
∗
,
.
.
.
,
i
T
∗
)
I^*=(i_1^*,i_2^*,...,i_T^*)
I∗=(i1∗,i2∗,...,iT∗)。
假设已知隐马尔可夫模型
λ
\lambda
λ和观测序列O,在时刻t处处于状态
q
i
q_i
qi的概率是:
γ
t
(
i
)
=
α
t
(
i
)
β
t
(
i
)
P
(
O
∣
λ
)
=
α
t
(
i
)
β
t
(
i
)
∑
j
=
1
N
α
t
(
j
)
β
t
(
j
)
\gamma_t(i)=\frac{\alpha_t(i)\beta_t(i)}{P(O|\lambda)}=\frac{\alpha_t(i)\beta_t(i)}{\sum_{j=1}^N \alpha_t(j)\beta_t(j)}
γt(i)=P(O∣λ)αt(i)βt(i)=∑j=1Nαt(j)βt(j)αt(i)βt(i)
选择当前时刻t概率最大的状态作为预测的t时刻状态:
i
t
∗
=
arg
max
1
≤
i
≤
N
[
γ
t
(
i
)
]
,
t
=
1
,
2
,
…
,
T
i_t^*=\arg\max\limits_{1\le i\le N}[\gamma_t(i)], t=1,2,\dots,T
it∗=arg1≤i≤Nmax[γt(i)],t=1,2,…,T
从而得到预测的状态序列
I
∗
=
(
i
1
∗
,
i
2
∗
,
.
.
.
,
i
T
∗
)
I^*=(i_1^*,i_2^*,...,i_T^*)
I∗=(i1∗,i2∗,...,iT∗)。
近似算法的优点是非常直观,实现也简单,缺点是只能保证某时刻的状态是当前时刻下的最大概率状态,而不能保证最终得到的预测状态序列整体是概率最大的序列。另外,这种算法前后预测值之间没有联系和约束,很可能会产生两个相邻状态之间状态转移概率为0的情况(
a
i
j
=
0
a_{ij}=0
aij=0)。尽管如此,这种算法在不少场合仍是非常有用的。
4.2 维特比算法(Viterbi algorithm)
维特比算法实质上是用 动态规划 解决隐马尔可夫模型的预测问题,即用动态规划求解概率最大路径,是个最优路径问题。
熟悉动态规划算法的读者可能知道,动态规划的特点就是:
- “无后效性”:后续发生的状态不影响前面已经求得的状态序列最优解;
- “全局最优解的局部解也是局部最优解”:也就是说,假设求出的最优序列是 I ∗ = ( i 1 ∗ , i 2 ∗ , . . . , i T ∗ ) I^*=(i_1^*,i_2^*,...,i_T^*) I∗=(i1∗,i2∗,...,iT∗),那么它的局部序列 I ∗ = ( i 1 ∗ , i 2 ∗ , . . . , i k ∗ ) , k < T I^*=(i_1^*,i_2^*,...,i_k^*),k<T I∗=(i1∗,i2∗,...,ik∗),k<T 肯定是状态1~k的最优序列,因为如果不是的话,完全可以将这部分序列换成最优子序列,从而可以得到更优的全局序列,这与最开始假设的最优序列是矛盾的。
维特比算法的思想就是如此,只是它的最优子序列是从T时刻开始往前取的,实质是一样的。先说明一下两个符号:
1).
δ
t
(
i
)
\delta_t(i)
δt(i)表示定义在时刻 t 状态为集合{i|i=1,2,…,N}中任意一种的所有可能路径中,概率最大的那一条路径的概率值。
δ
t
(
i
)
=
max
i
1
,
i
2
,
.
.
.
.
,
i
t
−
1
P
(
i
t
=
i
,
i
t
−
1
,
.
.
.
,
i
1
,
o
t
,
.
.
.
,
o
1
∣
λ
)
,
i
=
1
,
2
,
.
.
.
,
N
\delta_t(i)=\max\limits_{i_1,i_2,....,i_{t-1}}P(i_t=i,i_{t-1},...,i_1,o_t,...,o_1|\lambda),i=1,2,...,N
δt(i)=i1,i2,....,it−1maxP(it=i,it−1,...,i1,ot,...,o1∣λ),i=1,2,...,N
递
推
公
式
:
δ
t
+
1
(
i
)
=
max
i
1
,
i
2
,
.
.
.
.
,
i
t
P
(
i
t
=
i
,
i
t
,
.
.
.
,
i
1
,
o
t
+
1
,
.
.
.
,
o
1
∣
λ
)
递推公式:\delta_{t+1}(i)=\max\limits_{i_1,i_2,....,i_t}P(i_t=i,i_t,...,i_1,o_{t+1},...,o_1|\lambda)
递推公式:δt+1(i)=i1,i2,....,itmaxP(it=i,it,...,i1,ot+1,...,o1∣λ)
=
max
1
≤
j
≤
N
[
δ
t
(
j
)
a
j
i
]
b
i
(
o
t
+
1
)
,
i
=
1
,
2
,
.
.
.
,
N
;
t
=
1
,
2
,
.
.
.
,
T
−
1
=\max\limits_{1\le j\le N}[\delta_t(j)a_{ji}]b_i(o_{t+1}),i=1,2,...,N;t=1,2,...,T-1
=1≤j≤Nmax[δt(j)aji]bi(ot+1),i=1,2,...,N;t=1,2,...,T−1
其中
a
j
i
a_{ji}
aji是状态i转移到状态j的转移概率矩阵元素;
b
i
(
o
t
+
1
)
b_i(o_{t+1})
bi(ot+1)是状态i的观测概率矩阵元素。
2).
Ψ
t
(
i
)
\Psi_t(i)
Ψt(i)是在时刻 t 状态为 i 的所有单个路径
(
i
1
,
i
2
,
…
,
i
t
−
1
,
i
)
(i_1,i_2,\dots,i_{t-1},i)
(i1,i2,…,it−1,i)中概率最大路径的第t-1个结点的状态,即可以简单理解为:
Ψ
t
(
i
)
=
i
t
−
1
\Psi_t(i)=i_{t-1}
Ψt(i)=it−1,但是这个
i
t
−
1
i_{t-1}
it−1是有上述前提条件的。
Ψ
t
(
i
)
=
arg
max
1
≤
j
≤
N
[
δ
t
−
1
(
j
)
a
j
i
]
,
i
=
1
,
2
,
…
,
N
\Psi_t(i)=\arg\max\limits_{1\le j\le N}[\delta_{t-1}(j)a_{ji}],i=1,2,\dots,N
Ψt(i)=arg1≤j≤Nmax[δt−1(j)aji],i=1,2,…,N
维特比算法的具体步骤:
- 输入:马尔可夫模型 λ = ( 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);
- 输出:最优预测序列(最优路径): I ∗ = ( i 1 ∗ , i 2 ∗ , . . . , i T ∗ ) I^*=(i_1^*,i_2^*,...,i_T^*) I∗=(i1∗,i2∗,...,iT∗);
- 1).初始化
δ 1 ( i ) = π i b i ( o 1 ) , Ψ 1 ( i ) = 0 , i = 1 , 2 , . . . , N \delta_1(i)=\pi_ib_i(o_1),\quad \Psi_1(i)=0,\quad i=1,2,...,N δ1(i)=πibi(o1),Ψ1(i)=0,i=1,2,...,N - 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 ) , i = 1 , 2 , . . . , N \delta_{t}(i)=\max\limits_{1\le j\le N}[\delta_{t-1}(j)a_{ji}]b_i(o_{t}),i=1,2,...,N δt(i)=1≤j≤Nmax[δt−1(j)aji]bi(ot),i=1,2,...,N
Ψ t ( i ) = arg max 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] , i = 1 , 2 , . . . , N \Psi_{t}(i)=\arg\max\limits_{1\le j\le N}[\delta_{t-1}(j)a_{ji}],i=1,2,...,N Ψt(i)=arg1≤j≤Nmax[δt−1(j)aji],i=1,2,...,N - 3).得到最优预测序列概率
P
∗
P^*
P∗和T时刻最优状态
i
T
∗
i^*_T
iT∗:
P ∗ = max 1 ≤ i ≤ N δ T ( i ) , i T ∗ = arg max 1 ≤ i ≤ N [ δ T ( i ) ] P^*=\max\limits_{1\le i\le N} \delta_T(i),\quad i_T^*=\arg\max\limits_{1\le i\le N}[\delta_T(i)] P∗=1≤i≤NmaxδT(i),iT∗=arg1≤i≤Nmax[δT(i)] - 4).最优路径回溯:
i t ∗ = Ψ t + 1 ( i t + 1 ∗ ) , t = T − 1 , T − 2 , . . . , 1 i^*_t = \Psi_{t+1}(i_{t+1}^*),t=T-1,T-2,...,1 it∗=Ψt+1(it+1∗),t=T−1,T−2,...,1
从而得到最优预测序列: I ∗ = ( i 1 ∗ , i 2 ∗ , . . . , i T ∗ ) I^*=(i_1^*,i_2^*,...,i_T^*) I∗=(i1∗,i2∗,...,iT∗)。
维特比算法的案例也很简单很直观,读者可以自行参阅李航老师《统计学习方法》第10章,以巩固加深对维特比算法的理解。