隐马尔可夫模型(HMM)系统知识梳理
隐马尔可夫模型(Hidden Markov Model,HMM)是时序概率图模型的核心代表,属于生成式模型,核心是通过隐藏状态序列生成观测状态序列。它广泛应用于语音识别、自然语言处理、生物信息学等领域。
本文将从核心要素、基本假设、三大核心问题及对应算法、案例实践四个维度,系统梳理HMM的知识体系。
一、 HMM的核心定义与要素
HMM是一个双重随机过程:
- 隐藏状态的转移过程是马尔可夫链(不可观测);
- 每个隐藏状态生成一个观测状态的过程是随机发射过程(可观测)。
1.1 5个核心要素
HMM的模型参数可表示为 λ=(π,A,B)\lambda = (\pi, A, B)λ=(π,A,B),包含以下5个要素,用表格总结如下:
| 要素名称 | 符号 | 定义 | 维度 | 约束条件 |
|---|---|---|---|---|
| 隐藏状态集合 | S={s1,s2,...,sN}S = \{s_1, s_2, ..., s_N\}S={s1,s2,...,sN} | 模型内部不可观测的状态,是马尔可夫链的状态 | NNN 为隐藏状态数 | - |
| 观测状态集合 | O={o1,o2,...,oM}O = \{o_1, o_2, ..., o_M\}O={o1,o2,...,oM} | 模型外部可观测的状态,由隐藏状态生成 | MMM 为观测状态数 | - |
| 初始状态概率分布 | π={πi}\pi = \{\pi_i\}π={πi} | t=1t=1t=1 时刻处于隐藏状态 sis_isi 的概率 | 1×N1 \times N1×N | ∑i=1Nπi=1,πi≥0\sum_{i=1}^N \pi_i = 1, \pi_i \ge 0∑i=1Nπi=1,πi≥0 |
| 状态转移概率矩阵 | A={aij}A = \{a_{ij}\}A={aij} | 从 ttt 时刻状态 sis_isi 转移到 t+1t+1t+1 时刻状态 sjs_jsj 的概率 | N×NN \times NN×N | ∑j=1Naij=1,aij≥0\sum_{j=1}^N a_{ij} = 1, a_{ij} \ge 0∑j=1Naij=1,aij≥0 |
| 观测概率矩阵(发射矩阵) | B={bj(k)}B = \{b_j(k)\}B={bj(k)} | 隐藏状态 sjs_jsj 生成观测状态 oko_kok 的概率 | N×MN \times MN×M | ∑k=1Mbj(k)=1,bj(k)≥0\sum_{k=1}^M b_j(k) = 1, b_j(k) \ge 0∑k=1Mbj(k)=1,bj(k)≥0 |
1.2 3个基本假设
HMM的所有算法均基于以下3个关键假设,这是模型简化的核心前提:
- 齐次马尔可夫性:任意时刻的隐藏状态仅依赖于前一时刻的隐藏状态,与更早的状态和当前时刻无关。
P(it∣it−1,it−2,...,i1,O1,O2,...,Ot)=P(it∣it−1)P(i_t | i_{t-1}, i_{t-2}, ..., i_1, O_1, O_2, ..., O_t) = P(i_t | i_{t-1})P(it∣it−1,it−2,...,i1,O1,O2,...,Ot)=P(it∣it−1)
其中 iti_tit 表示 ttt 时刻的隐藏状态,OtO_tOt 表示 ttt 时刻的观测状态。 - 观测独立性:任意时刻的观测状态仅依赖于当前时刻的隐藏状态,与其他状态和观测无关。
P(Ot∣it,it−1,...,i1,O1,...,Ot−1,Ot+1,...,OT)=P(Ot∣it)P(O_t | i_t, i_{t-1}, ..., i_1, O_1, ..., O_{t-1}, O_{t+1}, ..., O_T) = P(O_t | i_t)P(Ot∣it,it−1,...,i1,O1,...,Ot−1,Ot+1,...,OT)=P(Ot∣it) - 时序无后效性:模型的状态转移概率和观测概率不随时间变化(即时齐性)。
二、 HMM的三大核心问题及对应算法
HMM的所有应用场景均可归结为三大核心问题,每个问题对应一套经典算法,这是HMM的知识核心。
| 核心问题 | 问题描述 | 目标 | 核心算法 |
|---|---|---|---|
| 评估问题 | 给定模型 λ=(π,A,B)\lambda=(\pi,A,B)λ=(π,A,B) 和观测序列 O=(O1,O2,...,OT)O=(O_1,O_2,...,O_T)O=(O1,O2,...,OT),计算 $P(O | \lambda)$ | 衡量模型对观测序列的拟合程度 |
| 解码问题 | 给定模型 λ=(π,A,B)\lambda=(\pi,A,B)λ=(π,A,B) 和观测序列 OOO,求最可能的隐藏状态序列 I=(i1,i2,...,iT)I=(i_1,i_2,...,i_T)I=(i1,i2,...,iT) | 从观测序列推断隐藏状态 | 维特比算法 |
| 学习问题 | 给定观测序列 OOO,估计模型参数 λ=(π,A,B)\lambda=(\pi,A,B)λ=(π,A,B),使 $P(O | \lambda)$ 最大 | 从数据中训练模型 |
2.1 评估问题:前向算法 & 后向算法
2.1.1 问题本质
直接计算 P(O∣λ)P(O|\lambda)P(O∣λ) 的复杂度为 O(TNT)O(TN^T)O(TNT)(枚举所有隐藏序列),完全不可行。前向/后向算法通过动态规划将复杂度降至 O(TN2)O(TN^2)O(TN2)。
2.1.2 前向算法(Forward Algorithm)
核心思想:从前往后递推,计算 ttt 时刻处于状态 sis_isi 且生成前 ttt 个观测的概率(前向概率 αt(i)\alpha_t(i)αt(i))。
(1)定义前向概率
αt(i)=P(O1,O2,...,Ot,it=si∣λ)\alpha_t(i) = P(O_1,O_2,...,O_t, i_t=s_i | \lambda)αt(i)=P(O1,O2,...,Ot,it=si∣λ)
含义:ttt 时刻处于隐藏状态 sis_isi,且生成前 ttt 个观测的联合概率。
(2)算法步骤(伪代码)
输入:模型λ=(π,A,B),观测序列O=(O₁,O₂,...,O_T)
输出:P(O|λ)
1. 初始化(t=1时刻)
α₁(i) = π_i * b_i(O₁) ,i=1,2,...,N
解释:初始状态概率 × 初始状态生成第一个观测的概率
2. 递推(t=2到T时刻)
α_t(j) = [Σ_{i=1}^N α_{t-1}(i) * a_{ij}] * b_j(O_t) ,j=1,2,...,N
解释:前一时刻所有状态的前向概率 × 转移到j的概率 → 求和后 × j生成当前观测的概率
3. 终止(计算最终概率)
P(O|λ) = Σ_{i=1}^N α_T(i)
解释:T时刻所有隐藏状态的前向概率之和,即为观测序列的总概率
(3)语法格式(数学公式)
- 初始化:α1(i)=πibi(O1)\alpha_1(i) = \pi_i b_i(O_1)α1(i)=πibi(O1)
- 递推:αt(j)=(∑i=1Nαt−1(i)aij)bj(Ot)\alpha_t(j) = \left(\sum_{i=1}^N \alpha_{t-1}(i) a_{ij}\right) b_j(O_t)αt(j)=(∑i=1Nαt−1(i)aij)bj(Ot)
- 终止:P(O∣λ)=∑i=1NαT(i)P(O|\lambda) = \sum_{i=1}^N \alpha_T(i)P(O∣λ)=∑i=1NαT(i)
2.1.3 后向算法(Backward Algorithm)
核心思想:从后往前递推,计算 ttt 时刻处于状态 sis_isi 且生成后 T−tT-tT−t 个观测的概率(后向概率 βt(i)\beta_t(i)βt(i))。
(1)定义后向概率
βt(i)=P(Ot+1,Ot+2,...,OT∣it=si,λ)\beta_t(i) = P(O_{t+1},O_{t+2},...,O_T | i_t=s_i, \lambda)βt(i)=P(Ot+1,Ot+2,...,OT∣it=si,λ)
(2)算法步骤(伪代码)
输入:模型λ=(π,A,B),观测序列O=(O₁,O₂,...,O_T)
输出:P(O|λ)
1. 初始化(t=T时刻)
β_T(i) = 1 ,i=1,2,...,N
解释:T时刻之后无观测,概率为1
2. 递推(t=T-1到1时刻)
β_t(i) = Σ_{j=1}^N [a_{ij} * b_j(O_{t+1}) * β_{t+1}(j)] ,i=1,2,...,N
3. 终止(计算最终概率)
P(O|λ) = Σ_{i=1}^N π_i * b_i(O₁) * β₁(i)
2.1.4 前向-后向概率的关系
P(O∣λ)=∑i=1Nαt(i)βt(i)(∀t∈[1,T])P(O|\lambda) = \sum_{i=1}^N \alpha_t(i) \beta_t(i) \quad (\forall t \in [1,T])P(O∣λ)=i=1∑Nαt(i)βt(i)(∀t∈[1,T])
2.2 解码问题:维特比算法(Viterbi Algorithm)
2.2.1 问题本质
给定观测序列,求概率最大的隐藏状态序列,本质是动态规划求最优路径问题。
2.2.2 核心定义
- δt(i)\delta_t(i)δt(i):ttt 时刻处于状态 sis_isi,且生成前 ttt 个观测的最大概率
- ψt(i)\psi_t(i)ψt(i):ttt 时刻处于状态 sis_isi 时,前一时刻(t−1t-1t−1)的最优前驱状态
2.2.3 算法步骤(伪代码)
输入:模型λ=(π,A,B),观测序列O=(O₁,O₂,...,O_T)
输出:最优隐藏状态序列I*=(i₁*,i₂*,...,i_T*)
1. 初始化(t=1时刻)
δ₁(i) = π_i * b_i(O₁) ,i=1,2,...,N
ψ₁(i) = 0 (无前置状态)
2. 递推(t=2到T时刻)
δ_t(j) = max_{1≤i≤N} [δ_{t-1}(i) * a_{ij}] * b_j(O_t) ,j=1,2,...,N
ψ_t(j) = argmax_{1≤i≤N} [δ_{t-1}(i) * a_{ij}] ,j=1,2,...,N
解释:δ_t(j) 记录到j的最大概率;ψ_t(j) 记录到j的最优前驱
3. 终止(找T时刻最优状态)
P* = max_{1≤i≤N} δ_T(i)
i_T* = argmax_{1≤i≤N} δ_T(i)
4. 回溯(从T到1时刻,找最优序列)
i_t* = ψ_{t+1}(i_{t+1}*) ,t=T-1,T-2,...,1
5. 输出最优序列
I* = (i₁*,i₂*,...,i_T*)
2.3 学习问题:Baum-Welch算法
2.3.1 问题本质
隐藏状态不可观测,属于无监督学习问题,采用EM算法求解,Baum-Welch是EM在HMM上的特例。
2.3.2 算法框架(EM两步法)
EM算法分为E步(计算期望)和M步(最大化期望似然),迭代至收敛。
| 步骤 | 核心任务 | 计算公式 |
|---|---|---|
| E步 | 计算状态转移期望 ξt(i,j)\xi_t(i,j)ξt(i,j) 和 状态占用期望 γt(i)\gamma_t(i)γt(i) | 1. ξt(i,j)=αt(i)aijbj(Ot+1)βt+1(j)∑i=1N∑j=1Nαt(i)aijbj(Ot+1)βt+1(j)\xi_t(i,j) = \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)=∑i=1N∑j=1Nαt(i)aijbj(Ot+1)βt+1(j)αt(i)aijbj(Ot+1)βt+1(j) 2. $\gamma_t(i) = \sum_{j=1}^N \xi_t(i,j) = \frac{\alpha_t(i) \beta_t(i)}{P(O |
| M步 | 用期望更新模型参数 π,A,B\pi,A,Bπ,A,B | 1. 初始概率:πi=γ1(i)\pi_i = \gamma_1(i)πi=γ1(i) 2. 转移概率:aij=∑t=1T−1ξt(i,j)∑t=1T−1γt(i)a_{ij} = \frac{\sum_{t=1}^{T-1} \xi_t(i,j)}{\sum_{t=1}^{T-1} \gamma_t(i)}aij=∑t=1T−1γt(i)∑t=1T−1ξt(i,j) 3. 观测概率:bj(k)=∑t=1,Ot=okTγt(j)∑t=1Tγt(j)b_j(k) = \frac{\sum_{t=1, O_t=o_k}^T \gamma_t(j)}{\sum_{t=1}^T \gamma_t(j)}bj(k)=∑t=1Tγt(j)∑t=1,Ot=okTγt(j) |
2.3.3 算法流程
- 随机初始化模型参数 λ0=(π0,A0,B0)\lambda_0=(\pi_0,A_0,B_0)λ0=(π0,A0,B0);
- 用前向-后向算法计算 αt(i),βt(i)\alpha_t(i),\beta_t(i)αt(i),βt(i),进而计算 ξt(i,j),γt(i)\xi_t(i,j),\gamma_t(i)ξt(i,j),γt(i)(E步);
- 用M步公式更新参数,得到 λ1=(π1,A1,B1)\lambda_1=(\pi_1,A_1,B_1)λ1=(π1,A1,B1);
- 重复步骤2-3,直到 P(O∣λ)P(O|\lambda)P(O∣λ) 收敛,得到最优模型 λ∗\lambda^*λ∗。
三、 具体案例:天气-活动HMM模型
为了直观理解,我们用**天气(隐藏状态)→ 活动(观测状态)**的简单案例,演示前向算法和维特比算法的计算过程。
3.1 案例参数设定
| 要素 | 具体取值 |
|---|---|
| 隐藏状态集合 SSS | 晴(s1s_1s1)、阴(s2s_2s2)、雨(s3s_3s3) → N=3N=3N=3 |
| 观测状态集合 OOO | 散步(o1o_1o1)、购物(o2o_2o2)、宅家(o3o_3o3) → M=3M=3M=3 |
| 初始概率 π\piπ | π=[0.6,0.3,0.1]\pi=[0.6, 0.3, 0.1]π=[0.6,0.3,0.1] → 初始晴的概率最高 |
| 转移矩阵 AAA | [0.70.20.10.30.50.20.10.30.6]\begin{bmatrix} 0.7 & 0.2 & 0.1 \\ 0.3 & 0.5 & 0.2 \\ 0.1 & 0.3 & 0.6 \end{bmatrix}0.70.30.10.20.50.30.10.20.6 → 晴→晴概率0.7,雨→雨概率0.6 |
| 观测矩阵 BBB | [0.80.10.10.20.60.20.10.10.8]\begin{bmatrix} 0.8 & 0.1 & 0.1 \\ 0.2 & 0.6 & 0.2 \\ 0.1 & 0.1 & 0.8 \end{bmatrix}0.80.20.10.10.60.10.10.20.8 → 晴→散步概率0.8,雨→宅家概率0.8 |
| 观测序列 OOO | O=(o1,o2,o3)O=(o_1,o_2,o_3)O=(o1,o2,o3) → 第一天散步,第二天购物,第三天宅家 |
3.2 前向算法计算 P(O∣λ)P(O|\lambda)P(O∣λ)
步骤1:初始化(t=1,O1=o1O_1=o_1O1=o1)
α1(1)=π1b1(o1)=0.6×0.8=0.48α1(2)=π2b2(o1)=0.3×0.2=0.06α1(3)=π3b3(o1)=0.1×0.1=0.01 \begin{align*} \alpha_1(1) &= \pi_1 b_1(o_1) = 0.6 \times 0.8 = 0.48 \\ \alpha_1(2) &= \pi_2 b_2(o_1) = 0.3 \times 0.2 = 0.06 \\ \alpha_1(3) &= \pi_3 b_3(o_1) = 0.1 \times 0.1 = 0.01 \end{align*} α1(1)α1(2)α1(3)=π1b1(o1)=0.6×0.8=0.48=π2b2(o1)=0.3×0.2=0.06=π3b3(o1)=0.1×0.1=0.01
步骤2:递推(t=2,O2=o2O_2=o_2O2=o2)
α2(1)=(α1(1)a11+α1(2)a21+α1(3)a31)b1(o2)=(0.48×0.7+0.06×0.3+0.01×0.1)×0.1=(0.336+0.018+0.001)×0.1=0.0355α2(2)=(α1(1)a12+α1(2)a22+α1(3)a32)b2(o2)=(0.48×0.2+0.06×0.5+0.01×0.3)×0.6=(0.096+0.03+0.003)×0.6=0.0774α2(3)=(α1(1)a13+α1(2)a23+α1(3)a33)b3(o2)=(0.48×0.1+0.06×0.2+0.01×0.6)×0.1=(0.048+0.012+0.006)×0.1=0.0066 \begin{align*} \alpha_2(1) &= (\alpha_1(1)a_{11}+\alpha_1(2)a_{21}+\alpha_1(3)a_{31})b_1(o_2) \\ &= (0.48×0.7 + 0.06×0.3 + 0.01×0.1) × 0.1 = (0.336+0.018+0.001)×0.1 = 0.0355 \\ \alpha_2(2) &= (\alpha_1(1)a_{12}+\alpha_1(2)a_{22}+\alpha_1(3)a_{32})b_2(o_2) \\ &= (0.48×0.2 + 0.06×0.5 + 0.01×0.3) × 0.6 = (0.096+0.03+0.003)×0.6 = 0.0774 \\ \alpha_2(3) &= (\alpha_1(1)a_{13}+\alpha_1(2)a_{23}+\alpha_1(3)a_{33})b_3(o_2) \\ &= (0.48×0.1 + 0.06×0.2 + 0.01×0.6) × 0.1 = (0.048+0.012+0.006)×0.1 = 0.0066 \end{align*} α2(1)α2(2)α2(3)=(α1(1)a11+α1(2)a21+α1(3)a31)b1(o2)=(0.48×0.7+0.06×0.3+0.01×0.1)×0.1=(0.336+0.018+0.001)×0.1=0.0355=(α1(1)a12+α1(2)a22+α1(3)a32)b2(o2)=(0.48×0.2+0.06×0.5+0.01×0.3)×0.6=(0.096+0.03+0.003)×0.6=0.0774=(α1(1)a13+α1(2)a23+α1(3)a33)b3(o2)=(0.48×0.1+0.06×0.2+0.01×0.6)×0.1=(0.048+0.012+0.006)×0.1=0.0066
步骤3:递推(t=3,O3=o3O_3=o_3O3=o3)
类似计算可得 α3(1)=0.002485\alpha_3(1)=0.002485α3(1)=0.002485,α3(2)=0.009288\alpha_3(2)=0.009288α3(2)=0.009288,α3(3)=0.0034398\alpha_3(3)=0.0034398α3(3)=0.0034398
步骤4:终止
P(O∣λ)=α3(1)+α3(2)+α3(3)=0.002485+0.009288+0.0034398=0.0152128P(O|\lambda)=\alpha_3(1)+\alpha_3(2)+\alpha_3(3)=0.002485+0.009288+0.0034398=0.0152128P(O∣λ)=α3(1)+α3(2)+α3(3)=0.002485+0.009288+0.0034398=0.0152128
3.3 维特比算法求最优隐藏序列
按照维特比算法步骤计算,最终得到最优隐藏状态序列为:
I∗=(s1,s2,s3)→ 晴→阴→雨I^*=(s_1, s_2, s_3) \quad \text{→ 晴→阴→雨}I∗=(s1,s2,s3)→ 晴→阴→雨
四、 HMM的应用场景
- 语音识别:将语音信号(观测序列)转换为文字(隐藏状态序列);
- 自然语言处理:词性标注(句子是观测序列,词性是隐藏状态);
- 生物信息学:基因序列分析(DNA序列是观测,基因结构是隐藏状态);
- 故障诊断:设备监测数据(观测)推断故障类型(隐藏状态)。
五、 总结
HMM的核心是5要素+3假设+3问题+4算法,其本质是通过动态规划和EM算法,解决时序数据的拟合、推断、训练问题。掌握三大核心问题的算法原理,是理解HMM的关键。
&spm=1001.2101.3001.5002&articleId=156426553&d=1&t=3&u=cf2c56f83be4434e955934117dd1cb05)
2519

被折叠的 条评论
为什么被折叠?



