隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。

隐马尔可夫模型的结构

HMM 模型是一种生成式模型。

HMM 模型中有 2 个相关序列,分别是状态序列和观测序列,HMM 模型具有以下规则:

  • 观测序列是可以直接观测的,状态序列是不可观测的
  • 状态序列在 t 时刻的值只与 t-1 时刻的值有关
  • 观测序列在 t 时刻的值只与 t 时刻状态序列的值有关

设状态序列
X={X1,X2,…,Xn} X = \{X_1,X_2,\dots,X_n\} X={X1,X2,,Xn}
观测序列
O={O1,O2,…,On} O=\{O_1,O_2,\dots,O_n\} O={O1,O2,,On}
则 HMM 模型的结构如下图所示:
image-20210125161351112

隐马尔科夫模型的假设

根据上述结构和规则,我们可以得出如下假设:

  • 马尔可夫性假设:t 时刻的状态出现的概率只与 t-1 时刻的状态有关
    P{Xt∣X1,X2,…,Xt−1}=P{Xt∣Xt−1} P\{X_t|X_1,X_2,\dots,X_{t-1}\}=P\{X_t|X_{t-1}\} P{XtX1,X2,,Xt1}=P{XtXt1}

  • 齐次性假设:时间平移不变性
    P{Xt∣Xt−1}=P{Xs∣Xs−1},ifXt=XsandXt−1=Xs−1 P\{X_t|X_{t-1}\}=P\{X_s|X_{s-1}\},if\quad X_t=X_s\quad and\quad X_{t-1}=X_{s-1} P{XtXt1}=P{XsXs1},ifXt=XsandXt1=Xs1

  • 观测独立性假设:某个时刻 t 的观测值只依赖于该时刻的状态值
    P{Ot∣X1,X2,…,Xt−1,O1,O2,…,Ot−1}=P{Ot∣Xt} P\{O_t|X_1,X_2,\dots,X_{t-1},O_1,O_2,\dots,O_{t-1}\}=P\{O_t|X_t\} P{OtX1,X2,,Xt1,O1,O2,,Ot1}=P{OtXt}

根据上述假设,得 HMM 的联合概率密度:
P{O1,O2,…,OT,X1,X2,…,XT} P\{O_1,O_2,\dots,O_T,X_1,X_2,\dots,X_T\} P{O1,O2,,OT,X1,X2,,XT}

=P{X1}P{O1∣X1}∏t=2TP{Xt∣Xt−1}P{Ot∣Xt} =P\{X_1\}P\{O_1|X_1\}\prod_{t=2}^{T}P\{X_t|X_{t-1}\}P\{O_t|X_t\} =P{X1}P{O1X1}t=2TP{XtXt1}P{OtXt}

隐马尔科夫模型的组成

观察 HMM 的联合概率密度,发现其分为三部分:

  • 初始状态概率
    P{X1} P\{X_1\} P{X1}

  • 状态转移概率
    P{Xt∣Xt−1} P\{X_t|X_{t-1}\} P{XtXt1}

  • 观测输出概率 (发射概率)
    P{Ot∣Xt} P\{O_t|X_t\} P{OtXt}

在状态值和观测值取值为离散值的情况下,这三种概率可以表示为矩阵。

假定状态值可能的取值为
x1,x2,…,xM x_1,x_2,\dots,x_M x1,x2,,xM
观测值可能的取值为
o1,o2,…,oN o_1,o_2,\dots,o_N o1,o2,,oN
则可得:

  • 初始概率矩阵 π\piπ
    πi=P{xi},i=1,2,…,M \pi_i=P\{x_i\},i=1,2,\dots,M πi=P{xi},i=1,2,,M

  • 转移概率矩阵 A
    Aij=P{xj∣xi},i,j=1,2,…,M A_{ij}=P\{x_j|x_i\},i,j=1,2,\dots,M Aij=P{xjxi},i,j=1,2,,M

  • 发射概率矩阵 B
    Bij=P{oj∣xi},i=1,2,…,M,j=1,2,…,N B_{ij}=P\{o_j|x_i\},i=1,2,\dots,M,j=1,2,\dots,N Bij=P{ojxi},i=1,2,,M,j=1,2,,N

