【机器学习】嘿马机器学习(算法篇)第9篇:HMM模型,4.5 维特比算法解码隐藏状态序列【附代码文档】

举报
程序员一诺python 发表于 2025/09/02 10:08:30 2025/09/02
【摘要】 1.定位、目标。2. K-近邻算法涵盖距离度量、k值选择、kd树、鸢尾花种类预测数据集介绍、练一练、交叉验证网格搜索、facebook签到位置预测案例。3. 线性回归包括线性回归简介、线性回归损失和优化、梯度下降法介绍、波士顿房价预测案例、欠拟合和过拟合、正则化线性模型、正规方程推导方式、梯度下降法算法比较优化、维灾难。4. 逻辑回归涵盖逻辑回归介绍、癌症分类预测案例(良恶性乳

🏆🏆🏆教程全知识点简介:1.定位、目标。2. K-近邻算法涵盖距离度量、k值选择、kd树、鸢尾花种类预测数据集介绍、练一练、交叉验证网格搜索、facebook签到位置预测案例。3. 线性回归包括线性回归简介、线性回归损失和优化、梯度下降法介绍、波士顿房价预测案例、欠拟合和过拟合、正则化线性模型、正规方程推导方式、梯度下降法算法比较优化、维灾难。4. 逻辑回归涵盖逻辑回归介绍、癌症分类预测案例(良恶性乳腺癌肿瘤预测、获取数据)、ROC曲线绘制。5. 朴素贝叶斯算法包括朴素贝叶斯算法简介、概率基础复习、产品评论情感分析案例(取出内容列数据分析、判定评判标准好评差评)。6. 支持向量机涵盖SVM算法原理、SVM损失函数、数字识别器案例。7. 决策树算法包括决策树分类原理、cart剪枝、特征工程特征提取、决策树算法api、泰坦尼克号乘客生存预测案例。8. EM算法涵盖初识EM算法、EM算法介绍。9. HMM模型包括马尔科夫链、HMM简介、前向后向算法评估观察序列概率、维特比算法解码隐藏状态序列、HMM模型API介绍。10. 集成学习进阶涵盖Bagging、xgboost算法原理、otto案例(Otto Group Product Classification Challenge xgboost实现)、数据变化可视化、lightGBM、stacking算法基本思想、住房月租金预测。11. 聚类算法包括聚类算法api初步使用、聚类算法实现流程、模型评估、算法优化、特征降维、用户对物品类别喜好细分案例、算法选择指导。12. 数学基础涵盖向量与矩阵范数、朗格朗日乘子法、Huber Loss、极大似然函数取对数原因。


📚📚👉👉👉code git仓库:   https://gitee.com/yinuo112/AI/blob/master/机器学习/嘿马机器学习(算法篇)/note.md 直接get🍅🍅

✨ 本教程项目亮点

🧠 知识体系完整:覆盖从基础原理、核心方法到高阶应用的全流程内容
💻 全技术链覆盖:完整前后端技术栈,涵盖开发必备技能
🚀 从零到实战:适合 0 基础入门到提升,循序渐进掌握核心能力
📚 丰富文档与代码示例:涵盖多种场景,可运行、可复用
🛠 工作与学习双参考:不仅适合系统化学习,更可作为日常开发中的查阅手册
🧩 模块化知识结构:按知识点分章节,便于快速定位和复习
📈 长期可用的技术积累:不止一次学习,而是能伴随工作与项目长期参考


🎯🎯🎯全教程总章节


🚀🚀🚀本篇主要内容

HMM模型

学习目标

  • 了解什么是马尔科夫链
  • 知道什么是HMM模型
  • 知道前向后向算法评估观察序列概率
  • 知道维特比算法解码隐藏状态序列
  • 了解鲍姆-韦尔奇算法
  • 知道HMM模型API的使用

4.5 维特比算法解码隐藏状态序列

学习目标

  • 知道维特比算法解码隐藏状态序列

在本篇 会讨论维特比算法解码隐藏状态序列,即给定模型和观测序列,求给定观测序列条件下,最可能出现的对应的隐藏状态序列。

HMM模型的解码问题最常用的算法是维特比算法,当然也有其他的算法可以求解这个问题。

同时维特比算法是一个通用的求序列最短路径的动态规划算法,也可以用于很多其他问题。

1 HMM最可能隐藏状态序列求解概述

HMM模型的解码问题即:

  • 给定模型λ=(A,B,Π)\lambda=(A,B,\Pi)λ=(A,B,Π)O=o1,o2,...oTO={o_1,o_2,...o_T}O=o​1​​,o​2​​,...o​T​​I∗=i1∗,i2∗,...iT∗I^\ast ={i^\ast _1,i^\ast _2,...i^\ast _T}I​∗​​=i​1​∗​​,i​2​∗​​,...i​T​∗​​P(I∗∣O)P(I^\ast |O)P(I​∗​​∣O)

一个可能的近似解法是求出观测序列O在每个时刻t最可能的隐藏状态it∗i^\ast _ti​t​∗​​I∗=i1∗,i2∗,...iT∗I^\ast ={i^\ast _1,i^\ast _2,...i^\ast _T}I​∗​​=i​1​∗​​,i​2​∗​​,...i​T​∗​​

  • 在给定模型λ\lambdaλqiq_iq​i​​γt(i)\gamma _t(i)γ​t​​(i)

![image-20191211151315040]

近似算法很简单,但是却不能保证预测的状态序列整体是最可能的状态序列,因为预测的状态序列中某些相邻的隐藏状态可能存在转移概率为0的情况。

维特比算法可以将HMM的状态序列作为一个整体来考虑,避免近似算法的问题,下面 来看看维特比算法进行HMM解码的方法。

2 维特比算法概述

维特比算法是一个通用的解码算法,是基于动态规划的求序列最短路径的方法。

既然是动态规划算法,那么就需要找到合适的局部状态,以及局部状态的递推公式。在HMM中,维特比算法定义了两个局部状态用于递推。

1) 第一个局部状态是在时刻t隐藏状态为iiii1,i2,...iti_1,i_2,...i_ti​1​​,i​2​​,...i​t​​

  • 记为δt(i)\delta _t(i)δ​t​​(i)

