HMM-隐马尔可夫模型学过很多遍,每次都是大概理解,但是对于其中的细节总是学了忘,忘了学,参考了《统计学习方法》以及B站上的白板推导,终于把整个模型再重新梳理了一遍,未完待续。
基本概念:
隐马尔可夫是关于时序的概率模型,描述一个由隐层的马尔科夫链随机生成不可观测的状态的序列,再由各个状态随机生成一个观测而产生观测的序列的过程
状态序列:
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)
状态集合:
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}
A
=
[
a
i
j
]
N
×
N
A=[a_{ij}] _{N\times N}
A=[aij]N×N 状态转移矩阵,状态i转移到状态j的概率
B
=
[
b
j
(
k
)
]
N
×
M
B=[b_j(k)]_{N\times M}
B=[bj(k)]N×M 观测概率矩阵,状态为
q
j
q_j
qj的情况下,生成的观测为
v
k
v_k
vk的概率
λ
=
(
A
,
B
,
π
)
\lambda=(A,B,\pi)
λ=(A,B,π)
模型基本假设:
1.齐次马尔科夫假设:未来跟过去没有关系,只跟当前有关系,隐藏的马尔科夫链在任意时刻t的状态只依赖于前一时刻的状态,与其他时刻的状态及观测无关,也与时刻t无关
P
(
i
t
∣
i
t
−
1
,
o
t
−
1
,
.
.
.
i
1
,
o
1
)
=
P
(
i
t
∣
i
t
−
1
)
P(i_t|i_{t-1},o_{t-1},...i_1,o_1)=P(i_t|i_{t-1})
P(it∣it−1,ot−1,...i1,o1)=P(it∣it−1)
2.观测独立性假设:
任意时刻的观测只依赖于该时刻的马尔科夫链的状态,与其他观测及状态无关
P
(
o
t
∣
i
T
,
o
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_1,o_1)=P(o_t|i_t)
P(ot∣iT,oT,iT−1,oT−1,...,i1,o1)=P(ot∣it)
隐马尔科夫模型需要解决的三个基本问题:
1.概率计算问题:已知模型和观测序列,求在此模型下观测序列出现的概率
2.学习问题,已知观测序列,估计模型的参数,用极大似然估计的方法估计参数
3.预测问题,也称为解码问题,已知模型和观测序列,求最有可能得状态序列
1.概率计算问题,可以直接暴力求解,把所有的概率都计算出来
1.直接计算法,I指所有可能得观测序列
P
(
O
∣
λ
)
=
∑
I
(
O
,
I
∣
λ
)
=
∑
I
(
O
∣
I
,
λ
)
P
(
I
∣
λ
)
P(O|\lambda)=\sum _I (O,I|\lambda)=\sum _I (O|I,\lambda)P(I|\lambda)
P(O∣λ)=∑I(O,I∣λ)=∑I(O∣I,λ)P(I∣λ)
P
(
I
∣
λ
)
=
π
i
1
a
i
1
i
2
.
.
.
a
(
T
−
1
)
T
P(I|\lambda)=\pi_{i_1}a_{i_1i_2}...a_{(T-1)T}
P(I∣λ)=πi1ai1i2...a(T−1)T
P
(
O
∣
λ
,
I
)
=
b
i
1
(
o
1
)
.
.
.
b
i
T
(
o
T
)
P(O|\lambda,I)=b_{i_1}(o_1)...b_{i_T}(o_T)
P(O∣λ,I)=bi1(o1)...biT(oT)
P
(
O
∣
λ
)
=
∑
π
i
1
b
i
1
(
o
1
)
a
i
1
i
2
b
i
2
(
o
2
)
.
.
a
(
T
−
1
)
T
b
i
T
(
o
T
)
P(O|\lambda)=\sum \pi_{i_1}b_{i_1}(o_1)a_{i_1i_2}b_{i_2}(o_2)..a_{(T-1)T} b_{i_T}(o_T)
P(O∣λ)=∑πi1bi1(o1)ai1i2bi2(o2)..a(T−1)TbiT(oT)
公式写的复杂,其实就是如果是单条路径而言,其实很好理解,把状态转移概率和观测概率乘起来,然后总共有 N T N^T NT条路径,把所有路径对应的概率相加即可,因为总共有T个时刻,每个时刻有N个状态,所以状态可能的路径有 N T N^T NT条(当然转移概率为0那么会再少一点),对于某条路径而言,可以有2T个数相乘,做了2T-1次乘法,所以复杂度是 O ( T N T ) O(TN^T) O(TNT)
2.前向计算法forward algorithm
1.在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∣λ)
2.根据这这里前向概率的定义,其实直接得出下面这个公式,因为总共有N个状态么
P
(
O
∣
λ
)
=
∑
i
=
1
N
α
T
(
i
)
P(O|\lambda)=\sum_{i=1}^N\alpha_T(i)
P(O∣λ)=∑i=1NαT(i)
3.中间的递推过程,从t时刻到t+1时刻的某个状态
q
i
q_i
qi,
α
t
+
1
(
i
)
=
[
∑
j
=
1
N
α
t
(
j
)
a
j
i
]
b
i
(
t
+
1
)
\alpha_{t+1}(i)=[\sum_{j=1}^N\alpha_t(j)a_{ji}]b_i(_{t+1})
αt+1(i)=[∑j=1Nαt(j)aji]bi(t+1)
对于t+1时刻的每一个
q
i
q_i
qi,那么前一时刻t总共有N个状态以及相应的转移概率与之对应
q
1
,
a
1
i
q_1,a_{1i}
q1,a1i
q
2
,
a
2
i
q_2,a_{2i}
q2,a2i
…
q
N
,
a
N
i
q_N,a_{Ni}
qN,aNi
这样子一来,每一次计算,引用前一次的计算结果,这里每一个时刻t+1是有N个状态,时刻t也有N个状态,所以每一时刻要做N*N次乘法(其实应该是N+1*N次,中括号里面做N次乘法求和,外面再乘个观测概率),总共有T个时刻,所以复杂度是
O
(
T
N
2
)
O(TN^2)
O(TN2)
3.后向算法backword algorithm
虽然前向和后向表示的意思不一样,后项的情况比前向更复杂一些
1.在时刻t,状态为
q
i
q_i
qi的条件下,从t+1到T的观测序列的概率为后向概率,注意和前向概率的公式稍有不同
β
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,λ)
2.直接根据后向概率的定义,可以得出
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)
3.中间的递推过程,其实也可以从定义里得出,t+1到t,看2个加粗的箭头,和前向算法类似 ,复杂度也是一样的,对于每个状态i,总共需要做2N次乘法,其实是做
2
N
2
2N^2
2N2,所以复杂度还是
O
(
T
N
T
)
O(TN^T)
O(TNT)
β
t
(
i
)
=
∑
j
=
1
N
a
i
j
b
j
(
o
t
+
1
)
β
t
+
1
(
j
)
\beta_t(i)=\sum_{j=1}^Na_{ij}b_j(o_{t+1})\beta_{t+1}(j)
βt(i)=∑j=1Naijbj(ot+1)βt+1(j)
前向与后项的一些延伸:
P
(
i
t
=
q
i
,
O
∣
λ
)
=
α
t
(
i
)
β
t
(
i
)
P(i_t=q_i,O|\lambda)=\alpha_t(i)\beta_t(i)
P(it=qi,O∣λ)=αt(i)βt(i),画个图能比较明显的发现
学习问题:
鲍姆-韦尔奇算法,是EM算法在隐马尔科夫中的具体体现,得去研究EM算法之后再来研究这个算法
预测问题:
1.近似算法,不能保证预测的状态序列整体是最有可能得状态蓄力,因为预测的状态序列可能有实际不发生的部分,,状态转移概率为0的相邻状态
类似概率计算问题
2.维特比算法,用动态规划(dynamic programming)
如果最优路径经过某个节点上的某个状态,那么从上一节点到这个状态的最优路径一定是上一节点上各个状态到这个状态的概率最大值。所以在隐马尔可夫模型中,如某一时刻t下,如果最大概率的路径是经过这个状态的,那么从上一时刻到这一时刻的最优路径肯定是,上一时刻各个状态到达这一时刻的概率的最大值。每次计算完之后,只会留下N条路径;
如图,计算时,哪个箭头指向对应的概率越大,选哪个,当最后一步算完之后,选概率最大的那条路径,最后计算完之后,路径自然而然就标出来了
根据书中的列子,观测状态为(红,白,红),模型如下:
A
=
[
0.5
0.2
0.3
0.3
0.5
0.2
0.2
0.3
0.5
]
A= \begin{bmatrix} 0.5&0.2&0.3\\0.3&0.5&0.2\\0.2&0.3&0.5\end{bmatrix}
A=⎣⎡0.50.30.20.20.50.30.30.20.5⎦⎤
B
=
[
0.5
0.2
0.4
0.6
0.7
0.3
]
B= \begin{bmatrix} 0.5&0.2\\0.4&0.6\\0.7&0.3&\end{bmatrix}
B=⎣⎡0.50.40.70.20.60.3⎦⎤
π
=
(
0.2
,
0.4
,
0.4
)
\pi=(0.2,0.4,0.4)
π=(0.2,0.4,0.4)
δ
t
(
i
)
\delta_t(i)
δt(i)表示在t时刻状态为i的概率最大值
δ
t
+
1
(
i
)
=
max
[
δ
t
(
j
)
a
j
i
]
b
i
(
o
t
+
1
)
\delta_{t+1}(i)=\max [\delta_t(j)a_{ji}] b_i(o_{t+1})
δt+1(i)=max[δt(j)aji]bi(ot+1),如例题,t=2,i=3时,分别计算前一时刻各状态转移到i=3时的值,取最大的那个值就可以
1.t=1时,观测状态红
δ
1
(
1
)
\delta_1(1)
δ1(1)=0.20.5=0.1
δ
1
(
2
)
\delta_1(2)
δ1(2)=0.40.4=0.16
δ
1
(
3
)
\delta_1(3)
δ1(3)=0.4*0.7=0.28
2.t=2时,观测状态白
δ
2
(
1
)
\delta_2(1)
δ2(1)=max(0.1*00.5,0.16*0.3,0.28*0.2)*0.5=0.028,选状态3
δ
2
(
2
)
\delta_2(2)
δ2(2)=max(0.1*0.2,0.16*0.5,0.28*0.3)*0.6=0.0504,选状态3
δ
2
(
3
)
\delta_2(3)
δ2(3)=max(0.1*0.3,0.16*0.2,0.28*0.5)*0.3=0.042,选状态3
3.t=3时,观测状态红
δ
3
(
1
)
\delta_3(1)
δ3(1)==max(0.028*0.5,0.0504*0.3,0.042*0.2)*0.5=0.00756,选状态2
δ
3
(
2
)
\delta_3(2)
δ3(2)=max(0.028*0.2,0.0504*0.5,0.042*0.3)*0.4=0.01008,选状态2
δ
3
(
3
)
\delta_3(3)
δ3(3)=max(0.028*0.3,0.0504*0.2,0.042*0.5)*0.7=0.0147,选状态1
根据delta_3(3)=0.0147可以发现最优路径是(3,3,3)