机器学习笔记Python笔记:HMM(隐马尔科夫模型)

news2024/11/19 5:44:43

1 引子:猜天气小游戏

一对异地恋的情侣,女朋友想根据男友的心情猜测男友所在城市的天气

1.1 天气和心情一定一一对应

  • 晴天——>高兴
  • 雨天——>烦躁

 可以根据心情唯一确定天气

1.2 天气和心情没有一一对应

  • 晴天——>80%高兴,20%烦躁
  • 雨天——>60%高兴,40%烦躁

1.3 天气和心情没有一一对应+连续两天的天气之间有转换概率

  • 天气和心情的对应关系
    • 晴天——>80%高兴,20%烦躁
    • 雨天——>60%高兴,40%烦躁
  • 天气的转换概率
    • 晴天——>后一天80%的概率是晴天,20%的概率是雨天
    • 雨天——>后一天40%的概率是晴天,60%的概率是雨天

 2 HMM(hidden markov model)隐马尔科夫模型

2.1 四个重要的概念

  • 观测值 observation
    • 能观测到的,心情是高兴(H)还是烦躁(G)
  • 隐藏状态 hidden
    • 看不见的状态,通过观测值来推断
    • 天气时晴天(S)还是雨天(R)
  • 转换概率 transition probability
    • 隐藏状态的转换概率
    • 今天晴天,明天是明天or雨天的概率,0.8/0.2
    • 今天雨天,明天是晴天or雨天的概率,0.4/0.6
  • 输出概率 emission probability
    • 从隐藏状态到观测值的概率
    • 晴天到 开心/烦躁的概率,分别是0.8/0.2
    • 雨天到 开心/烦躁的概率,分别是0.4/0.6

——>上述1.3的问题,可以写成如下的HMM形式:

 3 HMM的几个核心问题

3.1 估计转换概率和输出概率

3.1.1 转换概率

收集历史数据,统计各种天气状态转换的数量

比如收集了16天的天气:

 分别统计 (晴天->晴天,晴天——>雨天),(雨天——>雨天,雨天——>晴天)的个数,分别计算概率(每一组的概率之和为1)

3.1.2 输出概率

和3.1.1 类似,也是收集数据,通过数量统计估计概率

也是收集16天的数据:

分别统计(晴天——>高兴、晴天——>烦躁);(雨天——>高兴、雨天——>烦躁)的个数,计算概率(每一组的概率之和为1)

 

3.2 不知道男友情绪(不知道观测值),如果估计晴天和雨天?

此时我们知道的只是隐藏状态的转换概率:

  • 如果今天是晴天,那么有0.8的概率昨天是晴天,有0.4的概率昨天是雨天

  • 如果今天是雨天,那么有0.6的概率昨天也是雨天,有0.2的概率昨天是晴天

  • 今天只有可能是晴天或者雨天的一种,所以S+R=1
  • ——>S=2/3,R=1/3,即不知道男友心情是,推断当地天气是晴天和雨天的概率分别是2/3和1/3

3.3  只考虑一天,知道男友心情,推断当地天气

  • 通过3.2我们知道,不考虑心情的话,某一天有2/3的概率是晴天,1/3的概率是雨天

    • ——>可以推断出,如果男友高兴,那么有8/10=4/5的概率是晴天,1/5的概率是雨天
    • ——>如果男友不高兴,那么2/5的概率是晴天,3/5的概率是雨天

3.4 知道连续几天的心情,推断连续几天的天气