![image-20191211151501175]

δt(i)\delta _t(i)δ​t​​(i)δ\deltaδ

![image-20191211151534411]

2) 第二个局部状态由第一个局部状态递推得到。

  • 定义在时刻t隐藏状态为i的所有单个状态转移路径(i1,i2,...,it−1,i)(i_1,i_2,...,i_{t-1},i)(i​1​​,i​2​​,...,i​t−1​​,i)ψt(i)\psi _t(i)ψ​t​​(i)
  • 其递推表达式可以表示为:

![image-20191211153102474]

有了这两个局部状态, 就可以从时刻0一直递推到时刻T,然后利用ψt(i)\psi _t(i)ψ​t​​(i)

3 维特比算法流程总结

现在 来总结下维特比算法的流程:

  • 输入:HMM模型λ=(A,B,Π)\lambda=(A,B,\Pi)λ=(A,B,Π)O=(o1,o2,...oT)O=(o_1,o_2,...o_T)O=(o​1​​,o​2​​,...o​T​​)

  • 输出:最有可能的隐藏状态序列I∗=i1∗,i2∗,...iT∗I^\ast ={i^\ast _1,i^\ast _2,...i^\ast _T}I​∗​​=i​1​∗​​,i​2​∗​​,...i​T​∗​​

流程如下:

  • 1)初始化局部状态:

![image-20191211153308449]

  • 2) 进行动态规划递推时刻t=2,3,...Tt=2,3,...Tt=2,3,...T

![image-20191211153349430]

  • 3) 计算时刻T最大的δT(i)\delta _T(i)δ​T​​(i)ψt(i)\psi _t(i)ψ​t​​(i)

![image-20191211153412145]

  • 4) 利用局部状态ψt(i)\psi _t(i)ψ​t​​(i)t=T−1,T−2,...,1t=T-1,T-2,...,1t=T−1,T−2,...,1

![image-20191211153607900]

最终得到最有可能的隐藏状态序列I∗=i1∗,i2∗,...iT∗I^\ast ={i^\ast _1,i^\ast _2,...i^\ast _T}I​∗​​=i​1​∗​​,i​2​∗​​,...i​T​∗​​

4 HMM维特比算法求解实例

下面 仍然用盒子与球的例子来看看HMM维特比算法求解。 的观察集合是:

![image-20191211153746752]

