【机器学习】嘿马机器学习(算法篇)第10篇:HMM模型,4.7 HMM模型API介绍【附代码文档】

举报
程序员一诺python 发表于 2025/09/04 17:53:20 2025/09/04
【摘要】 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、极大似然函数取对数原因。


📚📚👉👉👉本站这篇博客:   https://bbs.huaweicloud.com/blogs/459678    中查看

📚📚👉👉👉本站这篇博客:   https://bbs.huaweicloud.com/blogs/459678    中查看

📚📚👉👉👉本站这篇博客:   https://bbs.huaweicloud.com/blogs/459678    中查看

✨ 本教程项目亮点

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


🎯🎯🎯全教程总章节


🚀🚀🚀本篇主要内容

HMM模型

学习目标

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

4.7 HMM模型API介绍

学习目标

  • 指导HMM模型API使用方法

1 API的安装:

官网链接:[

pip3 install hmmlearn

2 hmmlearn介绍

hmmlearn实现了三种HMM模型类,按照观测状态是连续状态还是离散状态,可以分为两类。

GaussianHMM和GMMHMM是连续观测状态的HMM模型,而MultinomialHMM是离散观测状态的模型,也是 在HMM原理系列篇里面使用的模型。

在这里主要介绍 前面一直讲的关于离散状态的MultinomialHMM模型。

对于MultinomialHMM的模型,使用比较简单,里面有几个常用的参数:

  • "startprob_"参数对应 的隐藏状态初始分布Π\PiΠ
  • "transmat_"对应 的状态转移矩阵A,
  • "emissionprob_"对应 的观测状态概率矩阵B。

3 MultinomialHMM实例

下面 用 在前面讲的关于球的那个例子使用MultinomialHMM跑一遍。

import numpy as np
from hmmlearn import hmm
# 设定隐藏状态的集合


states = ["box 1", "box 2", "box3"]
n_states = len(states)



# 设定观察状态的集合


observations = ["red", "white"]
n_observations = len(observations)



# 设定初始状态分布


start_probability = np.array([0.2, 0.4, 0.4])



# 设定状态转移概率分布矩阵


transition_probability = np.array([
  [0.5, 0.2, 0.3],
  [0.3, 0.5, 0.2],
  [0.2, 0.3, 0.5]
])



# 设定观测状态概率矩阵


emission_probability = np.array([
  [0.5, 0.5],
  [0.4, 0.6],
  [0.7, 0.3]
])
# 设定模型参数


model = hmm.MultinomialHMM(n_components=n_states)
model.startprob_=start_probability  # 初始状态分布
model.transmat_=transition_probability  # 状态转移概率分布矩阵
model.emissionprob_=emission_probability  # 观测状态概率矩阵

现在 来跑一跑HMM问题三维特比算法的解码过程,使用和之前一样的观测序列来解码,代码如下:

seen = np.array([[0,1,0]]).T  # 设定观测序列
box = model.predict(seen)

print("球的观测顺序为:\n", ", ".join(map(lambda x: observations[x], seen.flatten())))


# 注意:需要使用flatten方法,把seen从二维变成一维


print("最可能的隐藏状态序列为:\n" ", ".join(map(lambda x: states[x], box)))

再来看看求HMM问题一的观测序列的概率的问题,代码如下:

print(model.score(seen))


# 输出结果是:-2.03854530992

要注意的是score函数返回的是以自然对数为底的对数概率值, 在HMM问题一中手动计算的结果是未取对数的原始概率是0.13022。对比一下:

import math

math.exp(-2.038545309915233)


# ln0.13022≈−2.0385




# 输出结果是:0.13021800000000003

HMM模型

学习目标

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

集成学习进阶

学习目标

  • 知道xgboost算法原理
  • 知道otto案例通过xgboost实现流程
  • 知道lightGBM算法原理
  • 知道PUBG案例通过lightGBM实现流程
  • 知道stacking算法原理
  • 知道住房月租金预测通过stacking实现流程

5.1 xgboost算法原理

学习目标

  • 了解XGBoost的目标函数推导过程
  • 知道XGBoost的回归树构建方法
  • 知道XGBoost与GDBT的区别

XGBoost(Extreme Gradient Boosting)全名叫极端梯度提升树,XGBoost是集成学习方法的王牌,在Kaggle数据挖掘比赛中,大部分获胜者用了XGBoost。

XGBoost在绝大多数的回归和分类问题上表现的十分顶尖,本节将较详细的介绍XGBoost的算法原理。

1 最优模型的构建方法

在前面已经知道,构建最优模型的一般方法是最小化训练数据的损失函数

用字母 L表示损失,如下式:

![image-20200208232245211]

其中,F是假设空间

假设空间是在已知属性和属性可能取值的情况下,对所有可能满足目标的情况的一种毫无遗漏的假设集合。

式(1.1)称为经验风险最小化,训练得到的模型复杂度较高。当训练数据较小时,模型很容易出现过拟合问题。

因此,为了降低模型的复杂度,常采用下式:

![image-20200208232332474]

其中J(f)J(f)J(f)

式(2.1)称为结构风险最小化,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测 。


应用:

  • 决策树的生成和剪枝分别对应了经验风险最小化和结构风险最小化,
  • XGBoost的决策树生成是结构风险最小化的结果,后续会详细介绍。

2 XGBoost的目标函数推导

2.1 目标函数确定

目标函数,即损失函数,通过最小化损失函数来构建最优模型。

由前面可知, 损失函数应加上表示模型复杂度的正则项,且XGBoost对应的模型包含了多个CART树,因此,模型的目标函数为:

![image-20191125152552185]

(3.1)式是正则化的损失函数;

其中yiy_iy​i​​yi‾\overline{y_i}​y​i​​​​​

等式右边第一部分是模型的训练误差,第二部分是正则化项,这里的正则化项是K棵树的正则化项相加而来的。

2.2 CART树的介绍

![image-20191125153033502]

上图为第K棵CART树,确定一棵CART树需要确定两部分,

第一部分就是树的结构,这个结构将输入样本映射到一个确定的叶子节点上,记为fk(x)f_k(x)f​k​​(x)

第二部分就是各个叶子节点的值q(x)q(x)q(x)wq(x)w_q(x)w​q​​(x)

由定义得:

![image-20191125153641892]

2.3 树的复杂度定义

2.3.1 定义每课树的复杂度

XGBoost法对应的模型包含了多棵cart树,定义每棵树的复杂度:

![image-20191125153807795]

其中T为叶子节点的个数,||w||为叶子节点向量的模 。γ\gammaγ

2.3.2 树的复杂度举例

假设 要预测一家人对电子游戏的喜好程度,考虑到年轻和年老相比,年轻更可能喜欢电子游戏,以及男性和女性相比,男性更喜欢电子游戏,故先根据年龄大小区分小孩和大人,然后再通过性别区分开是男是女,逐一给各人在电子游戏喜好程度上打分,如下图所示:

![image-20200209123124049]

就这样,训练出了2棵树tree1和tree2,类似之前gbdt的原理,两棵树的结论累加起来便是最终的结论,所以:

  • 小男孩的预测分数就是两棵树中小孩所落到的结点的分数相加:2 + 0.9 = 2.9。
  • 爷爷的预测分数同理:-1 + (-0.9)= -1.9。

具体如下图所示:

![image-20200209123347317]

如下例树的复杂度表示:

![image-20200209140802104]

2.4 目标函数推导

根据(3.1)式,共进行t次迭代的学习模型的目标函数为:

![image-20191125154326563]

由前向分布算法可知,前t-1棵树的结构为常数

![image-20191125154439679]

知道,泰勒公式的二阶导近似表示:

![image-20191125154555089]

ft(xi)f_t(x_i)f​t​​(x​i​​)Δx\Delta xΔx

![image-20191125154850904]

其中:

![image-20191125154943413]

gig_ig​i​​hih_ih​i​​

![image-20191125155414956]表示前t-1棵树组成的学习模型的预测误差。

当前模型往预测误差减小的方向进行迭代。

忽略(3.8)式常数项,并结合(3.4)式,得:

![image-20191125155602606]

通过(3.2)式简化(3.9)式:

![image-20191125155630866]

(3.10)式第一部分是对所有训练样本集进行累加,

此时,所有样本都是映射为树的叶子节点,

所以, 换种思维,从叶子节点出发,对所有的叶子节点进行累加,得:

![image-20191125155745157]

GjG_j G​j​​HjH_jH​j​​

得:

![image-20191125155850305]

对于第 t 棵CART树的某一个确定结构(可用q(x)表示),其叶子节点是相互独立的,

GjG_jG​j​​HjH_jH​j​​

最小化(3.12)式,得:

![image-20191125160019152]

把(3.13)带入到(3.12),得到最终的目标函数:

![image-20191125160042316]

(3.14)也称为打分函数(scoring function),它是衡量树结构好坏的标准,

  • 值越小,代表这样的结构越好 。

  • 用打分函数选择最佳切分点,从而构建CART树。

3 XGBoost的回归树构建方法

3.1 计算分裂节点

在实际训练过程中,当建立第 t 棵树时,XGBoost采用贪心法进行树结点的分裂:

从树深为0时开始:

  • 对树中的每个叶子结点尝试进行分裂;

  • 每次分裂后,原来的一个叶子结点继续分裂为左右两个子叶子结点,原叶子结点中的样本集将根据该结点的判断规则分散到左右两个叶子结点中;

  • 新分裂一个结点后, 需要检测这次分裂是否会给损失函数带来增益,增益的定义如下:

![640?wx_fmt=png]

如果增益Gain>0,即分裂为两个叶子节点后,目标函数下降了,那么 会考虑此次分裂的结果。

那么一直这样分裂,什么时候才会停止呢?

3.2 停止分裂条件判断

情况一:上节推导得到的打分函数是衡量树结构好坏的标准,因此,可用打分函数来选择最佳切分点。首先确定样本特征的所有切分点,对每一个确定的切分点进行切分,切分好坏的标准如下:

![img]

  • Gain表示单节点obj与切分后的两个节点的树obj之差,

  • 遍历所有特征的切分点,找到最大Gain的切分点即是最佳分裂点,根据这种方法继续切分节点,得到CART树。

  • γ\gammaγ

  • γ\gammaγ

情况二:当树达到最大深度时,停止建树,因为树的深度太深容易出现过拟合,这里需要设置一个超参数max_depth。

情况三:当引入一次分裂后,重新计算新生成的左、右两个叶子结点的样本权重和。如果任一个叶子结点的样本权重低于某一个阈值,也会放弃此次分裂。这涉及到一个超参数:最小样本权重和,是指如果一个叶子节点包含的样本数量太少也会放弃分裂,防止树分的太细,这也是过拟合的一种措施。

4 XGBoost与GDBT的区别

  • 区别一:

  • XGBoost生成CART树考虑了树的复杂度,

  • GDBT未考虑,GDBT在树的剪枝步骤中考虑了树的复杂度。

  • 区别二:

  • XGBoost是拟合上一轮损失函数的二阶导展开,GDBT是拟合上一轮损失函数的一阶导展开,因此,XGBoost的准确性更高,且满足相同的训练效果,需要的迭代次数更少。

  • 区别三:

  • XGBoost与GDBT都是逐次迭代来提高模型性能,但是XGBoost在选取最佳切分点时可以开启多线程进行,大大提高了运行速度。


5 小结

  • XGBoost的目标函数

  • ![image-20200210143751199]

  • 知道XGBoost的回归树构建方法

  • ![img]

  • XGBoost与GDBT的区别

  • 区别一:

    • XGBoost生成CART树考虑了树的复杂度,
    • GDBT未考虑,GDBT在树的剪枝步骤中考虑了树的复杂度。
  • 区别二:

    • XGBoost是拟合上一轮损失函数的二阶导展开,GDBT是拟合上一轮损失函数的一阶导展开,因此,XGBoost的准确性更高,且满足相同的训练效果,需要的迭代次数更少。
  • 区别三:

    • XGBoost与GDBT都是逐次迭代来提高模型性能,但是XGBoost在选取最佳切分点时可以开启多线程进行,大大提高了运行速度。

🚀✨ (未完

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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