Skip to content

数学原理

本章目标

  1. 理解 HMM 的概率生成过程——隐状态按马尔可夫链演化,观测由当前隐状态发射。
  2. 理解三大算法的数学本质——Forward(评估,求和)、Viterbi(解码,取最大)、Baum-Welch(学习,EM 迭代)。
  3. 把这些数学表达和当前源码中的 n_componentspredict(...)transmat_ 对应起来。

重点方法与概念速览

名称类型作用
HMM 五元组模型定义λ=(S,O,A,B,π)——完整描述离散 HMM 的概率参数
马尔可夫假设核心假设P(qtqt1,,q1)=P(qtqt1)——未来仅依赖当前,与历史无关
Forward 算法评估算法计算 P(Oλ)——观测序列在当前模型下的概率,复杂度 O(N2T)
Viterbi 算法解码算法求全局最优隐状态路径 Q=argmaxQP(QO,λ)
Baum-Welch 算法学习算法EM 在 HMM 上的特例——E 步 Forward-Backward 计算时序后验,M 步计数重估参数
transmat_源码属性训练后学习到的状态转移矩阵 A3×3,行和为 1)

1. HMM 的生成过程

HMM 描述由隐状态序列驱动观测序列的生成过程:

  1. t=1:以概率 πi 选择初始隐状态 q1=si
  2. 从隐状态 q1 的发射分布中生成观测 o1P(o1=vkq1=si)=bi(k)
  3. t2:以概率 aijqt1=si 转移到 qt=sj
  4. qt 的发射分布中生成 ot

两个基本假设:

一阶马尔可夫假设

P(qtqt1,qt2,,q1)=P(qtqt1)

观测独立假设

P(otq1,,qT,o1,,oT)=P(otqt)

理解重点

  • 第一条假设意味着当前状态仅由上一时刻状态决定——所有历史信息被压缩到 qt1 中。
  • 第二条假设意味着当前观测仅由当前隐状态决定——观测之间条件独立。
  • 当前数据生成函数 ProbabilisticData.hmm() 正是按这两层结构逐步采样:先以 A 转移隐状态,再以 B 发射观测。

2. 模型定义:五元组

HMM 由五元组 λ=(S,O,A,B,π) 定义:

符号数学含义在当前源码中的对应
S={s1,,sN}N 个隐状态集合n_components=3 对应状态数
O={v1,,vM}M 个离散观测符号集合观测 obs 的取值空间 {0,1,2}
A=[aij]N×N状态转移矩阵——aij=P(qt+1=sjqt=si),行和为 1model.transmat_
B=[bi(k)]N×M发射矩阵——bi(k)=P(ot=vkqt=si),行和为 1model.emissionprob_
π=[πi]1×N初始状态分布——πi=P(q1=si),和为 1model.startprob_

理解重点

  • Aij 的物理含义是"从状态 i 一步转移到状态 j 的概率"——对角线越大,状态越稳定,越不容易跳变。
  • 当前真实 A 的对角线为 [0.80,0.60,0.70]——状态 1 最黏滞(80% 概率停留),状态 2 相对活跃(40% 概率跳走)。
  • Bi(k) 的物理含义是"隐状态 i 产生观测符号 k 的概率"——每行描述一个隐状态的"观测偏好"。

3. 三大基本问题

HMM 经典上有三个基本问题:

问题英文名输入输出对应算法当前源码体现
评估 (Evaluation)LikelihoodλOP(Oλ)Forwardmodel.score(X, lengths)
解码 (Decoding)DecodingλOQViterbimodel.predict(X, lengths)
学习 (Learning)TrainingOλBaum-Welchmodel.fit(X, lengths)

理解重点

  • 三个问题的难度递增:评估只需单向递推,解码需要全局优化+回溯,学习需要迭代 EM。
  • 当前流水线直接展示"学习 + 解码"——先 fit 训练,再 predict 推断路径。
  • score(Forward 对数概率)可用于模型选择——比较不同 K 下的拟合质量,但当前流水线仅打印准确率。

4. 问题一:评估(Forward 算法)

给定模型 λ 和观测序列 O=(o1,,oT),计算:

P(Oλ)=所有路径 QP(OQ,λ)P(Qλ)

暴力枚举所有 NT 条路径不可行——Forward 算法用动态规划将复杂度降为 O(N2T)

定义前向变量

αt(i)=P(o1,o2,,ot,qt=siλ)

初始化t=1):

α1(i)=πibi(o1),i=1,,N

递推t=1T1):

αt+1(j)=[i=1Nαt(i)aij]bj(ot+1)

终止

P(Oλ)=i=1NαT(i)

理解重点

  • 递推的核心操作是求和i)——汇集所有到达状态 j 的路径概率。
  • 这反映了评估问题的本质:对"所有可能路径"的概率加权求和,而非找单条最优路径。
  • 当前 model.score(X, lengths) 返回对数概率 logP(Oλ)——值越大(负得越少),模型对观测序列的解释越好。

5. 问题二:解码(Viterbi 算法)

给定模型和观测,找最可能的单条隐状态序列:

Q=argmaxQP(QO,λ)

定义 Viterbi 变量

δt(i)=maxq1,,qt1P(q1,,qt=si,o1,,otλ)

初始化t=1):

δ1(i)=πibi(o1),ψ1(i)=0

递推t=2T):

δt(j)=max1iN[δt1(i)aij]bj(ot)ψt(j)=argmax1iN[δt1(i)aij]

终止