的状态集合是:

![image-20191211153802703]

而观察序列和状态序列的长度为3.

初始状态分布为:

![image-20191211153823665]

状态转移概率分布矩阵为:

![image-20191211153840457]

观测状态概率矩阵为:

![image-20191211153917435]

球的颜色的观测序列:

![image-20191211153935679]

按照 前面的维特比算法,首先需要得到三个隐藏状态在时刻1时对应的各自两个局部状态,此时观测状态为1:

![image-20191211154001419]

现在开始递推三个隐藏状态在时刻2时对应的各自两个局部状态,此时观测状态为2:

  • δ2(1)=max1≤j≤3[δ1(j)aj1]b1(o2)=max1≤j≤3[0.1×0.5,0.16×0.3,0.28×0.2]×0.5=0.028\delta_2(1) = \max_{1\leq j \leq 3}[\delta_1(j)a_{j1}]b_1(o_2) = \max_{1\leq j \leq 3}[0.1 \times 0.5, 0.16 \times 0.3, 0.28\times 0.2] \times 0.5 = 0.028δ​2​​(1)=max​1≤j≤3​​[δ​1​​(j)a​j1​​]b​1​​(o​2​​)=max​1≤j≤3​​[0.1×0.5,0.16×0.3,0.28×0.2]×0.5=0.028
  • Ψ2(1)=3\Psi_2(1)=3Ψ​2​​(1)=3

  • δ2(2)=max1≤j≤3[δ1(j)aj2]b2(o2)=max1≤j≤3[0.1×0.2,0.16×0.5,0.28×0.3]×0.6=0.0504\delta_2(2) = \max_{1\leq j \leq 3}[\delta_1(j)a_{j2}]b_2(o_2) = \max_{1\leq j \leq 3}[0.1 \times 0.2, 0.16 \times 0.5, 0.28\times 0.3] \times 0.6 = 0.0504δ​2​​(2)=max​1≤j≤3​​[δ​1​​(j)a​j2​​]b​2​​(o​2​​)=max​1≤j≤3​​[0.1×0.2,0.16×0.5,0.28×0.3]×0.6=0.0504

  • Ψ2(2)=3\Psi_2(2)=3Ψ​2​​(2)=3

  • δ2(3)=max1≤j≤3[δ1(j)aj3]b3(o2)=max1≤j≤3[0.1×0.3,0.16×0.2,0.28×0.5]×0.3=0.042\delta_2(3) = \max_{1\leq j \leq 3}[\delta_1(j)a_{j3}]b_3(o_2) = \max_{1\leq j \leq 3}[0.1 \times 0.3, 0.16 \times 0.2, 0.28\times 0.5] \times 0.3 = 0.042δ​2​​(3)=max​1≤j≤3​​[δ​1​​(j)a​j3​​]b​3​​(o​2​​)=max​1≤j≤3​​[0.1×0.3,0.16×0.2,0.28×0.5]×0.3=0.042

  • Ψ2(3)=3\Psi_2(3)=3Ψ​2​​(3)=3

