HMM Forward Backward Viterbi Analysis
项目简介
本项目是一个基于 MATLAB 环境开发的隐马尔科夫模型(Hidden Markov Model, HMM)核心算法演示与分析工具。项目完整实现了 HMM 理论中的三大经典算法:前向算法(Forward Algorithm)、后向算法(Backward Algorithm)以及维特比算法(Viterbi Algorithm)。
该代码以经典的“天气-海藻湿度”模型为例(3种天气状态,4种湿度观测),展示了如何通过 HMM 模型参数解决评估问题(计算观测序列概率)和解码问题(寻找最可能的隐藏状态序列)。通过数值计算与图形化展示相结合的方式,帮助用户深入理解 HMM 的内部运作机制。
功能特性
本项目实现了以下核心功能:
- 模型构建与参数定义:内置了完整的 HMM 模型参数,包括状态转移矩阵 (A)、符号发射矩阵 (B) 和初始状态概率向量 (Pi),并生成了特定的观测序列用于分析。
- 序列概率评估 (Evaluation):
*
前向算法:通过递推计算前向概率变量 (Alpha),精确求出给定模型下观测序列出现的概率。
*
后向算法:通过递推计算后向概率变量 (Beta),并计算序列概率,用于验证前向算法的计算结果精度。
*
维特比算法:利用动态规划原理计算局部最优概率 (Delta) 并记录回溯指针 (Psi),最终输出产生观测序列的最可能的隐藏状态路径。
- 后验概率分析:结合前向和后向结果,计算给定观测序列下,每一时刻处于各个状态的后验概率 (Gamma)。
- 全方位可视化:提供专门的绘图函数,将 Alpha、Beta、Gamma 矩阵以热力图形式展示,并在 Delta 概率图上叠加绘制维特比最优路径,直观展示算法收敛过程。
系统要求
- MATLAB R2016a 或更高版本
- 无需额外的工具箱(Toolbox),项目仅使用 MATLAB 基础函数。
算法实现细节与逻辑分析
主程序脚本包含严密的逻辑流程,具体实现细节如下:
1. 模型初始化
程序首先定义了 HMM 的核心五元组 $(N, M, A, B, pi)$:
- 状态空间 (N=3):定义了 Sunny(1), Cloudy(2), Rainy(3) 三种隐藏状态。
- 观测空间 (M=4):定义了 Dry(1), Dryish(2), Damp(3), Soggy(4) 四种观测符号。
- 观测序列:定义了一个长度为 $T=10$ 的观测索引序列,作为后续所有算法的输入。
2. 前向算法模块 (Forward Algorithm)
该模块用于计算观测序列概率 $P(O|lambda)$。
- 初始化:计算 $t=1$ 时刻各状态的初始前向概率。
- 递推计算:对于 $t=2$ 到 $T$,根据前一时刻的 Alpha 值加权求和并乘以当前的发射概率。
- 终止:将 $T$ 时刻所有状态的前向概率相加得到最终结果。
- 输出:返回序列总概率及完整的 Alpha 概率矩阵。
3. 后向算法模块 (Backward Algorithm)
该模块与前向算法互为验证。
- 初始化:设定 $T$ 时刻所有状态的后向概率 Beta 为 1。
- 递推计算:从 $t=T-1$ 逆向回溯到 1,利用后一时刻的 Beta 值、转移概率和发射概率计算当前时刻的 Beta 值。
- 验证:在 $t=1$ 时刻结合初始概率 $pi$ 和发射概率计算总概率,程序会自动计算前向与后向结果的差值,验证算法的一致性。
4. 维特比算法模块 (Viterbi Algorithm)
该模块用于寻找由通过观测序列推断出的最可能的状态序列。
- 动态规划:该部分类似于前向算法,但在递推过程中将“求和”操作替换为“求最大值”操作。
- 路径记录:在计算局部最优概率 (Delta) 的同时,引入回溯矩阵 (Psi) 记录每一时刻到达当前状态的最优前驱状态索引。
- 路径回溯:从 $T$ 时刻最大概率对应的状态开始,利用 Psi 矩阵逆向倒推,重建完整的最优状态路径。
5. 状态后验概率计算
主程序利用前向 (Alpha) 和后向 (Beta) 矩阵计算 Gamma 变量:
- 公式:$gamma_t(i) = frac{alpha_t(i) beta_t(i)}{P(O|lambda)}$
- 意义:该指标表示在给定整个观测序列的前提下,时刻 $t$ 处于状态 $i$ 的精确概率。
结果可视化
代码执行结束后,会自动生成一个包含四个子图的分析窗口:
- 前向概率 (Alpha) 热力图:展示随时间推移,观测序列累积概率在各状态间的分布。
- 后向概率 (Beta) 热力图:展示从未来时刻推导至当前时刻的概率分布。
- 状态后验概率 (Gamma) 热力图:展示每一时刻最可能处于哪个状态(软分类)。
- 维特比最优路径图:底图为 Delta 概率分布,并在其上用高亮连线标示出计算出的最优隐藏状态路径,直观展示解码结果。
使用方法
- 确保 MATLAB 环境已准备就绪。
- 将包含代码的
.m 文件放置于 MATLAB 当前工作路径中。 - 直接运行主函数
main。 - 观察命令行窗口输出的数值结果(概率值、路径序列等)。
- 查看弹出的图形窗口,分析算法运行的可视化结果。