P=max1iNδT(i),qT=argmaxiδT(i)

回溯t=T11):

qt=ψt+1(qt+1)

理解重点

  • 递推的核心操作是取最大maxi)而非求和——这是与 Forward 算法的本质区别。
  • ψt(j) 记录了到达 (t,j) 的最佳前驱状态——回溯时沿这条"面包屑"路径重建全局最优序列。
  • Viterbi 保证路径的全局合法性——相邻状态间的转移概率 aij>0,不会产生"不可能跳转"。
  • 当前 model.predict(X_obs, lengths) 正是 Viterbi 解码——返回全局最优隐状态路径,与 state_true 逐步对比算准确率。

6. 问题三:学习(Baum-Welch 算法)

给定观测序列 O,估计模型参数 λ。Baum-Welch 是 EM 在 HMM 上的特例。

后向变量(Backward 算法——E 步需要):

βt(i)=P(ot+1,,oTqt=si,λ)

初始化 βT(i)=1,逆向递推:

βt(i)=j=1Naijbj(ot+1)βt+1(j)

E 步:计算时序后验

状态占有概率(单点后验):

γt(i)=P(qt=siO,λ)=αt(i)βt(i)P(Oλ)

状态转移概率(成对后验):

ξt(i,j)=P(qt=si,qt+1=sjO,λ)=αt(i)aijbj(ot+1)βt+1(j)P(Oλ)

M 步:参数重估

初始分布:

π^i=γ1(i)

转移矩阵:

a^ij=t=1T1ξt(i,j)t=1T1γt(i)

发射矩阵:

b^i(k)=t=1Tγt(i)1(ot=vk)t=1Tγt(i)

理解重点

  • Baum-Welch 的 E 步需要成对后验 ξt(i,j)——这是与普通 EM(仅需逐点后验 γik)的根本区别。因为 HMM 的 M 步要重估转移矩阵,需要知道相邻时间步的状态联合分布。
  • Forward-Backward 是计算 γt(i)ξt(i,j) 的高效方法——两个方向的消息在 t 处交汇,给出完整的时序后验。
  • 当前源码没有手写 Baum-Welch,而是由 hmmlearnfit() 内部完成——但数学本质完全一致。
  • 对于 300 步 3 状态的序列,每轮 E 步复杂度 O(300×32)=O(2700)——比独立样本 EM 的逐点 E 步贵。

7. 数学原理如何映射到当前源码

数学概念数学符号代码实现
隐状态数Nn_components=3
观测符号数M观测取值空间 {0,1,2}
转移矩阵aij=P(qt+1=sjqt=si)model.transmat_3×3,行和为 1)
发射矩阵bi(k)=P(ot=vkqt=si)model.emissionprob_3×3,行和为 1)
初始分布πi=P(q1=si)model.startprob_(长度为 3,和为 1)
观测序列概率P(Oλ)model.score(X, lengths)——Forward 对数概率
最优隐状态路径Q=argmaxQP(QO,λ)model.predict(X, lengths)——Viterbi 解码
时序后验γt(i)Forward-Backward 内部计算——不直接暴露
最大迭代Tmaxn_iter=100
收敛阈值|logP(t+1)logP(t)|<εtol=1e-3
序列长度Tlengths = [300]

8. HMM vs EM (GMM) 数学对比

维度EM (GMM)HMM
数据结构i.i.d. 样本 {xi}i=1N序列 {ot}t=1T——时间有序
隐变量zik——样本 i 属于分量 kqt——时间 t 的隐状态
隐变量依赖各样本独立马尔可夫链依赖 qtqt+1
生成过程πkzikN(μk,Σk)xiqt1AqtBot——链式生成
E 步复杂度O(NK)——逐点独立计算O(TN2)——Forward-Backward 时间耦合
E 步所需后验逐点后验 γ(zik)成对后验 ξt(i,j)——重估转移矩阵必需
M 步核心操作责任加权平均 μkΣk计数重估 ABπ
参数数K(d(d+1)2+d+1)N2+NM+N
预测逐点 argmax argmaxkγ(zik)Viterbi 全局解码 argmaxQP(QO)
收敛保证对数似然单调不减对数似然单调不减

常见坑

  1. state_true 误当成 Baum-Welch 训练输入——实际上当前训练只依赖观测序列,state_true 仅用于评估。
  2. 混淆 Forward(求和)和 Viterbi(取最大)的递推公式——两者的目标不同(评估 vs 解码),操作符不同( vs max)。
  3. 以为 Baum-Welch 的 E 步和 GMM 的 E 步完全一样——HMM 需要成对后验 ξt(i,j),因为转移矩阵的重估依赖相邻时间步的联合分布。
  4. 把解码问题和评估问题混为一谈——"路径最优"(Viterbi)和"概率最大"(Forward)是两回事。

小结

  • HMM 的数学核心链:马尔可夫假设 → 五元组定义 → 三大问题(评估/解码/学习)→ Forward(求和递推)/ Viterbi(取最大递推+回溯)/ Baum-Welch(Forward-Backward + 计数重估)。
  • 与 EM (GMM) 的根本区别:HMM 的隐变量有时间依赖(马尔可夫链),E 步需成对后验 ξt(i,j),预测需 Viterbi 全局解码——而非逐点独立计算。
  • 当前源码 CategoricalHMM(n_components=3, n_iter=100) 将上述数学全部封装在 fit/predict/score 三个方法中——transmat_emissionprob_startprob_ 是训练后的可直接检验的参数。