继续递推三个隐藏状态在时刻3时对应的各自两个局部状态,此时观测状态为1:

  • δ3(1)=max1≤j≤3[δ2(j)aj1]b1(o3)=max1≤j≤3[0.028×0.5,0.0504×0.3,0.042×0.2]×0.5=0.00756\delta_3(1) = \max_{1\leq j \leq 3}[\delta_2(j)a_{j1}]b_1(o_3) = \max_{1\leq j \leq 3}[0.028 \times 0.5, 0.0504 \times 0.3, 0.042\times 0.2] \times 0.5 = 0.00756δ​3​​(1)=max​1≤j≤3​​[δ​2​​(j)a​j1​​]b​1​​(o​3​​)=max​1≤j≤3​​[0.028×0.5,0.0504×0.3,0.042×0.2]×0.5=0.00756
  • Ψ3(1)=2\Psi_3(1)=2Ψ​3​​(1)=2

  • δ3(2)=max1≤j≤3[δ2(j)aj2]b2(o3)=max1≤j≤3[0.028×0.2,0.0504×0.5,0.042×0.3]×0.4=0.01008\delta_3(2) = \max_{1\leq j \leq 3}[\delta_2(j)a_{j2}]b_2(o_3) = \max_{1\leq j \leq 3}[0.028 \times 0.2, 0.0504\times 0.5, 0.042\times 0.3] \times 0.4 = 0.01008δ​3​​(2)=max​1≤j≤3​​[δ​2​​(j)a​j2​​]b​2​​(o​3​​)=max​1≤j≤3​​[0.028×0.2,0.0504×0.5,0.042×0.3]×0.4=0.01008

  • Ψ3(2)=2\Psi_3(2)=2Ψ​3​​(2)=2

  • δ3(3)=max1≤j≤3[δ2(j)aj3]b3(o3)=max1≤j≤3[0.028×0.3,0.0504×0.2,0.042×0.5]×0.7=0.0147\delta_3(3) = \max_{1\leq j \leq 3}[\delta_2(j)a_{j3}]b_3(o_3) = \max_{1\leq j \leq 3}[0.028 \times 0.3, 0.0504 \times 0.2, 0.042\times 0.5] \times 0.7 = 0.0147δ​3​​(3)=max​1≤j≤3​​[δ​2​​(j)a​j3​​]b​3​​(o​3​​)=max​1≤j≤3​​[0.028×0.3,0.0504×0.2,0.042×0.5]×0.7=0.0147

  • Ψ3(3)=3\Psi_3(3)=3Ψ​3​​(3)=3

此时已经到最后的时刻, 开始准备回溯。此时最大概率为δ3(3)\delta _3(3)δ​3​​(3)i3∗=3i^\ast _3=3i​3​∗​​=3

由于ψ3(3)=3\psi _3(3)=3ψ​3​​(3)=3i2∗=3i^\ast _2=3i​2​∗​​=3ψ2(3)=3\psi _2(3)=3ψ​2​​(3)=3i1∗=3i^\ast _1=3i​1​∗​​=3


5 小结

  • 维特比算法流程总结:

  • 输入:HMM模型λ=(A,B,Π)\lambda=(A,B,\Pi)λ=(A,B,Π)O=(o1,o2,...oT)O=(o_1,o_2,...o_T)O=(o​1​​,o​2​​,...o​T​​)

  • 输出:最有可能的隐藏状态序列I∗=i1∗,i2∗,...iT∗I^\ast ={i^\ast _1,i^\ast _2,...i^\ast _T}I​∗​​=i​1​∗​​,i​2​∗​​,...i​T​∗​​

  • 流程如下:

    • 1)初始化局部状态:

![image-20191211153308449]

  * 2) 进行动态规划递推时刻<span>t=2,3,...Tt=2,3,...Tt=2,3,...T</span>

![image-20191211153349430]

  * 3) 计算时刻T最大的<span>δT(i)\delta _T(i)δ​T​​(i)</span><span>ψt(i)\psi _t(i)ψ​t​​(i)</span>

![image-20191211153412145]

  * 4) 利用局部状态<span>ψt(i)\psi _t(i)ψ​t​​(i)</span><span>t=T−1,T−2,...,1t=T-1,T-2,...,1t=T−1,T−2,...,1</span>

![image-20191211153607900]

  • 最终得到最有可能的隐藏状态序列I∗=i1∗,i2∗,...iT∗I^\ast ={i^\ast _1,i^\ast _2,...i^\ast _T}I​∗​​=i​1​∗​​,i​2​∗​​,...i​T​∗​​

4.6 鲍姆-韦尔奇算法简介

学习目标

  • 了解鲍姆-韦尔奇算法

模型参数学习问题 —— 鲍姆-韦尔奇(Baum-Welch)算法(状态未知) ,

  • 即给定观测序列O={o1,o2,...oT}O={o_1,o_2,...o_T}O={o​1​​,o​2​​,...o​T​​}λ=(A,B,Π)\lambda =(A,B,\Pi )λ=(A,B,Π)P(O∣λ)P(O|\lambda )P(O∣λ)
  • 它的解法最常用的是鲍姆-韦尔奇算法,其实就是基于EM算法的求解,只不过鲍姆-韦尔奇算法出现的时代,EM算法还没有被抽象出来,所以被叫为鲍姆-韦尔奇算法。

![image-20191209171743726]

2 鲍姆-韦尔奇算法原理

鲍姆-韦尔奇算法原理既然使用的就是EM算法的原理,

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。