3.4.1 穷举法

  • 比如男友的心情是高兴-烦躁
    • 先使用穷举法列出可能的心情排列组合方式(每一天两种可能性,一共2*2=4种)
    • 以上述四种排列组合种的(晴天-雨天)为例,计算一下出现这种天气排列组合方式的概率
      • 第一天是晴天的概率:2/3【隐藏状态概率,源自于3.2】
      • 第一天是晴天,第一天心情是高兴的概率是0.8【输出概率,HMM信息】
      • 第一天是晴天,第二天是雨天的概率是0.2【转移概率,HMM信息】
      • 第二天是雨天,第二天心情是烦躁的概率是0.6【输出概率,HMM信息】
      • ——>心情是(高兴-烦躁),天气是(晴天-雨天)的概率是:

        • 2/3 * 0.8 * 0.2 * 0.6 = 0.0644
    • 穷举四种排列组合,分别计算他们的概率,概率最大的一个就是最有可能的天气组合(这里是晴天-晴天)

  • 穷举法的问题是,如果需要推断连续n天的天气情况,需要2^n个排列组合结果的概率都算一遍,开销很大

 3.4.2 维特比算法

  • 优化穷举法的一种算法
    • 根据第k-1步的结果,估算第k步的结果
  • 比如现在的心情是高兴-高兴-烦躁-烦躁-烦躁-高兴,我们需要推断可能的天气链
    • 从第一天开始,晴天的概率是0.67,雨天的概率是0.33(3.2求得)

      • 第一天天气为晴天/雨天时,心情为高兴的概率:

        • 概率更大的晴天,可能性更大
    • 第二天
      • 再计算第二天是晴天的概率,他可能是由第一天是晴天/雨天导致的(蓝色的是转换概率,红色的是输出概率,后同)

        • 0.341大,所以SS组合的概率大于RS组合的概率
      • 第二天是雨天的概率同理:
    • 第三天
      • 第三天是晴天的概率:
        • P(G|SSS)=0.341*0.8*0.2=0.05456
        • P(G|SRS)=0.043*0.4*0.2=0.00344
      • 第三天是雨天的概率
        • P(G|SSR)=0.341*0.2*0.6=0.04092
        • P(G|SRR)=0.032*0.6*0.6=0.01152
      • ——>第三天是晴天or雨天的概率分别是0.05456,0.04092
    • 第四天
      • 第四天是晴天的概率
        • P(G|SSSS)=0.05456*0.8*0.2=0.0087
        • P(G|SSRS)=0.04092*0.4*0.2=0.0033
      • 第四天是雨天的概率
        • P(G|SSSR)=0.05456*0.2*0.6=0.0065
        • P(G|SSRR)=0.04092*0.6*0.6=0.0147
      • ——>第四天是晴天or雨天的概率分别是0.0087,0.0147
    • 第五天
      • 第五天是晴天的概率
        • P(G|SSSSS)=0.0087*0.8*0.2=0.0014
        • P(G|SSRRS)=0.0147*0.4*0.2=0.0012
      • 第五天是雨天的概率
        • P(G|SSSSR)=0.0087*0.2*0.6=0.0010
        • P(G|SSRRR)=0.0147*0.6*0.6=0.0053
      • 第五天是晴天or雨天的概率分别是0.0014,0.0053
    • 第六天
      • 第六天是晴天的概率
        • P(H|SSSSSS)=0.0014*0.8*0.8=0.00089
        • P(H|SSRRRS)=0.0053*0.4*0.8=0.0017
      • 第六天是雨天的概率
        • P(H|SSSSSR)=0.0014*0.2*0.4=0.00011
        • P(H|SSRRRR)=0.0053*0.6*0.4=0.0013
    • 沿着日期,找出每天晴天雨天概率中较大的那个,连成一条线,就是估计的天气链

  • 总结一下:
    • 假设我们已经知道第k-1天是晴天or雨天的概率
    • 那么第k天是晴天or雨天的概率为
      • 第k-1天是晴天or雨天的概率*相应的转换概率*相应的第k天的输出概率

4 Python实现

4.1 数据部分 

p_s=2/3
p_r=1/3
p_init=[p_s,p_r]
#不考虑心情的话,单天晴天or雨天的概率(初始概率)

p_ss=0.8
p_sr=0.2
p_rs=0.4
p_rr=0.6
p_transition=[p_ss,p_sr,p_rs,p_rr]
#转换概率(左先右后)

p_sh=0.8
p_sg=0.2
p_rh=0.4
p_rg=0.6
p_output=[p_sh,p_sg,p_rh,p_rg]
#输出概率

observation=['H', 'H', 'G', 'G', 'G', 'H']
#男友的心情,观测值

state=['S','R']
#隐藏状态

ob_state=['H','G']
#观测状态

4.2 维特比算法

