机器学习中的隐马尔可夫模型及Python实现示例

隐马尔可夫模型(HMM)是一种统计模型,用于描述观测序列和隐藏状态序列之间的概率关系。它通常用于生成观测值的底层系统或过程未知或隐藏的情况,因此它被称为“隐马尔可夫模型”。

它用于根据生成数据的潜在隐藏过程来预测未来的观察结果或对序列进行分类。

HMM由两种类型的变量组成:隐藏状态和观测值。

  • 隐藏状态是生成观测数据的基础变量,但它们不是直接可观测的。
  • 观测值是被测量和观测的变量。

隐藏状态和观测值之间的关系使用概率分布建模。隐马尔可夫模型(HMM)是使用两组概率(转换概率和发射概率)来描述隐藏状态和观测值之间的关系。

  • 转换概率描述了从一个隐藏状态转换到另一个隐藏状态的概率。
  • 发射概率描述了在给定隐藏状态的情况下观察到输出的概率。

隐马尔可夫模型算法

隐马尔可夫模型(HMM)算法可以使用以下步骤来实现:

  • 步骤1:定义状态空间和观测空间
    状态空间是所有可能的隐藏状态的集合,观察空间是所有可能的观察的集合。
  • 步骤2:定义初始状态分布
    这是初始状态的概率分布。
  • 步骤3:定义状态转移概率
    这些是从一种状态转换到另一种状态的概率。这就形成了转移矩阵,它描述了从一种状态转移到另一种状态的概率。
  • 步骤4:定义观测似然
    这些是从每个状态生成每个观测的概率。这就形成了发射矩阵,它描述了从每个状态生成每个观测的概率。
  • 步骤5:训练模型
    使用Baum-Welch算法或前向-后向算法估计状态转移概率和观测似然的参数。这是通过迭代更新参数直到收敛来完成的。
  • 步骤6:解码最可能的隐藏状态序列
    给定观察到的数据,维特比算法用于计算最可能的隐藏状态序列。这可以用来预测未来的观察,分类序列,或检测序列数据中的模式。
  • 步骤7:评估模型
    HMM的性能可以使用各种度量来评估,例如准确度,精确度,召回率或F1分数。

总之,HMM算法涉及定义状态空间、观测空间以及状态转移概率和观测似然的参数,使用Baum-Welch算法或前向-后向算法训练模型,使用Viterbi算法解码最可能的隐藏状态序列,以及评估模型的性能。

Python中的实现及示例

使用hmmlearn库实现简单隐马尔可夫模型(HMM)的Python关键步骤。

示例1:预测天气

问题陈述:给定天气条件的历史数据,任务是根据当前天气预测第二天的天气。

1.导入所需的库

# import the necessary libraries 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 
from hmmlearn import hmm

2.定义模型参数

在这个例子中,状态空间被定义为一个状态,它是两个可能的天气条件的列表:“晴天”和“雨天”。观测空间被定义为观测,其是两个可能观测的列表:“干”和“湿”。隐藏状态的数量和观察的数量被定义为常数。

# Define the state space 
states = ["Sunny", "Rainy"] 
n_states = len(states) 
print('Number of hidden states :',n_states) 
# Define the observation space 
observations = ["Dry", "Wet"] 
n_observations = len(observations) 
print('Number of observations :',n_observations)

输出

Number of hidden states : 2
Number of observations  : 2

开始概率、转移概率和发射概率被定义为数组。开始概率表示在每个隐藏状态中开始的概率,转移概率表示从一个隐藏状态转移到另一个隐藏状态的概率,并且发射概率表示给定隐藏状态观察每个输出的概率。

初始状态分布被定义为state_probability,其是表示第一状态为“Sunny”或“Rainy”的概率的概率阵列。状态转换概率定义为transition_probability,它是一个2×2数组,表示从一个状态转换到另一个状态的概率。观测似然被定义为emission_probability,它是一个2×2数组,表示从每个状态生成每个观测的概率。

