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

news/2024/5/19 13:57:06/文章来源:https://blog.csdn.net/qq_40206371/article/details/130312613

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.luyixian.cn/news_show_292985.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django项目之经济预测平台,应用LSTM、GBDT等算法

一、平台功能与技术点 1.技术点:Python3.9、Django4.1.7, tensorflow2.11.0,keras2.11.0,numpy1.24.2、bootstrap、ajax、MySQL等等 2.功能:正常前后端,前台主要完成经济预测功能(特征和标签都…

vue2数据响应式原理(7) 收集依赖,用get和set叙述出最基础的至高vue哲学

收集依赖在整个数据响应式中算是比较难的 首先 要理解这里所指的依赖 依赖 可能vue项目做多了就会想到 npm i 但其实跟这个是没有什么关系的 我们这里所指的依赖 是用到数据的地方 什么地方用到数据 什么地方就是依赖 简单说 就是依赖这个响应式数据 首先 我们看一下 vue1 和…

PWM 呼吸灯实验

PWM 呼吸灯实验 FPGA实现一个PWM模块(硬件)来控制灯的亮灭。 实验原理 PWM本质上就是一个输出脉冲的硬件,通过改变一个周期高电平(占空比)的时间来对其他的硬件进行控制,比如电机。 呼吸灯的实现利用了人…

ChatGPT实现语义分析情感分类

语义分析情感分类 我们从开源社区找到了中科院谭松波博士整理的携程网酒店评论数据集(https://raw.githubusercontent.com/SophonPlus/ChineseNlpCorpus/master/datasets/ChnSentiCorp_htl_all/ChnSentiCorp_htl_all.csv)。一共七千余条数据,包括 label 和 review …

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

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

【Python_Opencv图像处理框架】边缘检测、轮廓检测、图像金字塔

写在前面 本篇文章是opencv学习的第四篇文章,主要讲解了边缘及轮廓检测的主要操作,并对两种图像金字塔简单的介绍了一下,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正😍 …

C语言 sizeof, size_t, strlen

C语言 sizeof, size_t, strlen 文章目录 C语言 sizeof, size_t, strlen一. sizeof1.1 返回结构体长度 二. size_t三. sizeof 和 strlen 一. sizeof 返回一个结构体或者类型所占的内存字节数 1.1 返回结构体长度 这里我编写了2个结构体,区别在于数组问题 #include …

基于本地知识构建简易的chatPDF

Langchain chatglm-6b 文章目录 Langchain chatglm-6b前言一、实验记录1.1 环境配置1.2 代码理解1.3 补充内容 二、总结 前言 介绍:一种利用 ChatGLM-6B langchain 实现的基于本地知识的 ChatGLM 应用 Github: https://github.com/imClumsyPanda/langchain-Chat…

《个人博客部署上线教程一》Halo搭建个人博客网站

Halo搭建个人博客网站 一、docker部署Halo 目前测试了两种方法安装Halo,第一种是使用Jar包安装:提供JAR包资源,不过因为使用jar包部署需要Java11才可以,我本机使用的是Java8,所以暂时不做调整。第二种是通过docker安装。 1.1 启…

if条件语句

if条件语句 条件测试 test 测试表达式是否成立,若成立返回0,否则返回其他数值 格式1 :test 条件表达式;格式2 :[ 条件表达式 ] echo $?参数作用-d测试是否为目录 (Directory)-e测试目录或文件是否存在(Exist)-f测…

【java笔记】java多线程

目录 一、概念 1.1 什么是进程? 1.2 什么是线程? 1.3 什么事多线程? 1.4 进程和线程的关系 二、线程对象的生命周期 三、实现线程有两种方式 3.1 继承 java.lang.Thread,重写 run方法 3.2 实现 java.lang.Runnable 接口…

八、vue_options之computed、watch属性选项

一、computed计算属性使用 (1)复杂data的处理方式 (2)computed 计算属性 computed计算属性初体验: 在我们通过Vue调用createApp方法传入一个对象的时候,我们之前写了data属性、methods属性,这…

HTB-Time

HTB-Time 信息收集80端口 立足pericles -> root 信息收集 80端口 有两个功能,一个是美化JSON数据。 一个是验证JSON,并且输入{“abc”:“abc”}之类的会出现报错。 Validation failed: Unhandled Java exception: com.fasterxml.jackson.core.JsonPa…

低代码是开发的未来,还是只能解决边角问题的鸡肋?

随着互联网行业寒冬期的到来,降本增效、开源节流几乎成为了全球互联网厂商共同的应对措施,甚至高薪酬程序员的“35岁危机”一下子似乎变成了现实。程序员的高薪吸引了各行各业的“跨界选手”,是编程门槛降低了吗?不全是&#xff0…

Linux Ansible管理变量、管理事实、管理机密

目录 Ansible变量 变量定义范围 变量类型 定义变量并引用 事实变量与魔法变量 事实变量 魔法变量 Ansible加密 ansible-vault参数 ansible-vault举例 Ansible变量 Ansible支持利用变量来存储值,并且可以在Ansible项目的所有文件中重复使用这些值 变量可能…

Hadoop3.2.4+Hive3.1.2+sqoop1.4.7安装部署

目录 一、软件包 二、JDK部署 1.JDK解压 2.设置环境变量 3.环境验证 4.分发JDK相关文件至Node_02、Node_03 5.环境生效 三、Zookeeper部署 1.Zookeeper解压 2.Zookeeper配置 3.创建myid文件 4.设置环境变量并添加映射 5.分发ZooKeeper 相关文件至Node_02、Node_0…

Qt — Graphics/View框架

文章目录 前言一、Qt图形系统介绍二、Graphics/View框架 前言 Qt的Graphics/View框架被用来存放、显示二维图形元素,处理那些对图形元素进行操作的交互命令。 一、Qt图形系统介绍 Qt 应用程序的图形界面包含各种控件,比如窗口、按钮、滚动条等。所有这…

【单目标优化算法】沙猫群优化算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

4月24日~4月26日学习总结

一,刷题目情况,已经完成了8道题目,对于其中一些题目做一下题解。 这个题目的意思是找到的两个位置l和r,为了做到这个数组的l到r的子数组经过排序后,会变成输入的另外一个数组,这个题目的思路就是首先找到在…

服务(第十篇)Nginx和tomcat反向代理(动静分离)

正向代理: 当用户想访问某一网址时,用户先访问代理服务器,然后由代理服务器向目标网址发送请求最终将数据返回代理服务器,最后代理服务器将数据返回给用户这一过程我们称之为正向代理。 反向代理:基本流程是与正向代理…