原力注入

一文读懂隐马尔可夫模型(HMM)

一文读懂隐马尔可夫模型(HMM)

隐马尔可夫模型(Hidden Markov Model, HMM)是统计学习中经典的时序建模方法,广泛用于语音识别、自然语言处理、金融分析等场景。它通过引入隐藏状态,对具有时序依赖性但又存在不可观测因素的数据进行建模与推理。


1. HMM 是什么?

隐马尔可夫模型(Hidden Markov Model,简称 HMM)是一种对含有隐变量的时序数据进行建模的概率生成模型,广泛应用于语音识别、自然语言处理、生物信息学、金融分析等领域。其核心思想是利用一组不可直接观测的隐藏状态序列,来解释观测数据随时间变化的依赖结构。HMM 的建模依赖两个关键假设:

  • 一阶马尔可夫性:当前隐藏状态只依赖于前一个状态,即
  • 观测条件独立性:当前观测值仅由当前隐藏状态决定,且与历史状态和观测无关,即

1.1 HMM 与马尔可夫链的关系

HMM 可以看作是在马尔可夫链基础上的扩展,它引入了“隐藏状态”这一不可观测层:

模型
描述
马尔可夫链
建模可观测状态序列之间的转移关系,具有无记忆性。
HMM
假设真实状态是不可观测的,模型通过这些隐藏状态生成观测值,形成“状态-观测”双层结构。

HMM 是一种生成模型(Generative Model),能够建模状态序列和观测序列的联合分布,从而具备模拟与推断能力。


1.2 模型结构图解

HMM 的结构可以用以下图示表示:

隐藏状态层:     S₁ → S₂ → S₃ → ... → S_T
                 ↓    ↓    ↓         ↓
观测变量层:     O₁   O₂   O₃  ...   O_T
  • :时刻  的隐藏状态,如天气的“晴”或“雨”,模型无法直接观测。
  • :时刻  的观测值,如人的活动“散步”或“打游戏”,由  的发射概率生成。

1.3 核心机制

HMM 的建模过程可拆分为两个层次:

  1. 上层:隐藏状态序列隐藏状态构成一个一阶马尔可夫链,其状态转移由转移概率矩阵  控制:

  2. 下层:观测值序列每个隐藏状态  独立地产生一个观测值 ,其概率由发射矩阵  决定:

这种结构使得 HMM 可以在仅有观测数据的情况下,推断隐藏的状态序列,或用于判断观测序列是否符合某种状态演化模式。


1.4 模型特点概览

维度
描述
隐状态不可观测
模型需要通过观测数据间接推断真实状态序列
时序依赖性
状态间具有一阶依赖,观测随时间推进生成
生成建模能力
能模拟  的联合分布,支持生成与推断两种任务

因此,HMM 是处理**部分可观测时序问题(Partially Observable Sequences)**的经典方法,具有很强的建模解释力。


2. HMM 的基本组成

一个隐马尔可夫模型(Hidden Markov Model, HMM)由以下五个组成部分(五元组)定义:

下表列出了各参数的数学定义与物理含义:

成分
数学表示
含义说明
维度
状态集合
模型可能处于的所有隐藏状态(如天气的“晴/雨”)
 个离散状态
观测集合
所有可能出现的观测符号(如“散步/购物/打游戏”)
 个离散观测值
状态转移矩阵
当前状态转移到下一个状态的概率
,每行和为 1
观测概率矩阵
在隐藏状态  下生成观测值  的概率
,每行和为 1
初始状态分布
系统在初始时刻处于状态  的概率
 维向量,元素和为 1

注:

  • 实际观测序列记作 ,是从  中取出的时序序列。
  • 上述定义基于离散观测 HMM;在连续观测场景中, 通常使用概率密度函数(如高斯分布)替代离散概率表。

2.1 参数的可视化示例

以天气预测模型为例,假设隐藏状态为“晴”()和“雨”(),观测值为“散步”、“购物”、“打游戏”。

状态转移矩阵 :

观测概率矩阵 :

初始分布 :


2.2 不确定性的来源

