AI算法工程师 | 09机器学习-概率图模型(三)隐马尔可夫模型 HMM

news2024/11/17 7:53:34

目录

  • 机器学习 - 概率图模型 之 隐马尔可夫模型 HMM
    • 一、马尔科夫链
    • 二、HMM 的基本概念
      • 1、HMM 背景与定义
      • 2、HMM 的两个基本假设
      • 3、确定 HMM 的两个空间和三组参数
    • 三、HMM 三个基本问题 | 导图
    • 四、HMM 相关算法
      • 1、前向算法
      • 2、维特比(Viterbi)算法
    • 五、案例:Viterbi 算法的代码实现

机器学习 - 概率图模型 之 隐马尔可夫模型 HMM

一、马尔科夫链

回顾:概率图模型的分类

概率图模型

  • HMM(隐马尔可夫模型)属于贝叶斯网络(有向图模型)的一种——是最简单的动态贝叶斯网络。

马尔可夫过程(Markov Processes)

马尔科夫过程

  • 定义:假设一个随机过程中, t n t_n tn 时刻的状态 s n s_n sn 的条件分布,仅仅与其前一个状态 s n − 1 s_{n-1} sn1 有关,即 P ( s n ∣ s 1 , s 2 , … , s n − 1 ) = P ( s n ∣ s n − 1 ) P(s_n|s_1,s_2,\ldots,s_{n-1})=P(s_n|s_{n-1}) P(sns1,s2,,sn1)=P(snsn1) ,则将其称为马尔可夫过程。

  • 特性:在已知系统当前状态的条件下,它未来的演变不依赖于过去的演变。

    • 也就是说,一个马尔可夫过程可以表示为:系统在状态转移过程中,第 t+1 次结果只受第 t 次结果的影响,即只与当前状态有关,而与过去状态(系统的初始状态和此次转移前的所有状态)无关。
  • 注意:马尔可夫过程其原始模型是马尔可夫链。

马尔科夫链(Markov Chain)
马尔可夫链

  • 定义:时间、状态都是离散的马尔可夫过程称为马尔可夫链。
  • 注意:隐马尔可夫模型是对含有未知参数(隐变量)的马尔科夫链进行建模的生成模型。

二、HMM 的基本概念

1、HMM 背景与定义

提出背景
背景

HMM 的定义

HMM 的定义

  • 隐马尔可夫模型(Hidden Markov Model, HMM)描述由隐藏的马尔科夫链生成观测序列的过程:

    • 一条隐藏的马尔可夫链随机生成了一个不可观测的状态序列(state sequence);
    • 然后每个状态又对应生成了一个观测结果,这些观测值按照时序排列后就成了观测序列(observation sequence)。
    • 这两个序列(状态序列、观测序列)是一一对应的,每个对应的位置又对应着一个时刻。
  • HMM 是一个关于时序的概率模型,它的变量分为两组:

    • ① 状态变量 s 1 , s 2 , . . . , s n {s_1,s_2,...,s_n} s1,s2,...,sn,如: s t s_t st 表示 t t t 时刻的系统状态;
    • ② 观测变量 o 1 , o 2 , . . . , o n {o_1,o_2,...,o_n} o1,o2,...,on,如: o t o_t ot 表示 t t t 时刻的观测值。
    • 状态变量和观测变量各自都是一个时间序列,每个状态/观测值都和一个时刻相对应。
  • HMM(Hidden Markov Model)各字母的含义:

    • 一般假定状态序列是隐藏的,不能被观测到的,因此状态变量是隐变量,这就是 HMM 中的 H(Hidden)的来源。
    • 这个隐藏的,不可观测的状态序列是由一个马尔可夫链随机生成的,这是 HMM 中的第一个 M(Markov)的含义。
  • 状态变量与观测变量的取值:

    • 一般而言,HMM 的状态变量取值是离散的;而观测变量的取值,则可以是离散的,也可以是连续的。
    • 不过为了方便讨论,也因为在大多数应用中观测变量也是离散的,因此,我们下面仅讨论状态变量和观测变量都是离散的情况。

