数学原理
本章目标
- 理解 HMM 的概率生成过程——隐状态按马尔可夫链演化,观测由当前隐状态发射。
- 理解三大算法的数学本质——Forward(评估,求和)、Viterbi(解码,取最大)、Baum-Welch(学习,EM 迭代)。
- 把这些数学表达和当前源码中的
n_components、predict(...)、transmat_对应起来。
重点方法与概念速览
| 名称 | 类型 | 作用 |
|---|---|---|
| HMM 五元组 | 模型定义 | |
| 马尔可夫假设 | 核心假设 | |
| Forward 算法 | 评估算法 | 计算 |
| Viterbi 算法 | 解码算法 | 求全局最优隐状态路径 |
| Baum-Welch 算法 | 学习算法 | EM 在 HMM 上的特例——E 步 Forward-Backward 计算时序后验,M 步计数重估参数 |
transmat_ | 源码属性 | 训练后学习到的状态转移矩阵 |
1. HMM 的生成过程
HMM 描述由隐状态序列驱动观测序列的生成过程:
:以概率 选择初始隐状态 。 - 从隐状态
的发射分布中生成观测 : 。 :以概率 从 转移到 。 - 从
的发射分布中生成 。
两个基本假设:
一阶马尔可夫假设:
观测独立假设:
理解重点
- 第一条假设意味着当前状态仅由上一时刻状态决定——所有历史信息被压缩到
中。 - 第二条假设意味着当前观测仅由当前隐状态决定——观测之间条件独立。
- 当前数据生成函数
ProbabilisticData.hmm()正是按这两层结构逐步采样:先以转移隐状态,再以 发射观测。
2. 模型定义:五元组
HMM 由五元组
| 符号 | 数学含义 | 在当前源码中的对应 |
|---|---|---|
n_components=3 对应状态数 | ||
观测 obs 的取值空间 | ||
| 状态转移矩阵—— | model.transmat_ | |
| 发射矩阵—— | model.emissionprob_ | |
| 初始状态分布—— | model.startprob_ |
理解重点
的物理含义是"从状态 一步转移到状态 的概率"——对角线越大,状态越稳定,越不容易跳变。 - 当前真实
的对角线为 ——状态 1 最黏滞(80% 概率停留),状态 2 相对活跃(40% 概率跳走)。 的物理含义是"隐状态 产生观测符号 的概率"——每行描述一个隐状态的"观测偏好"。
3. 三大基本问题
HMM 经典上有三个基本问题:
| 问题 | 英文名 | 输入 | 输出 | 对应算法 | 当前源码体现 |
|---|---|---|---|---|---|
| 评估 (Evaluation) | Likelihood | Forward | model.score(X, lengths) | ||
| 解码 (Decoding) | Decoding | Viterbi | model.predict(X, lengths) | ||
| 学习 (Learning) | Training | Baum-Welch | model.fit(X, lengths) |
理解重点
- 三个问题的难度递增:评估只需单向递推,解码需要全局优化+回溯,学习需要迭代 EM。
- 当前流水线直接展示"学习 + 解码"——先
fit训练,再predict推断路径。 score(Forward 对数概率)可用于模型选择——比较不同下的拟合质量,但当前流水线仅打印准确率。
4. 问题一:评估(Forward 算法)
给定模型
暴力枚举所有
定义前向变量:
初始化(
递推(
终止:
理解重点
- 递推的核心操作是求和(
)——汇集所有到达状态 的路径概率。 - 这反映了评估问题的本质:对"所有可能路径"的概率加权求和,而非找单条最优路径。
- 当前
model.score(X, lengths)返回对数概率——值越大(负得越少),模型对观测序列的解释越好。
5. 问题二:解码(Viterbi 算法)
给定模型和观测,找最可能的单条隐状态序列:
定义 Viterbi 变量:
初始化(
递推(
终止:
回溯(
理解重点
- 递推的核心操作是取最大(
)而非求和——这是与 Forward 算法的本质区别。 记录了到达 的最佳前驱状态——回溯时沿这条"面包屑"路径重建全局最优序列。 - Viterbi 保证路径的全局合法性——相邻状态间的转移概率
,不会产生"不可能跳转"。 - 当前
model.predict(X_obs, lengths)正是 Viterbi 解码——返回全局最优隐状态路径,与state_true逐步对比算准确率。
6. 问题三:学习(Baum-Welch 算法)
给定观测序列
后向变量(Backward 算法——E 步需要):
初始化
E 步:计算时序后验
状态占有概率(单点后验):
状态转移概率(成对后验):
M 步:参数重估
初始分布:
转移矩阵:
发射矩阵:
理解重点
- Baum-Welch 的 E 步需要成对后验
——这是与普通 EM(仅需逐点后验 )的根本区别。因为 HMM 的 M 步要重估转移矩阵,需要知道相邻时间步的状态联合分布。 - Forward-Backward 是计算
和 的高效方法——两个方向的消息在 处交汇,给出完整的时序后验。 - 当前源码没有手写 Baum-Welch,而是由
hmmlearn的fit()内部完成——但数学本质完全一致。 - 对于 300 步 3 状态的序列,每轮 E 步复杂度
——比独立样本 EM 的逐点 E 步贵。
7. 数学原理如何映射到当前源码
| 数学概念 | 数学符号 | 代码实现 |
|---|---|---|
| 隐状态数 | n_components=3 | |
| 观测符号数 | 观测取值空间 | |
| 转移矩阵 | model.transmat_( | |
| 发射矩阵 | model.emissionprob_( | |
| 初始分布 | model.startprob_(长度为 3,和为 1) | |
| 观测序列概率 | model.score(X, lengths)——Forward 对数概率 | |
| 最优隐状态路径 | model.predict(X, lengths)——Viterbi 解码 | |
| 时序后验 | Forward-Backward 内部计算——不直接暴露 | |
| 最大迭代 | n_iter=100 | |
| 收敛阈值 | tol=1e-3 | |
| 序列长度 | lengths = [300] |
8. HMM vs EM (GMM) 数学对比
| 维度 | EM (GMM) | HMM |
|---|---|---|
| 数据结构 | i.i.d. 样本 | 序列 |
| 隐变量 | ||
| 隐变量依赖 | 各样本独立 | 马尔可夫链依赖 |
| 生成过程 | ||
| E 步复杂度 | ||
| E 步所需后验 | 逐点后验 | 成对后验 |
| M 步核心操作 | 责任加权平均 | 计数重估 |
| 参数数 | ||
| 预测 | 逐点 argmax | Viterbi 全局解码 |
| 收敛保证 | 对数似然单调不减 | 对数似然单调不减 |
常见坑
- 把
state_true误当成 Baum-Welch 训练输入——实际上当前训练只依赖观测序列,state_true仅用于评估。 - 混淆 Forward(求和)和 Viterbi(取最大)的递推公式——两者的目标不同(评估 vs 解码),操作符不同(
vs )。 - 以为 Baum-Welch 的 E 步和 GMM 的 E 步完全一样——HMM 需要成对后验
,因为转移矩阵的重估依赖相邻时间步的联合分布。 - 把解码问题和评估问题混为一谈——"路径最优"(Viterbi)和"概率最大"(Forward)是两回事。
小结
- HMM 的数学核心链:马尔可夫假设 → 五元组定义 → 三大问题(评估/解码/学习)→ Forward(求和递推)/ Viterbi(取最大递推+回溯)/ Baum-Welch(Forward-Backward + 计数重估)。
- 与 EM (GMM) 的根本区别:HMM 的隐变量有时间依赖(马尔可夫链),E 步需成对后验
,预测需 Viterbi 全局解码——而非逐点独立计算。 - 当前源码
CategoricalHMM(n_components=3, n_iter=100)将上述数学全部封装在fit/predict/score三个方法中——transmat_、emissionprob_、startprob_是训练后的可直接检验的参数。