# Define the initial state distribution 
state_probability = np.array([0.6, 0.4]) 
print("State probability: ", state_probability) # Define the state transition probabilities 
transition_probability = np.array([[0.7, 0.3], [0.3, 0.7]]) 
print("\nTransition probability:\n", transition_probability) 
# Define the observation likelihoods 
emission_probability= np.array([[0.9, 0.1], [0.2, 0.8]]) 
print("\nEmission probability:\n", emission_probability)

输出

State probability:  [0.6 0.4]Transition probability:[[0.7 0.3][0.3 0.7]]Emission probability:[[0.9 0.1][0.2 0.8]]

3.创建HMM模型的实例并设置模型参数

HMM模型使用hmmlearn库中的hm.CategoricalHMM类定义。创建CategoricalHMM类的实例,将隐藏状态的数量设置为n_hidden_states,并使用startprob_、transmat_和emissionprob_属性将模型的参数分别设置为状态概率、转移概率和发射概率。

model = hmm.CategoricalHMM(n_components=n_states) 
model.startprob_ = state_probability 
model.transmat_ = transition_probability 
model.emissionprob_ = emission_probability

4.定义观测序列

一个观测序列被定义为一个一维NumPy数组。
观察到的数据被定义为observations_sequence,它是一个整数序列,表示观察列表中的相应观察。

# Define the sequence of observations 
observations_sequence = np.array([0, 1, 0, 1, 0, 0]).reshape(-1, 1) 
observations_sequence

输出

array([[0],[1],[0],[1],[0],[0]])

5.预测最可能的隐藏状态序列

隐状态的最可能的序列使用HMM模型的预测方法来计算。

# Predict the most likely sequence of hidden states 
hidden_states = model.predict(observations_sequence) 
print("Most likely hidden states:", hidden_states)

输出

Most likely hidden states: [0 1 1 1 0 0]

6.解码观察序列

Viterbi 算法用于计算最可能的隐藏状态序列,该隐藏状态序列使用模型的解码方法生成观察结果。该方法返回最可能的隐藏状态序列的对数概率和隐藏状态序列本身。

log_probability, hidden_states = model.decode(observations_sequence, lengths = len(observations_sequence), algorithm ='viterbi' ) print('Log Probability :',log_probability) 
print("Most likely hidden states:", hidden_states)

输出

Log Probability : -6.360602626270058
Most likely hidden states: [0 1 1 1 0 0]

这是一个如何实现基本HMM并使用它来解码观察序列的简单算法。hmmlearn库提供了更先进、更灵活的Hondership实现,并提供了参数估计和训练等额外功能。

7.绘制结果

# Plot the results 
sns.set_style("whitegrid") 
plt.plot(hidden_states, '-o', label="Hidden State") 
plt.xlabel('Time step') 
plt.ylabel('Most Likely Hidden State') 
plt.title("Sunny or Rainy") 
plt.legend() 
plt.show()

在这里插入图片描述
最后,使用matplotlib库绘制结果,其中x轴表示时间步长,y轴表示隐藏状态。该图显示,该模型预测的天气大部分是晴天,其中夹杂着一些雨天。

示例2:手写识别

问题陈述:给定一个手写字符的数据集,任务是根据字符的形状识别字符。

在这个例子中,状态空间被定义为状态,这是一个26个可能字符的列表。观察空间被定义为观察,其是8个可能的观察的列表,表示手写体中的笔划的方向。初始状态分布定义为start_probability,它是一个概率数组,表示第一个状态是26个字符中任何一个的概率。状态转换概率定义为transition_probability,它是一个26×26的数组,表示从一个字符转换到另一个字符的概率。观测似然度被定义为emission_probability,它是一个26×8的数组,表示从每个字符生成每个观测的概率。

HMM模型是使用hmmlearn库中的hmm.MultinomialHMM类定义的,模型的参数是使用模型对象的startprob_、transmat_和emissionprob_属性设置的。