HMM 的建模能力依赖于对双重不确定性的刻画:

  1. 状态转移的不确定性(由  控制): 描述系统状态随时间演化的不确定性,例如:“今天晴天,有 30% 可能转为明天下雨”。

  2. 观测生成的不确定性(由  控制): 描述观测结果与隐藏状态的非确定性关联,例如:“即使是雨天,仍有 40% 的可能观测到‘购物’”。

这种“双层不确定性”结构使得 HMM 能够有效应对现实中部分可观测的时序系统,如语音识别、用户行为分析、金融市场建模等。

理解  三个参数的作用,是后续掌握 HMM 三大基本问题(评估、解码、学习)的基础。


3. HMM 的三个基本问题

隐马尔可夫模型的核心应用围绕以下三个基本问题展开:评估、解码与学习。理解这些问题及其解决方法,是掌握 HMM 的关键。本节以天气预测为例(参数见第4节),帮助读者建立直观认知。


3.1 评估问题(Evaluation)

问题定义给定模型  和观测序列 ,计算该观测序列出现的概率 。

3.1.1 作用意义

  • 模型匹配度评估:判断当前模型是否“合理”地解释观测数据。
  • 作为比较基础:如语音识别中,对比多个模型得分,选择概率最高者。

3.1.2 算法与复杂度

算法
核心原理
时间复杂度
空间复杂度
前向算法
动态规划求 
后向算法
自右向左递推 
同前
同前

关键公式(前向算法):

示例计算(天气模型,):

  • 状态数 ,共需  次乘加计算;
  • 得到 (详见第5节)。

3.2 解码问题(Decoding)

问题定义给定模型  和观测序列 ,寻找最可能的隐藏状态序列:

3.2.1 作用意义

  • 状态推断:通过外在行为反推出隐藏因果过程(如推测天气序列)。
  • 广泛应用于序列标注任务,如词性标注、基因片段识别等。

3.2.2 核心算法

算法
核心思想
与评估问题的区别
时间复杂度
维特比算法
动态规划记录最优路径概率及其前驱状态
将  替换为 ,并记录回溯路径

关键公式(维特比算法):

递推步骤(计算到状态  的最优路径概率):

路径记录步骤(记录到达状态  的最佳前驱状态):

  • :表示在时间  时,以状态  结尾的最优路径的概率值。
  • :表示该最优路径在  时刻来自的最佳前驱状态。
  • 维特比算法与前向算法类似,使用动态规划,但将所有概率求和()操作替换为最大值(),用于寻找概率最大的路径而非整体概率。

3.2.3 与 CRF 对比

模型类型
HMM(生成式)
CRF(判别式)
建模目标
联合分布 
条件分布 
特征建模
仅依赖当前状态
支持复杂上下文特征
训练数据
可缺失状态序列
需完整标注序列

3.3 学习问题(Learning)

问题定义给定多个观测序列 ,估计使似然最大化的最优模型参数:

3.3.1 作用意义

  • 自动建模:从观测数据中恢复转移/发射规律,常用于无监督场景。
  • 参数估计:无需人工标注隐藏状态。

3.3.2 算法流程(Baum-Welch / EM)

  1. E步(期望计算): 利用当前参数计算期望概率:

  2. M步(最大化): 利用期望更新参数估计:

收敛性说明:

  • EM 算法可保证收敛到局部最优;
  • 实践中需尝试多个初始值以获得更优解。

3.4 对比与示例场景

以天气预测模型为例:

问题类型
输入
输出
应用场景
评估问题
模型  + 活动序列
概率 0.03564
判断模型合理性
解码问题
模型  + 活动序列
天气序列 [晴→雨→雨]
推测天气状态
学习问题
多组活动序列
更新后的 
自动发现天气规律

3.5 算法复杂度小结

问题
主要算法
时间复杂度
应用建议
评估
前向/后向算法
模型评估与匹配
解码
维特比算法
状态推断与标注
学习
Baum-Welch(EM)
离线训练、模型拟合

4. 示例:天气与活动预测

为了直观理解隐马尔可夫模型的运行机制,我们构建一个经典的天气-活动预测模型。本示例将贯穿后续算法推导全过程,帮助读者建立从理论到实践的完整认知链条。


4.1 场景定义与参数设定