import numpy as np
def viterbi(observation,
           p_init,
           p_transition,
           p_output,
           state,
           ob_state):
    
    n_state=len(state)
    n_seq_len=len(observation)
    

    weather_prob=np.zeros((n_seq_len,n_state))
    #每个时刻不同状态的概率


    state_index=ob_state.index(observation[0])
    for i in range(n_state):
            weather_prob[0][i]=max(weather_prob[0][i],
                                       p_init[i]*\
                                      p_output[i*n_state+state_index])
    #第一天各状态的概率

        
    for i in range(1,n_seq_len):
        state_index=ob_state.index(observation[i])
        for j in range(n_state):
            for k in range(n_state):
                weather_prob[i][j]=max(weather_prob[i][j],
                                       weather_prob[i-1,k]*\
                                       p_transition[k*n_state+j]*\
                                      p_output[j*n_state+state_index])
    #后续每天各状态的概率

    weather=[]
    for i in range(n_seq_len):
        weather.append(state[np.argmax(weather_prob[i])])
    #每天的推测状态,取决于这一天概率最大的那个状态

    return weather_prob,weather

4.3 测试结果

viterbi(observation,
           p_init,
           p_transition,
           p_output,
           state,
           ob_state)
'''
(array([[0.53333333, 0.13333333],
        [0.34133333, 0.04266667],
        [0.05461333, 0.04096   ],
        [0.00873813, 0.0147456 ],
        [0.0013981 , 0.00530842],
        [0.00169869, 0.00127402]]),
 ['S', 'S', 'S', 'R', 'R', 'S'])
'''

参考内容:小孩都看得懂的 HMM (qq.com) 

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

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

相关文章

有关实现深拷贝的四种方法

深拷贝与浅拷贝: 在开始之前我们需要先了解一下什么是浅拷贝和深拷贝,其实深拷贝和浅拷贝都是针对的引用类型,JS中的变量类型分为值类型(基本类型)和引用类型;对值类型进行复制操作会对值进行一份拷贝,而对…

Logstash学习

一、Logstash基础 1、什么是Logstash logstash是一个数据抽取工具,将数据从一个地方转移到另一个地方。下载地址:https://www.elastic.co/cn/downloads/logstash logstash之所以功能强大和流行,还与其丰富的过滤器插件是分不开的&#xff…

CDGP认证|ChatGPT的出现,对数据治理行业冲击如何?

ChatGPT的出现对数据治理有很多好处,其中最明显的是提供了更高效、更准确和更自动化的数据处理和分析服务,可以帮助企业和组织更好地管理和利用数据资源,提高数据质量和决策效率。此外,ChatGPT还能够发现隐藏在大量数据中的信息和趋势&#x…

OJ练习第82题——填充书架

填充书架 力扣链接:1105. 填充书架 题目描述 给定一个数组 books ,其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。 按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。 先选几本书放在书架…

Nexus 组件发布失败、npm 登录失败 解决过程

目录 参考发布文章进行打包 提示发布成功,但在 Nexus 里没发现组件 测试 yarn 发布 测试 npm 发布(解决登录失败) Nexus 设置 Sonatype Nexus Repository Manager 相关权限 参考发布文章进行打包 整体发布:根目录运行 yarn r…

直播软件app开发:如何保证音视频质量?

随着社交媒体的发展,视频直播已成为越来越流行的社交方式。直播软件app开发也因此成为了一个热门话题。在开发直播软件app时,保证音视频质量是至关重要的。本文将介绍如何确保你的直播软件app在音视频质量方面表现出色。 确定音视频质量标准 首先&…

第七章 建造者模式