最终 HMM 可表示为
λ=(π,A,B) \lambda=(\pi,A,B) λ=(π,A,B)

维特比算法

问题

对于
λ=(π,A,B) \lambda=(\pi,A,B) λ=(π,A,B)
隐状态集合
Q={q1,q2,…,qN} Q=\{q_1,q_2,\dots,q_N\} Q={q1,q2,,qN}
观测值集合
V={v1,v2,…,vM} V=\{v_1,v_2,\dots,v_M\} V={v1,v2,,vM}

观测结果序列
O=(o0,o1,…,oT) O=(o_0,o_1,\dots,o_T) O=(o0,o1,,oT)
假设
π=[πi] \pi=\begin{bmatrix} \pi_i \end{bmatrix} π=[πi]
其中 πi\pi_iπi 表示 qiq_iqi 的初始概率。
A=[aij] A=\begin{bmatrix} a_{ij} \end{bmatrix} A=[aij]
其中 aija_{ij}aij 表示 qiq_iqiqjq_jqj 的转移概率。
B=[bij] B=\begin{bmatrix} b_{ij} \end{bmatrix} B=[bij]
其中 bijb_{ij}bij 表示 qiq_iqivjv_jvj 的发射概率。

求出当前观测结果 O 最有可能的隐状态序列
I=(i0,i1,…,it) I=(i_0,i_1,\dots,i_t) I=(i0,i1,,it)

解法

定义


δt(i)=max⁡i1,i2,…,it−1P{it=i,it−1,…,i1,ot,…,o1∣λ} \delta_t(i)=\max_{i_1,i_2,\dots,i_{t-1}}P\{i_t=i,i_{t-1},\dots,i_1,o_t,\dots,o_1|\lambda\} δt(i)=i1,i2,,it1maxP{it=i,it1,,i1,ot,,o1λ}
表示时刻 t 状态为 i 的所有单个路径中概率最大值,则可得
δt+1(i)=max⁡i1,i2,it−1P{it+1=i,it,…,i1,ot+1,…,o1∣λ} \delta_{t+1}(i)=\max_{i_1,i_2,i_{t-1}}P\{i_{t+1}=i,i_t,\dots,i_1,o_{t+1},\dots,o_1|\lambda\} δt+1(i)=i1,i2,it1maxP{it+1=i,it,,i1,ot+1,,o1λ}

=max⁡1≤j≤N[δt(j)aji]bi(ot+1) =\max_{1\le j\le N}[\delta_t(j)a_{ji}]b_i(o_{t+1}) =1jNmax[δt(j)aji]bi(ot+1)


Ψt(i)=argmax⁡i≤j≤N[δt−1(j)aji] \Psi_t(i)=arg\max_{i\le j\le N}[\delta_{t-1}(j)a_{ji}] Ψt(i)=argijNmax[δt1(j)aji]
表示时刻 t 状态为 i 的所有单个路径中概率最大的路径的第 t-1 个结点。

例子

医生通过观察病人的状态判断病人是否生病。

设病人有状态有 {生病,健康},医生观测结果有 {头晕,不头晕}。

假设病人第一天生病,健康的概率各为 0.5;

若前一天生病,则第二天生病的概率为 0.6,健康的概率为 0.4;

若前一天健康,则第二天健康的概率为 0.8,生病的概率为 0.2;

若生病,则观测到头晕的概率为 0.7,不头晕的概率为 0.3;

若健康,则观测到头晕的概率为 0.1,不头晕的概率为 0.9;

医生观测三天,病人的观测值序列为 {不头晕,头晕,不头晕};

推测病人这三天是否生病。

