参考文章:
隐马尔可夫模型(HMM)详解
HMM-前向后向算法理解与实现(python)
隐马尔科夫模型(HMM)一前向与后向算法
HMM隐马尔可夫模型
马尔科夫模型
存在一类重要的随机过程:如果一个系统有 N 个状态 S 1 , S 2 , . . . S n S_1,S_2,...S_n S1,S2,...Sn 随着时间的推移,该系统从某一状态转移到另一状态。如果用 S t S_t St 表示系统在时间 t 的状态变量,那么 t 时刻的状态取值为 S j S_j Sj(1<=j<=N)的概率取决于前 t-1 个时刻(1, 2, …, t-1)的状态,该概率为:
- 假设一: 如果在特定情况下,系统在时间 t 的状态只与其在时间 t-1 的状态相关,则该系统构成一个离散的一阶马尔可夫链:
p ( q t = S j ∣ q t − 1 = S i , q t − 2 = S k . . . ) = p ( q t = S j ∣ q t − 1 = S i ) p(q_t=S_j \vert q_{t-1}=S_i, q_{t-2}=S_k...) = p(q_t=S_j \vert q_{t-1}=S_i) p(qt=Sj∣qt−1=Si,qt−2=Sk...)=p(qt=Sj∣qt−1=Si)
- 假设二: 如果t 时刻状态的概率取决于前 t-1 个时刻(1, 2, …, t-1)的状态,且状态的转换与时间无关,则该随机过程就是马尔可夫模型。
从马尔可夫模型到隐马尔科夫模型
对于马尔科夫模型来说,每个状态,以及每个状态之间的转化概率我们都是可以看到的。如果当我们无法观察到所有的状态或者是状态之间的变化是不可见的时候此时的模型就转化为了隐马尔可夫模型。我们要做的是通过可以看到的输出,来对真正的状态变化进行预估。
隐马尔可夫模型组成
概念:
- 状态集合: 所有可能的隐藏模型的集合,个数为N
- 观测集合: 所有可能的观测集合,个数为M
- 转换概率: 状态x转换到状态y的概率
- 输出概率: 从状态输出观测结果的状态,例如有三个盒子,每个盒子中取出球的颜色就称为输出概率
- 隐状态序列: 背后的状态随时间变化的情况。
- 观察输出序列: 观测到由隐状态输出的结果。
示意图如下:
从上面可以看出,一个HMM模型实际是和时间相关的一个模型。在隐马尔可夫模型(HMM)中,我们不知道模型具体的状态序列,只知道状态转移的概率,即模型的状态转换过程是不可观察的。
因此,该模型是一个双重随机过程,包括模型的状态转换和特定状态下可观察事件的随机。
一般一个隐马尔科夫模型可以记成:
λ
=
[
π
,
A
,
B
]
\lambda=\lbrack\pi,A,B\rbrack
λ=[π,A,B]
其中
π
\pi
π为初始状态概率,
A
N
∗
N
A_{N*N}
AN∗N为状态转移矩阵,
B
M
∗
N
B_{M*N}
BM∗N为观测概率矩阵。
三个问题
评估(观察序列计算问题)
给定 HMM,即 λ = [ π , A , B ] \lambda=\lbrack\pi,A,B\rbrack λ=[π,A,B],求某个观察序列的概率。
例如:给定一个天气的隐马尔可夫模型,包括第一天的天气概率分布,天气转移概率矩阵,特定天气下树叶的湿度概率分布。求第一天湿度为 1,第二天湿度为 2,第三天湿度为 3 的概率。
前向算法
我们的目的是要求在给定模型后的某个时刻的出现概率。如果使用枚举的方式是可以全部求出,但是当变量较多的情况下,我们难以获得所有的存在概率。
此时可以考虑,对每一步进行计算,根据每一步的计算结果,推测出最后t时刻下的分布概率。
在时刻 t,状态为 i 时,前面的时刻观测到
O
1
,
O
2
,
.
.
.
,
O
t
O_1,O_2,...,O_t
O1,O2,...,Ot的概率,记为
α
i
(
t
)
α_i(t)
αi(t):
α i ( t ) = P ( O 1 , O 2 , … O t , s t = i ∣ λ ) \alpha_i(t)=P\left(O_1,O_2,\dots O_t,s_t=i\vert\lambda\right) αi(t)=P(O1,O2,…Ot,st=i∣λ)
当 t=1时,输出为
O
1
O_1
O1,假设有三个状态,
O
1
O_1
O1可能是任意一个状态发出,即
P
(
O
1
∣
λ
)
=
π
1
b
1
(
O
1
)
+
π
2
b
2
(
O
1
)
+
π
2
b
3
(
O
1
)
=
α
1
(
1
)
+
α
2
(
1
)
+
α
3
(
1
)
P(O_1\vert\lambda)=\pi_1b_1(O_1)+\pi_2b_2(O_1)+\pi_2b_3(O_1)=\alpha_1(1)+\alpha_2(1)+\alpha_3(1)
P(O1∣λ)=π1b1(O1)+π2b2(O1)+π2b3(O1)=α1(1)+α2(1)+α3(1)
当 t=2 时,输出为
O
1
O
2
O_1O_2
O1O2可能由任一个状态发出,同时产生
O
2
O_2
O2 对应的状态可以由 t=1 时刻任意一个状态转移得到。假设
O
2
O_2
O2 由状态 1 发出,如下图
计算公式如下图所示:
后向算法
后向算法的思想与前向算法那相反,是通过T时刻向反方向推导t时刻的生成概率(0<t<T)
在时刻 t,状态为 i 时,观测到 O t + 1 , O t + 2 , . . . , O T O_{t+1},O_{t+2},...,O_T Ot+1,Ot+2,...,OT的概率,记为 β i ( t ) βi(t) βi(t):
β i ( t ) = P ( O t + 1 , O t + 2 , . . . , O T ∣ s t = i , λ ) \beta_i(t)=P\left(O_{t+1},O_{t+2},...,O_T\vert s_t=i,\lambda\right) βi(t)=P(Ot+1,Ot+2,...,OT∣st=i,λ)
当 t=T 时,由于 T 时刻之后为空,没有观测,所以 β i ( t ) = 1 βi(t)=1 βi(t)=1
当 t=T−1时,观测 O T O_T OT , O T O_T OT可能由任意一个状态产生
β i ( T − 1 ) = P ( O T ∣ s t = i , λ ) = a i 1 b 1 ( O T ) β 1 ( T ) + a i 2 b 2 ( O T ) β 2 ( T ) + a i 3 b 3 ( O T ) β 3 ( T ) \beta_i(T-1)=P(O_T\vert s_t=i,\lambda)=a_{i1}b_1(O_T)\beta_1(T)+a_{i2}b_2(O_T)\beta_2(T)+a_{i3}b_3(O_T)\beta_3(T) βi(T−1)=P(OT∣st=i,λ)=ai1b1(OT)β1(T)+ai2b2(OT)β2(T)+ai3b3(OT)β3(T)
解码(隐含状态序列计算问题)
给定观测序列以及HMM模型求最优的隐状态序列。
Viterbi算法
维特比算法是一个特殊但应用最广的动态规划(dynamic programming)算法,利用动态规划,可以解决任何一个图中的最短路径问题,同时,它也是求解HMM描述的第三个基本问题的算法。
简单解释就是根据T-1时刻下最大可能的状态序列来求得T时刻下每个状态最大可能的排列。