观察序列定义为observations_sequence,是一个长度为11的数组,表示手写体中的11个笔画。模型对象的predict方法用于在给定观测值的情况下预测最可能的隐藏状态。结果存储在hidden_states变量中,该变量是一个长度为11的数组,表示每个笔划最可能的字符。

# import the necessary libraries 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 
from hmmlearn import hmm # Define the state space 
states = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] 
n_states = len(states) # Define the observation space 
observations = ["up", "down", "left", "right", "up-right", "down-right", "down-left", "up-left"] 
n_observations = len(observations) # Define the initial state distribution 
start_probability = np.random.dirichlet(np.ones(26),size=(1))[0] # Define the state transition probabilities 
transition_probability = np.random.dirichlet(np.ones(26),size=(26)) # Define the observation likelihoods 
emission_probability = np.random.dirichlet(np.ones(26),size=(26)) # Fit the model 
model = hmm.CategoricalHMM(n_components=n_states) 
model.startprob_ = start_probability 
model.transmat_ = transition_probability 
model.emissionprob_ = emission_probability # Define the sequence of observations 
observations_sequence = np.array([0, 1, 2, 1, 0, 1, 2, 3, 2, 1, 2]).reshape(-1, 1) # Predict the most likely hidden states 
hidden_states = model.predict(observations_sequence) 
print("Most likely hidden states:", hidden_states) # Plot the results 
sns.set_style("whitegrid") 
plt.plot(hidden_states, '-o', label="Hidden State") 
plt.xlabel('Stroke') 
plt.ylabel('Most Likely Hidden State') 
plt.title("Predicted hidden state") 
plt.legend() 
plt.show()

输出

Most likely hidden states: [ 4 23  8 21  6 21 16 14 11 23 22]

在这里插入图片描述
最后,使用matplotlib中的plot函数绘制结果,该函数显示手写体中每个笔划的预测隐藏状态。

示例3:语音识别

问题陈述:给定音频记录的数据集,任务是识别录音中所说的单词。

在该示例中,状态空间被定义为状态,其是表示静音或3个不同单词之一的存在的4个可能状态的列表。观测空间被定义为观测,其是表示语音音量的2个可能观测的列表。初始状态分布被定义为start_probability,它是长度为4的概率数组,表示每个状态是初始状态的概率。

状态转移概率被定义为transition_probability,它是一个4×4矩阵,表示从一个状态转移到另一个状态的概率。观测似然被定义为emission_probability,它是一个4×2矩阵,表示每个状态发出观测的概率。

该模型使用hmmlearn库中的MultinomialHMM类定义,并使用startprob_、transmat_和emissionprob_属性拟合。观测序列定义为observations_sequence,是一个长度为8的数组,表示8个不同时间步长中的语音音量。

模型对象的predict方法用于在给定观测值的情况下预测最可能的隐藏状态。结果存储在hidden_states变量中,该变量是一个长度为8的数组,表示每个时间步最可能的状态。

import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 
from hmmlearn import hmm # Define the state space 
states = ["Silence", "Word1", "Word2", "Word3"] 
n_states = len(states) # Define the observation space 
observations = ["Loud", "Soft"] 
n_observations = len(observations) # Define the initial state distribution 
start_probability = np.array([0.8, 0.1, 0.1, 0.0]) # Define the state transition probabilities 
transition_probability = np.array([[0.7, 0.2, 0.1, 0.0], [0.0, 0.6, 0.4, 0.0], [0.0, 0.0, 0.6, 0.4], [0.0, 0.0, 0.0, 1.0]]) # Define the observation likelihoods 
emission_probability = np.array([[0.7, 0.3], [0.4, 0.6], [0.6, 0.4], [0.3, 0.7]]) # Fit the model 
model = hmm.CategoricalHMM(n_components=n_states) 
model.startprob_ = start_probability 
model.transmat_ = transition_probability 
model.emissionprob_ = emission_probability # Define the sequence of observations 
observations_sequence = np.array([0, 1, 0, 0, 1, 1, 0, 1]).reshape(-1, 1) # Predict the most likely hidden states 
hidden_states = model.predict(observations_sequence) 
print("Most likely hidden states:", hidden_states) # Plot the results 
sns.set_style("darkgrid") 
plt.plot(hidden_states, '-o', label="Hidden State") 
plt.legend() 
plt.show() 