构造出初始矩阵,转移概率矩阵,发射概率矩阵如下:
π=(0.50.5) \pi=\begin{pmatrix} 0.5\\ 0.5 \end{pmatrix} π=(0.50.5)

A=(0.60.40.20.8) A=\begin{pmatrix} 0.6&0.4\\ 0.2&0.8\\ \end{pmatrix} A=(0.60.20.40.8)

B=(0.70.30.10.9) B=\begin{pmatrix} 0.7&0.3\\ 0.1&0.9\\ \end{pmatrix} B=(0.70.10.30.9)

初始化

δ1(i)=πibi(o1) \delta_1(i)=\pi_ib_i(o_1) δ1(i)=πibi(o1)


δ1(1)=π1b1(o1=不头晕)=π1b12=0.15 \delta_1(1)=\pi_1b_1(o_1=不头晕)=\pi_1b_{12}=0.15 δ1(1)=π1b1(o1=)=π1b12=0.15

δ1(2)=π2b2(o1=不头晕)=π2b22=0.45 \delta_1(2)=\pi_2b_2(o_1=不头晕)=\pi_2b_{22}=0.45 δ1(2)=π2b2(o1=)=π2b22=0.45

上述两个值分别为第一天生病且观测到不头晕,与第一天不生病且观测到不头晕的概率。
Ψ1(1)=Ψ1(2)=0 \Psi_1(1)=\Psi_1(2)=0 Ψ1(1)=Ψ1(2)=0

迭代
第一次迭代,求第二时刻

δ2(j)=max⁡1≤i≤2[δ1(i)aij]bj(o2) \delta_2(j)=\max_{1\le i\le2}[\delta_1(i)a_{ij}]b_j(o_2) δ2(j)=1i2max[δ1(i)aij]bj(o2)


δ1(1)a11=0.15⋅0.6=0.09 \delta_1(1)a_{11}=0.15\cdot0.6=0.09 δ1(1)a11=0.150.6=0.09

δ1(2)a21=0.45⋅0.2=0.09 \delta_1(2)a_{21}=0.45\cdot0.2=0.09 δ1(2)a21=0.450.2=0.09

δ2(1)=max⁡1≤i≤2[δ1(i)ai1]b1(o2=头晕) \delta_2(1)=\max_{1\le i\le2}[\delta_1(i)a_{i1}]b_1(o_2=头晕) δ2(1)=1i2max[δ1(i)ai1]b1(o2=)

=0.09⋅0.7=0.063 =0.09\cdot0.7=0.063 =0.090.7=0.063

Ψ2(1)=argmax⁡1≤i≤2[δ1(i)ai2]=1 \Psi_2(1)=arg\max_{1\le i\le2}[\delta_1(i)a_{i2}]=1 Ψ2(1)=arg1i2max[δ1(i)ai2]=1

δ1(1)a12=0.15⋅0.4=0.06 \delta_1(1)a_{12}=0.15\cdot0.4=0.06 δ1(1)a12=0.150.4=0.06

δ1(2)a22=0.45⋅0.8=0.36 \delta_1(2)a_{22}=0.45\cdot0.8=0.36 δ1(2)a22=0.450.8=0.36

δ2(2)=max⁡1≤i≤2[δ1(i)ai2]b2(o2=头晕) \delta_2(2)=\max_{1\le i\le2}[\delta_1(i)a_{i2}]b_2(o2=头晕) δ2(2)=1i2max[δ1(i)ai2]b2(o2=)

=0.36⋅0.1=0.036 =0.36\cdot0.1=0.036 =0.360.1=0.036

Ψ2(2)=argmax⁡1≤i≤2[δ1(i)ai2]=2 \Psi_2(2)=arg\max_{1\le i\le2}[\delta_1(i)a_{i2}]=2 Ψ2(2)=arg1i2max[δ1(i)ai2]=2

第二次迭代,求第三时刻

δ2(1)a11=0.063⋅0.6=0.0378 \delta_2(1)a_{11}=0.063\cdot0.6=0.0378 δ2(1)a11=0.0630.6=0.0378