2、HMM 的两个基本假设

两个假设:① 齐次马尔可夫假设、② 观测独立性假设

两个假设

3、确定 HMM 的两个空间和三组参数

两个空间:① 状态空间 Q、② 观测空间 V

两个空间

三组参数:① 状态初始概率分布 π、② 状态转移矩阵 A、③ 观测概率矩阵 B(又称:发射概率矩阵、混淆矩阵)

三组参数

三、HMM 三个基本问题 | 导图

三个基本问题:① 概率计算问题、② 预测问题、③ 学习问题

导图:
三个基本问题

四、HMM 相关算法

下面通过一个示例,分别使用前向算法求观测序列的概率、用维特比算法处理预测问题——目的:了解前向算法、维特比算法的思想

示例

1、前向算法

导图:前向算法的流程梳理
前向算法的流程

示例:使用前向算法求 HMM 观测序列的概率

示例
1
2
3
4

2、维特比(Viterbi)算法

导图:维特比算法的流程梳理
维特比算法的流程

示例:维特比算法解码隐藏状态序列(预测问题)

示例
思路

时刻1
时刻2
时刻3
结果

五、案例:Viterbi 算法的代码实现

案例分析
案例分析1
案例分析2

代码实现:( 工具:PyCharm,基于:python3)

"""
维特比(Viterbi)算法处理预测问题
⭐ 学习时间:2023.1.27
"""