输出

Most likely hidden states: [0 1 2 2 3 3 3 3]

在这里插入图片描述

隐马尔可夫模型的其他应用

HMM被广泛用于各种应用,例如语音识别、自然语言处理、计算生物学和金融。例如,在语音识别中,HMM可以用于对生成语音信号的潜在声音或音素进行建模,并且观察可以是从语音信号中提取的特征。在计算生物学中,HMM可以用来模拟蛋白质或DNA序列的进化,观察结果可以是氨基酸或核苷酸的序列。

总结

总之,HMM是一个强大的工具,用于建模连续数据,其实现通过库,如hmmlearn,使他们的访问和有用的各种应用程序。

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

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

相关文章

移动通信原理与关键技术学习(4)

1.小尺度衰落 Small-Scale Fading 由于收到的信号是由通过不同的多径到达的信号的总和,接收信号的增强有一定的减小。 小尺度衰落的特点: 信号强度在很小的传播距离或时间间隔内的快速变化;不同多径信号多普勒频移引起的随机调频&#xff…

代码随想录算法训练营第15天 | 102. 二叉树的层序遍历 + 226. 翻转二叉树 + 101. 对称二叉树

今日内容 102.层序遍历 226.翻转二叉树 101.对称二叉树 102.二叉树的层序遍历 - Medium 题目链接:力扣-102. 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点&…

Matlab 之数据分布拟合

文章目录 Part.I IntroductionPart.II Distribution Fitter APP 的使用Chap.I APP 简介Chap.II 简单使用 Part.III 通过代码实现分布拟合Chap.I 基于 fitdist 函数Chap.II 获取数据的频率分布后进行曲线拟合 Reference Part.I Introduction 本文主要介绍了如何使用 Matlab 对数…

Xcalibur软件Qual Brower程序的使用

找到Qual Brower:在System>Program里 打开采集的数据文件*.RAW,软件界面主窗口能查看色谱图和质谱图: 1、图形的放大和拷贝、色谱中查看峰的质谱信息: 点亮如图图像右上角的按钮,可以激活该图形并进行操作&#x…

JavaScript日期和时间处理手册

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ ✨ 前言 日期和时间在应用开发中是非常常用的功能。本文将全面介绍JavaScript中处理日期和时间的方…

专业课128分总分400+南京理工大学818信号系统与数字电路南理工考研经验分享

专业课128分总分400南京理工大学818信号系统与数字电路南理工电光院考研经验分享,希望自己的经历对大家有借鉴。 我是在六月底确认自己保不上研然后专心备考的,时间确实比较紧张。虽然之前暑假看了一点高数,但因为抱有保研的期望&#xff0c…

SPI协议介绍

文章目录 一、硬件连线二、引脚含义三、传输示例四、传输模式 一、硬件连线 二、引脚含义 引脚含义DO(MOSI - Master Output Slave Input)主机发数据,从机收数据DI(MISO - Master Input Slave Output)主机收数据&…

HarmonyOS4.0系统性深入开发15Want概述

Want概述 Want的定义与用途 Want是对象间信息传递的载体,可以用于应用组件间的信息传递。其使用场景之一是作为startAbility()的参数,包含了指定的启动目标以及启动时需携带的相关数据,如bundleName和abilityName字段分别指明目标Ability所…

金和OA C6 upload_json 任意文件上传漏洞

产品介绍 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 漏洞概述 金和 OA C6 upload_json接口处存在任意文件上传漏洞,攻击者可以通过构造特殊请求包上…

LTESniffer:一款功能强大的LTE上下行链路安全监控工具

关于LTESniffer LTESniffer是一款功能强大的LTE上下行链路安全监控工具,该工具是一款针对LTE的安全开源工具。 该工具首先可以解码物理下行控制信道(PDCCH)并获取所有活动用户的下行链路控制信息(DCI)和无线网络临时…