δ2(2)a21=0.036⋅0.2=0.0072 \delta_2(2)a_{21}=0.036\cdot0.2=0.0072 δ2(2)a21=0.0360.2=0.0072

δ3(1)=max⁡1≤i≤2[δ2(i)ai1]b1(o3=不头晕) \delta_3(1)=\max_{1\le i\le2}[\delta_2(i)a_{i1}]b_1(o_3=不头晕) δ3(1)=1i2max[δ2(i)ai1]b1(o3=)

=0.0378⋅0.3=0.01134 =0.0378\cdot0.3=0.01134 =0.03780.3=0.01134

Ψ3(1)=1 \Psi_3(1)=1 Ψ3(1)=1

δ2(1)a12=0.063⋅0.4=0.0252 \delta_2(1)a_{12}=0.063\cdot0.4=0.0252 δ2(1)a12=0.0630.4=0.0252

δ2(2)a22=0.036⋅0.8=0.0288 \delta_2(2)a_{22}=0.036\cdot0.8=0.0288 δ2(2)a22=0.0360.8=0.0288

δ3(2)=max⁡1≤i≤2[δ2(i)ai2]b2(o3=不头晕) \delta_3(2)=\max_{1\le i\le2}[\delta_2(i)a_{i2}]b_2(o_3=不头晕) δ3(2)=1i2max[δ2(i)ai2]b2(o3=)

=0.0288⋅0.9=0.02592 =0.0288\cdot0.9=0.02592 =0.02880.9=0.02592

Ψ3(2)=2 \Psi_3(2)=2 Ψ3(2)=2

回溯

q3^=argmax⁡0≤i≤2[δ3(i)]=2 \hat{q_3}=arg\max_{0\le i\le2}[\delta_3(i)]=2 q3^=arg0i2max[δ3(i)]=2

qt^=Ψt+1(qt+1^) \hat{q_t}=\Psi_{t+1}(\hat{q_{t+1}}) qt^=Ψt+1(qt+1^)


q2^=Ψ3(q3^)=Ψ3(2)=2 \hat{q_2}=\Psi_3(\hat{q_3})=\Psi_3(2)=2 q2^=Ψ3(q3^)=Ψ3(2)=2

q1^=Ψ2(q2^)=Ψ2(2)=2 \hat{q_1}=\Psi_2(\hat{q_2})=\Psi_2(2)=2 q1^=Ψ2(q2^)=Ψ2(2)=2

解得隐状态序列为
Q^=(2,2,2) \hat{Q}=(2,2,2) Q^=(2,2,2)
即 (健康,健康,健康)

lta_2(i)a_{i2}]b_2(o_3=不头晕)
$$

=0.0288⋅0.9=0.02592 =0.0288\cdot0.9=0.02592 =0.02880.9=0.02592

Ψ3(2)=2 \Psi_3(2)=2 Ψ3(2)=2

回溯

q3^=argmax⁡0≤i≤2[δ3(i)]=2 \hat{q_3}=arg\max_{0\le i\le2}[\delta_3(i)]=2 q3^=arg0i2max[δ3(i)]=2

qt^=Ψt+1(qt+1^) \hat{q_t}=\Psi_{t+1}(\hat{q_{t+1}}) qt^=Ψt+1(qt+1^)


q2^=Ψ3(q3^)=Ψ3(2)=2 \hat{q_2}=\Psi_3(\hat{q_3})=\Psi_3(2)=2 q2^=Ψ3(q3^)=Ψ3(2)=2

q1^=Ψ2(q2^)=Ψ2(2)=2 \hat{q_1}=\Psi_2(\hat{q_2})=\Psi_2(2)=2 q1^=Ψ2(q2^)=Ψ2(2)=2

解得隐状态序列为
Q^=(2,2,2) \hat{Q}=(2,2,2) Q^=(2,2,2)
即 (健康,健康,健康)

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