def viterbi(obs, states, start_p, trans_p, emit_p):
    """
    :param obs:观测序列
    :param states:隐状态
    :param start_p:初始概率(隐状态)
    :param trans_p:转移概率(隐状态)
    :param emit_p: 发射概率 (隐状态表现为显状态的概率)
    :return:
    """
    
    V = [{}]  # 路径概率表 V[时间][隐状态] = 概率
    path = {}  # 一个中间变量,代表当前状态是哪个隐状态

    # ------ 初始化初始状态 (t == 0) ------ 
    for y in states:
        V[0][y] = start_p[y] * emit_p[y][obs[0]]
        path[y] = [y]
    print(V[0])
    print(path)

    # ------ 对 t > 0 跑一遍维特比算法 ------ 
    for t in range(1, len(obs)):
        V.append({})
        newpath = {}

        for y in states:
            # 概率 隐状态 =    前状态是y0的概率 * y0转移到y的概率 * y表现为当前状态的概率。注:下面包含了一个列表生成式
            (prob, state) = max([(V[t - 1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0)
                                 for y0 in states])

            V[t][y] = prob  # 记录最大概率
            newpath[y] = path[state] + [y]  # 记录路径

        print(V[t])

        path = newpath  # 不需要保留旧路径
        print(path)
        
    (prob, state) = max([(V[len(obs) - 1][y], y) for y in states])
    return prob, path[state]


if __name__ == '__main__':
    states = ('Rainy', 'Sunny')  # 隐状态
    observations = ('walk', 'shop', 'clean')  # 观测序列
    start_probability = {'Rainy': 0.6, 'Sunny': 0.4}  # 状态初始概率分布 π
    # 状态转移矩阵 A
    transition_probability = {
        'Rainy': {'Rainy': 0.7, 'Sunny': 0.3},
        'Sunny': {'Rainy': 0.4, 'Sunny': 0.6},
    }
    # 观测概率矩阵 B(又称:发射概率矩阵、混淆矩阵)
    emission_probability = {
        'Rainy': {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
        'Sunny': {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
    }

    result = viterbi(observations,
                     states,
                     start_probability,
                     transition_probability,
                     emission_probability)

    print(result)

运行结果:

运行结果

补充:下面是上述代码中涉及的部分 python 知识点梳理

  • 在 viterbi 函数中,(prob, state) = max([(V[t - 1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states]) 包含了 python 的列表生成式
    • 含义:
      # 概率 隐状态 =   前状态是y0的概率 * y0转移到y的概率 * y表现为当前状态的概率。
      (prob, state) = max([(V[t - 1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0)
                               for y0 in states])
      """ 
      代码解析:(结合完整代码进行理解)
      ① 列表生成式: [(V[t - 1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states]
      	—— 循环获取 states 中的每个状态,计算概率,并分别以 (概率,前状态) 元组的形式呈现,然后用列表依次装着这些元组;
      ② max(...) 对列表中的元组取最大值,元组是逐位比较大小的:
      	—— 将第一个元组的第一项与第二元组的第一项进行比较,若它们不相等(即第一个大于或小于第二个)那么这就是比较的结果。否则考虑第二项,然后是第三项,依此类推。
      ③ 将最终得到的元组 如 (0.01344, 'Rainy') 中的元素值分别对应赋值给 prob、state ,即:prob=0.01344、state='Rainy'。
      """
      
    • 示例:列表生成式
      示例

—— 说明:本文写于 2023.1.27~1.29,文中内容基于 python3,使用工具 PyCharm 编写的代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小红书购物笔记是什么

小红书购物笔记是什么 新手必看|12个小红书隐藏功能及操作玩法❗ #小红书#自媒体#新媒体#小红书隐藏功能#小红书运营#新手做小红书#小红书隐藏玩法#自媒体运营 hello,大家好,如果你刚好刷到这篇文章,说明你也是想做或正在做小红…

【内网安全】——msf木马生成教程

作者名:白昼安全主页面链接: 主页传送门创作初心: 一切为了她座右铭: 不要让时代的悲哀成为你的悲哀专研方向: web安全,后渗透技术每日emo: 钱真的是万能的一、msfvenom基本使用 1、–p (- -pay…

【目标检测论文解读复现NO.28】基于改进YOLO v5的电厂管道油液泄漏检测

前言此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文,…

C++工程实践必备技能

文章目录单元测试框架如何引入如何使用测试相关SUBCASETEST_SUITETEST_CASE_FIXTURETEST_CASE_TEMPLATE断言相关常用断言宏常用工具函数benchmark框架如何引入如何使用防止被优化优化不稳定比较测试结果计算BigO输出结果到其他格式CLion中查看测试覆盖率CLion中使用sanitizers检…

【Graph】NetworkX官方基础教程:图的生成与相关操作

NetworkX官方基础教程:图的生成与相关操作1. Graph生成和graph操作2. 分析图3. 画图参考资料本文作为对图结构和复杂网络的快速上手,内容包括基于NetworkX进行图的生成与相关操作,Graph的分析以及绘制Graphs。 NetworkX官方基础教程 1. Grap…

Mapper代理开发

1、定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。 在Resources下新建层级包需要用分隔符 / 2、设置SQL映射文件的namespace属性为UserMapper接口全限定名 全限定类名就是类名全称,带包路径的用点隔开&#xff…

Python从入门到入土的90行代码

文章目录基础入门菜鸟提升基础晋级高手之路内置包库奇技淫巧基础入门 1 python 即在命令行输入python,进入Python的开发环境。 2 x 12*3-4/56**2 加减乘除四则混合运算,可当作计算器使用,其中**表示乘方。 3 print(x) 即输出x的值&#x…

毕业设计:基于汇编实现的欢乐QQ堂小游戏 附完整代码

本次实现制作了汇编版的QQ堂,使用了VGA 320x200 256色视频显示, FAT12文件系统、时钟中断,nasm + gcc联合编译,通过端口设置调色板。其中除了AI,游戏界面、逻辑等均由汇编实现。游戏具有良好的图形界面,流畅的操作性,令人愉快的玩法,并且有AI与你作战。 首先展示游戏的开…

npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径 正确,然后再试一次。

npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径 正确,然后再试一次。解决方法方法一:以管理员身份运行方法二:查看npm环境变量配置方法一&#xf…

3.1.4 构造函数及构造代码块

文章目录1.概念2.形式3.练习4.关于构造函数的总结5.构造代码块与局部代码块5.1 形式5.2 构造代码块的特点5.3 局部代码块5.4 练习5.5 静态/构造/局部代码块的比较1.概念 构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法 构造方法的主要功能就是完成对象创建…

如何在android开发中使用Kotlin Flow(一)

Kotlin 的Flow可以对数据流进行建模,类似LiveData、RxJava的数据流。 Flow也是用观察者模式实现的。 观察者模式包括了可观察对象(Observable,生产者、发射者、源这些称呼都是指可观察对象,可以被观察)、观察对象&…

如何安装谷歌服务框架?(Google三件套下载教程)

谷歌服务框架,想必大家已经了解过了,都知道是个什么东西。这里我在赘述一下,谷歌服务框架是支持谷歌应用商店(Google Play)正常运行的服务框架,没有它,谷歌商店无法正常在安卓手机上运行&#x…

计算机图形学 第6章 三维变换与投影

目录 # 学习要求 前置知识 三维几何变换总的式子: 平移变换 比例变换 旋转变换:绕x轴旋转 反射变换 错切变换 三维复合变换 坐标系变换 正交投影矩阵 三视图 斜投影定义 透视投影 透视变换坐标系 ## 代码 透视投影分类 # 学习要求 …

怎么把图片做成gif动图?三步搞定gif在线制作

在日常办公、生活中经常会使用一些gif动态图片,生动有趣画面丰富。很好奇这些gif动图是怎么制作的吧!其实,制作gif表情包的方法很简单,给大家分享几个简单实用的gif制作(https://www.gif.cn/)方法&#xff…

ccflow 代码——流程讲义

爬虫组件分析目录概述需求:设计思路实现思路分析1.表单引擎模版表系统框架Jflow 对使用者的要求参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,…

CV——day71 零基础学YOLO:YOLOv2

YOLOv25. YOLOv25.1 YOLOv2升级概述5.2 YOLOv2网络架构5.3 基于聚类提取先验框5.4 偏移量计算方法5.5 坐标映射与还原5.6 感受野的作用5.7 特征融合改进5.7.1 多尺度检测5.8 YOLOv2 总结5. YOLOv2 5.1 YOLOv2升级概述 可以看出,v2的map相比v1改进了很多&#xff0c…

KafkaProducer线程安全吗?

这是我今天面试被问的一个问题&#xff0c;这会回来就来看看源码 先看KafkaProducer的构造函数 public KafkaProducer(Map<String, Object> configs) { this((ProducerConfig)(new ProducerConfig(configs)), (Serializer)null, (Serializer)null); } public KafkaPro…

[MRCTF2020]PixelShooter1题解

Android一词最早出现于法国作家利尔亚当&#xff08;Auguste Villiers de lIsle-Adam&#xff09;在1886年发表的科幻小数《未来的夏娃》&#xff08;Lve future&#xff09;中。他将外表像人的机器起名为Android。 本题是一个安卓逆向 1.下载到手机玩一玩 是一个32位文件下载…

2-JVM、JRE、JDK的作用及联系和区别

在Java环境配置和项目启动中&#xff0c;这三者的配置是项目启动的基础保证。 JVM(Java Virtual Machine)&#xff0c;Java虚拟机&#xff0c;就是一个虚拟的用于解析bytecode字节码的”虚拟计算机”。一般与OS操作系统打交道。是整个java实现跨平台的最核心的部分【使用Java编…

GlobalPointer:用统一的方式处理嵌套和非嵌套NER

本文将介绍一个称为GlobalPointer的设计&#xff0c;它利用全局归一化的思路来进行命名实体识别&#xff08;NER&#xff09;&#xff0c;可以无差别地识别嵌套实体和非嵌套实体&#xff0c;在非嵌套&#xff08;Flat NER&#xff09;的情形下它能取得媲美CRF的效果&#xff0c…