
🏆🏆🏆教程全知识点简介: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、极大似然函数取对数原因。

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


🚀🚀🚀本篇主要内容
HMM模型
学习目标
- 了解什么是马尔科夫链
- 知道什么是HMM模型
- 知道前向后向算法评估观察序列概率
- 知道维特比算法解码隐藏状态序列
- 了解鲍姆-韦尔奇算法
- 知道HMM模型API的使用
4.3 HMM模型基础
学习目标
- 了解HMM模型解决的问题的主要特征
- 知道HMM模型的两个重要假设
- 指导HMM观测序列的生成过程
- 知道HMM模型的三个基本问题
1 什么样的问题需要HMM模型
首先我们来看看什么样的问题解决可以用HMM模型。使用HMM模型时我们的问题一般有这两个特征:
1)我们的问题是基于序列的,比如时间序列,或者状态序列。
-
2)我们的问题中有两类数据,
- 一类序列数据是可以观测到的,即观测序列;
- 而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列。
有了这两个特征,那么这个问题一般可以用HMM模型来尝试解决。这样的问题在实际生活中是很多的。
比如:我现在给大家写课件,我在键盘上敲出来的一系列字符就是观测序列,而我实际想写的一段话就是隐藏状态序列,输入法的任务就是从敲入的一系列字符尽可能的猜测我要写的一段话,并把最可能的词语放在最前面让我选择,这就可以看做一个HMM模型了。
再举一个,假如我上课讲课,我发出的一串连续的声音就是观测序列,而我实际要表达的一段话就是隐藏状态序列,你大脑的任务,就是从这一串连续的声音中判断出我最可能要表达的话的内容。
从这些例子中,我们可以发现,HMM模型可以无处不在。但是上面的描述还不精确,下面我们用精确的数学符号来表述我们的HMM模型。
2 HMM模型的定义
对于HMM模型,首先我们假设Q是所有可能的隐藏状态的集合,V是所有可能的观测状态的集合,即:
- <span>Q=q1,q2,...,qNQ={q_1,q_2,...,q_N}Q=q1,q2,...,qN</span>
- <span>V=v1,v2,...vMV={v_1,v_2,...v_M}V=v1,v2,...vM</span>
其中,N是可能的隐藏状态数,M是所有的可能的观察状态数。
对于一个长度为T的序列,i是对应的状态序列, O是对应的观察序列,即:
- <span>i=i1,i2,...,iTi={i_1,i_2,...,i_T}i=i1,i2,...,iT</span>
- <span>O=o1,o2,...oTO={o_1,o_2,...o_T}O=o1,o2,...oT</span>
其中,任意一个隐藏状态<span>it∈Qi_t \in Qit∈Q</span><span>ot∈Vo_t\in Vot∈V</span>
HMM模型做了两个很重要的假设如下:
1) 齐次马尔科夫链假设。
- 即任意时刻的隐藏状态只依赖于它前一个隐藏状态。
当然这样假设有点极端,因为很多时候我们的某一个隐藏状态不仅仅只依赖于前一个隐藏状态,可能是前两个或者是前三个。
但是这样假设的好处就是模型简单,便于求解。
-
如果在时刻t的隐藏状态是<span>it=qii_t=q_iit=qi</span><span>t+1t+1t+1</span><span>it+1=qji_{t+1}=q_jit+1=qj</span><span>aija_{ij}aij</span>
- <span>aij=P(it+1=qj∣it=qi)a_{ij}=P(i_{t+1}= q_j | i_t=q_i)aij=P(it+1=qj∣it=qi)</span>
-
这样<span>aija_{ij}aij</span>
- <span>A=[aij]N×NA=[a_{ij}]_{N \times N}A=[aij]N×N</span>
2) 观测独立性假设。
-
即任意时刻的观察状态只仅仅依赖于当前时刻的隐藏状态,这也是一个为了简化模型的假设。
-
如果在时刻t的隐藏状态是<span>it=qji_t=q_jit=qj</span><span>ot=vko_t=v_kot=vk</span><span>vkv_kvk</span><span>qjq_jqj</span><span>bj(k)b_j(k)bj(k)</span>
- <span>bj(k)=P(ot=vk∣it=qj)b_j(k)=P(o_t=v_k|i_t=q_j)bj(k)=P(ot=vk∣it=qj)</span>
-
这样<span>bj(k)b_j(k)bj(k)</span>
- <span>B=[bj(k)]N×MB=[b_j(k)]_{N \times M}B=[bj(k)]N×M</span>
-
除此之外,我们需要一组在时刻t=1的隐藏状态概率分布<span>Π\PiΠ</span>
<span>Π=[Πi]N \Pi =[\Pi_i]_NΠ=[Πi]N</span>
其中<span>Πi=P(i1=qi)\Pi _i=P(i_1=q_i)Πi=P(i1=qi)</span>
-
一个HMM模型,可以由隐藏状态初始概率分布<span>Π\PiΠ</span>。
<span>Π\PiΠ</span>
因此,HMM模型可以由一个三元组<span>λ\lambdaλ</span>
- <span>λ=(A,B,Π)= \lambda =(A,B, \Pi )=λ=(A,B,Π)=</span>
3 一个HMM模型实例
下面我们用一个简单的实例来描述上面抽象出的HMM模型。这是一个盒子与球的模型。
例子来源于李航的《统计学习方法》。
假设我们有3个盒子,每个盒子里都有红色和白色两种球,这三个盒子里球的数量分别是:
| 盒子 | 1 | 2 | 3 |
|---|---|---|---|
| 红球数 | 5 | 4 | 7 |
| 白球数 | 5 | 6 | 3 |
按照下面的方法从盒子里抽球,开始的时候,
- 从第一个盒子抽球的概率是0.2,
- 从第二个盒子抽球的概率是0.4,
- 从第三个盒子抽球的概率是0.4。
以这个概率抽一次球后,将球放回。
然后从当前盒子转移到下一个盒子进行抽球。规则是:
- 如果当前抽球的盒子是第一个盒子,则以0.5的概率仍然留在第一个盒子继续抽球,以0.2的概率去第二个盒子抽球,以0.3的概率去第三个盒子抽球。
- 如果当前抽球的盒子是第二个盒子,则以0.5的概率仍然留在第二个盒子继续抽球,以0.3的概率去第一个盒子抽球,以0.2的概率去第三个盒子抽球。
- 如果当前抽球的盒子是第三个盒子,则以0.5的概率仍然留在第三个盒子继续抽球,以0.2的概率去第一个盒子抽球,以0.3的概率去第二个盒子抽球。
如此下去,直到重复三次,得到一个球的颜色的观测序列:
- O={红,白,红}
注意在这个过程中,观察者只能看到球的颜色序列,却不能看到球是从哪个盒子里取出的。
那么按照我们前面HMM模型的定义,我们的观察状态集合是:
- V={红,白},M=2
我们的隐藏状态集合是:
- Q={盒子1,盒子2,盒子3},N=3
而观察序列和状态序列的长度为3.
初始状态分布<span>Π\PiΠ</span>
- <span>Π=(0.2,0.4,0.4)T\Pi =(0.2,0.4,0.4)^TΠ=(0.2,0.4,0.4)T</span>
状态转移概率分布A矩阵为:
观测状态概率B矩阵为:
4 HMM观测序列的生成
从上面的例子,我们也可以抽象出HMM观测序列生成的过程。
输入的是HMM的模型<span>λ=(A,B,Π)\lambda =(A,B,\Pi )λ=(A,B,Π)</span>
输出是观测序列<span>O=o1,o2,...oTO={o_1,o_2,...o_T}O=o1,o2,...oT</span>
生成的过程如下:
1)根据初始状态概率分布<span>Π\Pi Π</span><span>i1i_1i1</span>
-
- for t from 1 to T
- a. 按照隐藏状态<span>iti_tit</span><span>bit(k)b_{it}(k)bit(k)</span><span>oto_tot</span>
- b. 按照隐藏状态<span>iti_tit</span><span>ait,it+1ai_t, i_{t+1}ait,it+1</span><span>it+1i_{t+1}it+1</span>
所有的<span>oto_tot</span><span>O=o1,o2,...oTO={o_1,o_2,...o_T}O=o1,o2,...oT</span>
5 HMM模型的三个基本问题
HMM模型一共有三个经典的问题需要解决:
1)评估观察序列概率 —— 前向后向的概率计算
- 即给定模型<span>λ=(A,B,Π)\lambda =(A,B,\Pi )λ=(A,B,Π)</span><span>O={o1,o2,...oT}O={o_1,o_2,...o_T}O={o1,o2,...oT}</span><span>λ\lambdaλ</span><span>λ\lambdaλ</span>
- 这个问题的求解需要用到前向后向算法,是HMM模型三个问题中最简单的。
2)预测问题,也称为解码问题 ——维特比(Viterbi)算法
- 即给定模型<span>λ=(A,B,Π)\lambda =(A,B,\Pi )λ=(A,B,Π)</span><span>O={o1,o2,...oT}O={o_1,o_2,...o_T}O={o1,o2,...oT}</span>
- 这个问题的求解需要用到基于动态规划的维特比算法,是HMM模型三个问题中复杂度居中的算法。
3)模型参数学习问题 —— 鲍姆-韦尔奇(Baum-Welch)算法(状态未知) ,这是一个学习问题
- 即给定观测序列<span>O={o1,o2,...oT}O={o_1,o_2,...o_T}O={o1,o2,...oT}</span><span>λ=(A,B,Π)\lambda =(A,B,\Pi )λ=(A,B,Π)</span><span>P(O∣λ)P(O|\lambda )P(O∣λ)</span>
- 这个问题的求解需要用到基于EM算法的鲍姆-韦尔奇算法,是HMM模型三个问题中最复杂的。
接下来的三节,我们将基于这个三个问题展开讨论。
3 小结
-
什么样的问题可以用HMM模型解决
- 基于序列的,比如时间序列;
- 问题中包含两类数据,一类是可以观测到的观测序列;另一类是不能观察到的隐藏状态序列。
-
HMM模型的两个重要假设
- 其次马尔科夫链假设
- 观测独立性假设
-
HMM模型的三个基本问题
- 评估观察序列概率—— 前向后向的概率计算
- 预测问题,也称为解码问题 ——维特比(Viterbi)算法
- 模型参数学习问题 —— 鲍姆-韦尔奇(Baum-Welch)算法
HMM模型
学习目标
- 了解什么是马尔科夫链
- 知道什么是HMM模型
- 知道前向后向算法评估观察序列概率
- 知道维特比算法解码隐藏状态序列
- 了解鲍姆-韦尔奇算法
- 知道HMM模型API的使用
4.4 前向后向算法评估观察序列概率
学习目标
- 知道用前向算法求HMM观测序列的概率
- 知道用后向算法求HMM观测序列的概率
本节我们就关注HMM第一个基本问题的解决方法,即已知模型和观测序列,求观测序列出现的概率。
1 回顾HMM问题一:求观测序列的概率
首先我们回顾下HMM模型的问题一。这个问题是这样的。
我们已知HMM模型的参数<span>λ=(A,B,Π)\lambda =(A,B,\Pi)λ=(A,B,Π)</span>
其中A是隐藏状态转移概率的矩阵,
B是观测状态生成概率的矩阵,
<span>Π\PiΠ</span>
同时我们也已经得到了观测序列<span>O={o1,o2,...oT}O={o_1,o_2,...o_T}O={o1,o2,...oT}</span>
现在我们要求观测序列O在模型<span>λ\lambdaλ</span><span>P(O∣λ)P(O|\lambda )P(O∣λ)</span>
乍一看,这个问题很简单。因为我们知道所有的隐藏状态之间的转移概率和所有从隐藏状态到观测状态生成概率,那么我们是可以暴力求解的。
我们可以列举出所有可能出现的长度为T的隐藏序列<span>i={i1,i2,...,iT}i={i_1,i_2,...,i_T}i={i1,i2,...,iT}</span><span>O={o1,o2,...oT}O={o_1,o_2,...o_T}O={o1,o2,...oT}</span><span>P(O,i∣λ)P(O,i|\lambda )P(O,i∣λ)</span><span>P(O∣λ)P(O|\lambda )P(O∣λ)</span>
具体暴力求解的方法是这样的:
-
首先,任意隐藏序列<span>i=i1,i2,...,iTi={i_1,i_2,...,i_T}i=i1,i2,...,iT</span>
- <span>P(i∣λ)=Πi