三分钟教你学会设置PICO不自动休眠

三分钟教你学会设置PICO不自动休眠 大家经常会有这种困扰吧,“诶,我去倒杯水,怎么屏幕就黑了”或者“啊这个活动怎么要在线看这么久,好想去玩手机”之类的。会出现这种问题是因为PICO将自动休眠的时间设置得非常短,大…

Flink-CEP 实战教程

文章目录 1. 基本概念1.1 CEP 是什么1.2 模式(Pattern)1.3 应用场景 2. 快速上手2.1 引入依赖2.2 入门实例 3. 模式API(Pattern API)3.1 个体模式3.1.1 基本形式3.1.2 量词(Quantifiers )3.1.3 条件&#x…

AI Agent落地先行者实在智能:2023人工智能领军者、百强、TOP30揭榜

实在智能连登三榜! 【2023年十佳人工智能行业领军人物】 【2023年度人工智能领域创新企业】 【2023年度最具投资价值企业】 喜大普奔!近期,国内科技行业颇具含金量的三张榜单接连发布,实在智能皆榜上有名,“2023「…

网络编程套接字(Socket)

文章目录 1 重点知识2 预备知识2.1 理解源IP地址和目的IP地址2.2 认识端口号2.3 理解 "端口号" 和 "进程ID"2.4 理解源端口号和目的端口号2.5 认识TCP协议2.6 认识UDP协议2.7 网络字节序 3 socket编程接口3.1 socket 常见API3.2 sockaddr结构 4 简单的UDP网…

【Java集合篇】 ConcurrentHashMap在哪些地方做了并发控制

ConcurrentHashMap在哪些地方做了并发控制 ✅典型解析✅初始化桶阶段🟢桶满了会自动扩容吗🟠自动扩容的时间频率是多少 ✅put元素阶段✅扩容阶段🟠 拓展知识仓🟢ConcurrentSkipListMap和ConcurrentHashMap有什么区别☑️简单介绍一…

解决录制的 mp4 视频文件在 windows 无法播放的问题

解决录制的 mp4 视频文件在 windows 无法播放的问题 kazam 默认录制保存下来的 mp4 视频文件在 windows 中是无法直接使用的,这是由于视频编码方式的问题。解决办法: 首先安装 ffmeg 编码工具: sudo apt-get install ffmpeg 然后改变视频的…

BIND DNS 自定义zabbix监控

一、DNS统计计数器 Bind9可以使用rndc stats 命令将相关DNS统计信息存储到工作目录下,默认位置在: statistics-file "/var/named/data/named_stats.txt"; 每当名称服务器执行rndc stats命令,都会统计在统计信息文件最后附加一…

极少数据就能微调大模型,一文详解LoRA等方法的运作原理

原文:极少数据就能微调大模型,一文详解LoRA等方法的运作原理 最近和大模型一起爆火的,还有大模型的微调方法。 这类方法只用很少的数据,就能让大模型在原本表现没那么好的下游任务中“脱颖而出”,成为这个任务的专家…

第87讲:XtraBackup备份工具的核心技术要点及全库备份、恢复案例

文章目录 1.XtraBackup备份工具的简介2.XBK备份工具的安装3.XBK备份工具的使用语法4.XBK备份前的准备5.使用XBK对全库进行备份5.1.XBK备份全库数据的语法格式5.2.使用XBK进行全库备份5.3.查看XBK备份的数据文件5.4.备份过程中生产的XBK文件 6.模拟故障案例并使用XBK恢复备份的数…

openssl3.2 - 官方dmeo学习 - server-arg.c

文章目录 openssl3.2 - 官方dmeo学习 - server-arg.c概述笔记备注END openssl3.2 - 官方dmeo学习 - server-arg.c 概述 TLS服务器, 等客户端来连接; 如果客户端断开了, 通过释放bio来释放客户端socket, 然后继续通过bio读来aceept. 笔记 对于开源工程, 不可能有作者那么熟悉…