文章目录 前言一、传统方式解决盖房子需求完整代码抽象房子类 AbstractHouse实现子类 普通房子实现子类 高楼大厦客户端盖房子 二、引入建造者模式建造者模式的四个角色: 产品、抽象建造者、具体建造者、指挥者完整代码House类 (产品角色)抽象父类(抽象建…

CV 领域的 ChatGPT?MetaAI 推出“最强”大视觉模型 SAM

出品人:Towhee 技术团队 随着 ChatGPT 引起一波又一波的“GPT热潮”,自然语言领域又一次成为了人工智能的讨论焦点。大家不由得思考,计算机视觉领域里是否会出现这样一个堪称划时代的模型?在这种万众瞩目的时候,一直处…

Python3《机器学习实战》学习笔记(七):支持向量机原理篇之手撕线性SVM

文章目录 一、SVM介绍二、线性SVM2.1 数学建模2.1.1决策面方程2.1.2"分类间隔"方程2.1.3约束条件2.1.4线性SVM优化问题基本描述2.1.5求解准备(讲讲凸函数)2.1.6拉格朗日函数2.1.7KKT条件2.1.8对偶问题求解2.1.9最后求解 2.2 SMO算法 三、代码实战3.1准备数据 一、SVM…

M_Map工具箱简介及地理图形绘制

M_Map工具箱简介及地理图形绘制 1 M_Map简介1.1 具体代码说明 2 地理图形绘制案例2.1 M_Map给定案例2.1.1 M_Map Logo2.1.2 Lambert Conformal Conic projection of North American Topography2.1.3 Stereographic projection of North Polar regions2.1.4 Colourmaps 2.2 案例…

vue封装公共组件库并发布到npm库详细教程

vue组件封装的原理:利用vue框架提供的api: Vue.use( plugin ),我们需要把封装好组件的项目打包成vue库,并提供install方法,然后发布到npm中。Vue.use( plugin )的时候会自动执行插件中的install方法。 一、组件库代码目录 目录…

常见的四种排名函数的用法(sql)

四个排名函数: 1.row_number 2.rank 3.dense_rank 4.ntile 1. ROW_NUMBER(排名场景推荐) 1.1 介绍 在 SQL 中,ROW_NUMBER() 是一个窗口函数,它为结果集中的每一行分配一个唯一的序号。该函数的语法如下: …

内网渗透之横向移动PTHPTTPTK

0x00前言 pass the hash(哈希传递攻击,简称pth) pass the ticket(票据传递攻击,简称ptt) pass the key(密钥传递攻击,简称ptk) PTH(pass the hash) #利用的lm或ntlm的值…

【社区图书馆】 Go佬—Go程序开发实战宝典书评

文章目录 前言内容介绍文章大致划分总结 前言 《Go 程序开发实战宝典》是一本非常实用的 Go 语言开发工具书,本书由深入浅出的案例讲解、详细的技术实现、贴近实际的应用开发等组成,非常适合 Go 语言开发爱好者、从事相关行业的工程师、技术负责人以及深…

ThinkPHP视图

ThinkPHP视图 前言视图一、运算符二、模版函数三、循环标签四,volist 循环标签五,if 判断标签六,switch 判断标签七、包含文件八、其他标签1. 条件标签2. 比较标签3. 循环标签4. 杂项标签 总结 前言 ThinkPHP视图基本语法和PHP语法非常的像,所…

React Native 9个好用的开发工具盘点

近几年在大前端的开发领域,选择跨端方案的公司和部门越来越多,曾一何时市面有不下10种跨端框架,但随着“生物进化论”的推动,目前市面上仅剩两种主流方案,就是经常听到的 React Native 和 Flutter。去年终于引来了 Rea…

企业网络安全漏洞分析及其解决_kaic

摘要 为了防范网络安全事故的发生,互联网的每个计算机用户、特别是企业网络用户,必须采取足够的安全防护措施,甚至可以说在利益均衡的情况下不惜一切代价。事实上,许多互联网用户、网管及企业老总都知道网络安全的要性,却不知道网…

《JavaEE初阶》多线程进阶

《JavaEE初阶》多线程进阶 文章目录 《JavaEE初阶》多线程进阶常见锁策略乐观锁与悲观锁普通互斥锁与读写锁轻量级锁与重量级锁自旋锁与挂起等待锁公平锁和非公平锁可重入锁和不可重入锁 CAS什么是CASCAS的应用场景:CAS 的 ABA 问题什么是CAS 的 ABA 问题解决方案: synchronize…

libxml2交叉编译和移植

编译后的libxml2如果交叉编译环境一致可以直接使用资源-CSDN文库 嵌入式开发过程中实用libxml2进行xml文件的解析、创建、使用。 这里介绍一下该libxml2的交叉编译过程和移植步骤 下载地址 libxml2 各版本下载地址 ftp://xmlsoft.org/libxml2/ ftp://xmlsoft.org/libxml2…

【汽车电子】5分钟了解汽车操作系统(科普篇)

在智能汽车电动汽车的浪潮下,「软件定义汽车」的理念已经成为很多厂家的共识,未来决定汽车个性化差异的不再是马力大小、座椅材质、底盘软硬等,而应该是人工智能、大数据和云计算技术的综合体。 要想实现这一切,就要给汽车安装一个…