4.1.1 状态与观测空间

概念
符号
取值
说明
隐藏状态
天气状态,在本模型中视为不可直接观测,仅通过活动行为间接推断
观测变量
可观测的日常活动行为

4.1.2 参数设计依据

  • 气象变化假设:晴天更可能持续,雨天则有一定概率转晴(符合一般气候趋势)
  • 行为习惯假设:晴天偏向户外活动,雨天则偏好室内活动

4.2 模型参数可视化

(1)初始状态分布 

天气状态
概率
现实解释
晴
0.6
约六成天数以晴天开始
雨
0.4
四成天数以雨天开始

(2)状态转移矩阵 

当前天气  次日天气
晴
雨
行和校验
晴
0.7
0.3
1.0
雨
0.4
0.6
1.0
  • 晴 → 晴:稳定晴天的概率为 70%
  • 雨 → 晴:体现雨过天晴的趋势

(3)观测概率矩阵 

天气  活动
散步
购物
打游戏
行和校验
晴
0.6
0.3
0.1
1.0
雨
0.1
0.4
0.5
1.0
  • 晴天行为偏好:60%概率进行户外散步,仅10%选择打游戏
  • 雨天行为偏好:50%概率选择打游戏,体现典型室内活动倾向

4.3 问题定义

假设我们观测到连续三天的活动为:

我们希望解决以下两个核心问题:

问题一:评估问题(Evaluation)

计算该活动序列在当前模型下的发生概率:

现实意义:用于判断观测行为是否符合模型预测,辅助进行异常检测或行为建模评估。

问题二:解码问题(Decoding)

推断最可能对应的天气状态序列:

现实意义:通过用户行为反推隐藏状态(如天气、情绪、偏好等),常用于序列标注任务。


4.4 示例与后续章节的衔接

该示例将在第 5 章中作为贯穿案例,逐步演示以下内容:

  1. 前向算法(Forward Algorithm):计算 
  2. 维特比算法(Viterbi Algorithm):求解最优状态路径 
  3. 参数敏感性分析:将雨天打游戏概率由 0.5 调整为 0.6 后,最优路径变为 ,体现模型对观测概率变动的响应能力

5. 三大核心算法及天气示例推导

我们以天气预测模型为例,系统讲解 HMM 的三大核心算法。模型参数如下(完整定义见第4章):

  • 隐藏状态:
  • 观测变量:
  • 参数: 如第4章定义
  • 观测序列:

5.1 前向算法(评估问题)

5.1.1 算法目标

计算观测序列概率 ,评估模型对数据的解释能力。

5.1.2 算法推导

定义前向变量:

递推过程:

graph LR
    A[α₁初始化] --> B[α₂递推]
    B --> C[α₃递推]
    C --> D[结果求和]

步骤详解:

  1. 初始化():

  2. 递推计算(,观测为购物):

  3. 递推计算(,观测为打游戏):

  4. 结果汇总:

复杂度分析:

  • 时间: 次乘加运算
  • 空间: 个存储单元

5.2 维特比算法(解码问题)

5.2.1 算法目标

寻找最优状态序列 。

5.2.2 算法推导

定义递推变量:

路径回溯:

通过  记录最大概率路径的前驱节点。

步骤详解:

  1. 初始化():

  2. 递推计算():

    状态
    计算过程
    结果
    前驱状态
    晴
    0.0756
    晴
    雨
    0.0432
    晴
  3. 递推计算():

    状态
    计算过程
    结果
    前驱状态
    晴
    0.005292
    晴
    雨
    0.01296
    雨
  4. 路径回溯:

    graph LR
        S3(雨) --> S2(雨)
        S2(雨) --> S1(晴)

    最优路径:

复杂度对比:

算法
时间
空间
核心区别
前向算法
计算所有路径概率和
维特比算法
跟踪最大概率路径

5.3 Baum-Welch 算法(学习问题)

5.3.1 算法原理

基于 EM 框架迭代优化参数:

E步(期望计算):

  • 计算前向概率  和后向概率 
  • 推导状态驻留期望  和转移期望 

M步(参数更新):

示例场景:

若观测到多组活动序列(如 ),通过迭代更新可逐步优化天气模型的  参数。


5.4 算法关联性总结

问题类型
输入
输出
算法
核心思想
评估问题
前向算法
动态规划求路径和
解码问题
维特比算法
动态规划求最优路径
学习问题
Baum-Welch
EM 期望最大化

6. HMM 与贝叶斯网络的关系

隐马尔可夫模型(HMM)与贝叶斯网络(Bayesian Network, BN)同属概率图模型家族,但针对不同场景设计。二者关系可通过以下维度深入解析:


6.1 形式化关系:HMM 是动态贝叶斯网络的特例

6.1.1 概率图视角

graph TD
    A[概率图模型] --> B[静态模型]
    A --> C[动态模型]
    B --> D[贝叶斯网络]
    C --> E[动态贝叶斯网络 DBN]
    E --> F[HMM]
    E --> G[卡尔曼滤波器]
    E --> H[HSMM]
  • HMM 的图结构:

    S₁ → S₂ → S₃ → ... → S_T
    ↓    ↓    ↓         ↓
    O₁   O₂   O₃  ...   O_T

    满足两个核心约束:

  1. 一阶马尔可夫性:
  2. 观测独立性:
  • 与 DBN 的关系:
    HMM 是最简形式的动态贝叶斯网络,其特点包括:

    • 仅包含单个隐变量节点和单个观测节点的时间展开
    • 转移概率与发射概率的时间齐次性(参数共享)

    6.2 建模能力对比

    6.2.1 结构特性

    维度
    HMM
    一般贝叶斯网络
    时间建模
    显式建模离散时间序列
    无固有时间维度
    隐变量必要性
    必须包含隐变量
    可仅包含观测变量
    条件独立性
    强假设(马尔可夫+观测独立)
    任意条件独立性结构
    参数共享
    时间步间参数相同(齐次性)
    通常无参数共享

    6.2.2 推理任务对比

    任务类型
    HMM 专用方法
    贝叶斯网络通用方法
    状态推断
    维特比算法(最大后验路径)
    最大后验估计(MAP)
    边际概率计算
    前向-后向算法
    变量消除、信念传播
    参数学习
    Baum-Welch(EM算法特例)
    EM、梯度下降、MCMC

    6.3 生成式 vs 判别式视角

    6.3.1 HMM 的生成式特性

    HMM 是典型的生成式模型,其建模对象为联合分布:

    可同时生成状态序列和观测序列。

    6.3.2 对比判别式模型(以 CRF 为例)

    特性
    HMM(生成式)
    CRF(判别式)
    建模目标
    特征工程
    仅当前状态相关特征
    可包含任意上下文特征
    数据要求
    需要完整状态序列标注
    需要状态序列标注
    计算复杂度
    (k为特征阶数)

    6.4 动态贝叶斯网络的扩展

    HMM 的局限性催生了更复杂的动态贝叶斯网络:

    扩展模型
    核心改进
    应用场景
    HSMM
    显式建模状态持续时间分布
    手势识别、行为分析
    LDS
    连续隐状态空间(线性高斯模型)
    传感器滤波、运动追踪
    HHMM
    分层隐马尔可夫结构
    文档结构分析、语音分段
    IOHMM
    引入输入控制变量
    控制系统、强化学习

    6.5 与深度学习模型的关联

    现代时序建模框架常融合 HMM 与神经网络:

    混合架构
    实现方式
    优势领域
    HMM+RNN
    RNN 生成观测特征,HMM 解码状态序列
    语音识别、视频分析
    神经HMM
    用神经网络参数化转移/发射概率
    自然语言生成、对话系统
    Transformer+HMM
    Transformer 编码上下文,HMM 解码
    蛋白质结构预测、序列标注

    6.6 小结

    1. 模型定位: HMM 是动态贝叶斯网络中结构最简、应用最广的特例,其高效性源于强假设带来的结构约束。

    2. 演进方向:

    • 增加状态依赖长度 → 高阶 HMM
    • 放松观测独立性 → 输入输出 HMM(IOHMM)
    • 结合深度学习 → 神经隐马尔可夫模型
  • 选型建议:

    场景特点
    推荐模型
    简单时序、标注数据少
    经典 HMM
    复杂特征、丰富标注数据
    CRF 或神经 CRF
    部分可观测、非线性关系
    粒子滤波 + HMM

  • 7. 应用场景一览

    隐马尔可夫模型(HMM)作为经典时序建模工具,在以下领域展现独特价值。我们通过建模逻辑、技术实现和典型挑战三个维度解析其应用细节。


    7.1 核心应用场景分析

    领域
    观测序列 
    隐状态 
    建模逻辑
    技术实现
    典型挑战
    扩展模型
    语音识别
    声学特征帧序列
    (MFCC, FBank)
    音素序列
    语音帧→音素映射
    - HMM 状态对应音素
     - GMM/DNN 建模  矩阵
    口音/噪声干扰
    深度学习-HMM 混合模型(DNN-HMM)
    自然语言处理
    单词序列
    词性标签/命名实体
    词序列→语法结构映射
    - 维特比解码最优路径
     - 结合 n-gram 语言模型
    长程依赖建模
    条件随机场(CRF)
    用户行为分析
    点击流序列
    (页面ID, 停留时长)
    兴趣状态
    (探索/决策/流失)
    行为模式→用户意图映射
    - Baum-Welch 无监督训练
     - 状态数通过 BIC 确定
    行为稀疏性
    层次化 HMM(HHMM)
    生物信息学
    DNA碱基序列
    (A/T/C/G)
    功能区域
    (外显子/内含子)
    碱基序列→基因结构解析
    - 多序列比对训练参数
     - 使用对数概率防下溢
    序列保守性差异
    Profile HMM
    金融风控
    交易特征序列
    (金额, 地点, 频率)
    风险等级
    (正常/可疑/高危)
    行为突变检测
    - 滑动窗口提取特征
     - 结合规则引擎预警
    欺诈模式演化
    隐半马尔可夫模型(HSMM)

    7.2 典型应用案例详解

    案例1:语音识别系统

    • 输入:语音波形 → 分帧提取MFCC特征(每帧39维)
    • HMM配置:
      • 每个音素对应3状态HMM(起始-稳定-结束)
      • 高斯混合模型(GMM)建模观测概率 
    • 解码流程:
      graph LR
          A[语音特征] --> B[音素HMM拼接]
          B --> C[维特比搜索]
          C --> D[最优词序列]
    • 准确率:传统GMM-HMM约80%,DNN-HMM可达92%+

    案例2:基因剪切位点识别

    • 输入:DNA序列片段(如 "ATGCTAGCTA...")
    • HMM结构:
      • 状态:外显子/内含子/启动子等
      • 发射概率:基于密码子偏好性统计
    • 训练数据:GENCODE人类基因组注释集
    • 效果:HMM预测外显子F1-score约0.87

    7.3 技术选型建议

    场景特征
    推荐方案
    优势
    注意事项
    短序列、强时序依赖
    基础HMM
    计算高效
    需人工设计状态空间
    长序列、局部依赖
    HSMM
    显式建模状态驻留时间
    参数数量增加50%
    多模态观测数据
    GMM-HMM
    灵活建模复杂分布
    需EM算法充分收敛
    高维连续观测
    DNN-HMM
    自动特征提取
    需GPU加速训练
    丰富上下文特征
    CRF
    突破观测独立性限制
    需完全标注数据

    7.4 应用扩展方向

    1. 多模态融合:HMM + 视觉特征 → 视频行为识别(如手势识别)
    2. 时空建模:HMM + 空间拓扑约束 → 移动轨迹预测(用户LBS数据分析)
    3. 层次化建模:层次HMM(HHMM)→ 文档结构分析(章节-段落-句子层级)
    4. 在线学习:增量式Baum-Welch → 实时用户画像更新(电商场景)

    7.5 局限性及应对

    局限性
    现象
    解决方案
    马尔可夫假设过强
    长程依赖建模失败
    改用 RNN/Transformer
    观测独立性限制
    上下文特征无法利用
    升级为 CRF/MEMM
    参数先验依赖
    初始值敏感导致局部最优
    多组初始化+模型平均
    状态空间固定
    动态场景适应性差
    在线EM+状态分裂合并

    8. Python 实践(hmmlearn)

    下面以天气预测模型为例,展示如何使用 hmmlearn 库实现 HMM 建模与解码。本示例包含完整的可执行代码和工业级实践技巧。


    8.1 环境配置与数据准备

    # 安装依赖(Jupyter Notebook中需去掉感叹号)
    !pip install hmmlearn numpy

    import numpy as np
    from hmmlearn import hmm

    # 观测序列编码映射
    activity_map = {"散步": 0, "购物": 1, "打游戏": 2}
    state_map = {0: "晴", 1: "雨"}

    # 构造观测序列(需转换为列向量)
    obs_seq = np.array([[activity_map["散步"], 
                        activity_map["购物"], 
                        activity_map["打游戏"]]])

    # 反向映射,便于还原观测值
    activity_reverse_map = {v: k for k, v in activity_map.items()}          

    8.2 模型构建与参数设置

    # 初始化离散HMM模型
    model = hmm.MultinomialHMM(
        n_components=2,    # 隐藏状态数(晴、雨)
        n_iter=100,        # EM算法最大迭代次数
        tol=1e-3,          # 收敛阈值
        verbose=True# 显示训练日志
    )

    # 设置已知参数(若参数未知,需使用fit方法从数据学习)
    model.startprob_ = np.array([0.6, 0.4])  # 初始状态分布π

    # 设置每次观测是单次实验结果(Multinomial 分布需要此项)
    model.n_trials = 1

    model.transmat_ = np.array([             # 状态转移矩阵A
        [0.7, 0.3],  # 晴 → 晴, 晴 → 雨
        [0.4, 0.6]   # 雨 → 晴, 雨 → 雨
    ])

    model.emissionprob_ = np.array([         # 观测概率矩阵B
        [0.6, 0.3, 0.1],  # 晴 → 散步, 购物, 打游戏
        [0.1, 0.4, 0.5]   # 雨 → 散步, 购物, 打游戏
    ])

    8.3 状态解码与结果解析

    # 维特比解码获取最优路径
    log_prob, hidden_states = model.decode(obs_seq, algorithm="viterbi")

    # 将数值结果转换为可解释标签
    decoded_weather = [state_map[s] for s in hidden_states]
    observed_activities = [list(activity_map.keys())[idx] for idx in obs_seq.flatten()]

    # 结果输出
    print(f"观测活动序列: {observed_activities}")
    print(f"推测天气序列: {decoded_weather}")
    print(f"对数概率: {log_prob:.4f} => 实际概率: {np.exp(log_prob):.4f}")

    # 模型检查(验证概率矩阵合法性)
    assert np.allclose(model.transmat_.sum(axis=1), 1.0), "转移矩阵行和必须为1"
    assert np.allclose(model.emissionprob_.sum(axis=1), 1.0), "发射矩阵行和必须为1"

    8.4 输出示例与解析

    观测活动序列: ['散步']
    推测天气序列: ['雨']
    对数概率: -2.1203 => 实际概率: 0.1200

    关键输出解读:

    1. 状态序列:显示最可能的天气变化路径
    2. 对数概率:用于数值稳定性计算,实际概率需取指数
    3. 概率值:0.1200 表示该活动序列在当前模型下的可能性

    8.5 工程实践技巧

    1. 参数初始化策略:

      # 随机初始化示例(适用于无先验知识场景)
      model.startprob_ = np.random.dirichlet(np.ones(2))
      model.transmat_ = np.random.dirichlet(np.ones(2), size=2)
    2. 模型持久化:

      import joblib
      joblib.dump(model, "weather_hmm.pkl")  # 保存模型
      loaded_model = joblib.load("weather_hmm.pkl")  # 加载模型
    3. 处理连续观测值(使用GaussianHMM):

      from hmmlearn import hmm
      model = hmm.GaussianHMM(n_components=2, covariance_type="diag")
      model.fit(temperature_observations)  # 输入为连续温度值
    4. 模型评估:

      # 使用交叉验证计算困惑度
      perplexity = np.exp(-model.score(obs_seq) / obs_seq.shape[0])

    - END -