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

news2024/10/5 15:32:32

隐马尔可夫模型(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.coloradmin.cn/o/1372095.html

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

相关文章

跟我学java|Stream流式编程——并行流

什么是并行流 并行流是 Java 8 Stream API 中的一个特性。它可以将一个流的操作在多个线程上并行执行,以提高处理大量数据时的性能。 在传统的顺序流中,所有的操作都是在单个线程上按照顺序执行的。而并行流则会将流的元素分成多个小块,并在多…

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

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

2024年第九届计算机与通信系统国际会议(ICCCS2024) ,邀您相约西安!

会议官网: ICCCS2024 | Xian China 时间: 2024年4月19-22日 地点: 中国西安 会议简介: 近年来,信息通信在不断发展,为计算机网络的进步与发展提供了先进可靠的技术支持。随着计算机网络与通信技术的深入发展,计算机通信技术、数…

报错解决:RuntimeError: Error building extension ‘bias_act_plugin‘

系统: Ubuntu22.04, nvcc -V:11.8 , torch:2.0.0cu118 一:BUG内容 运行stylegan项目的train.py时遇到报错👇 Setting up PyTorch plugin "bias_act_plugin"... Failed! /home/m…

docker+jmeter实现windows作为主控机,linux作为负载机的分布式压测环境搭建

dockerjmeter实现windows作为主控机,linux作为负载机的分布式压测环境搭建 1、搭建环境说明2、windows主控机安装Jmeter3、linux负载机安装Jmeter3.1、安装docker环境3.2、使用docker安装jmeter 4、windows主控机分发测试任务 1、搭建环境说明 准备一台windows主机…

京东(天猫淘宝)数据分析工具-鲸参谋系统全功能解析——行业大盘、红蓝海市场、品牌分析、店铺分析、商品分析、竞品监控(区分自营和POP)

作为第三方电商数据平台,鲸参谋电商大数据系统能够为品牌方和商家提供包括行业趋势、热门品牌、店铺分析、单品分析在内的多个层面数据分析,帮助商家做出更加准确的经营决策,提升经营效率,实现精准营销。 下面,我们针…

YOLOv8优化策略:轻量化改进 | 超越RepVGG!浙大阿里提出OREPA:在线卷积重参数化

🚀🚀🚀本文改进:在线卷积重参数化巧妙的和YOLOV8结合,并实现轻量化 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.OREPA介绍 论文:https://arxiv.org/pdf/2204.00826.pdf 摘要:结构重新参数化在…

软件测试|Python Selenium 库安装使用指南

简介 Selenium 是一个用于自动化浏览器操作的强大工具,它可以模拟用户在浏览器中的行为,例如点击、填写表单、导航等。在本指南中,我们将详细介绍如何安装和使用 Python 的 Selenium 库。 安装 Selenium 库 使用以下命令可以通过 pip 安装…

内网渗透之CobaltStrike(CS)

目录 一、Cobalt Strike简介 二、Cobalt Strike基本用法 1、启动服务端 2、客户端连接 3、设置监听器(Listeners) 4、脚本管理器(Script Manager) 5、攻击(最常用的是生成后门) 6、CS上线 7、Beaco…

图神经网络 7大高效创新思路分享,附17篇最新顶会论文和代码

2024年了,图神经网络方向还好发论文吗?答案当然是能。 图神经网络在处理非欧空间数据和复杂特征方面具有明显的优势,且已成为了深度学习领域的热点,在学术界和工业界都有着广泛的研究和应用。不仅如此,图神经网络与CV…

如何在集简云中调用GPTs(Assistant) API

我们在OpenAI中创建了GPTs(Assistant)后,希望放到其它软件中使用,比如 抖音私信,抖音评论,微信公众号,钉钉,飞书,企业微信...... 要如何实现这样的功能呢? 您可以使用集简云的 “数…

科研上新 | 第3期:大模型推进科研边界;大模型的道德价值对齐;优化动态稀疏深度学习模型;十亿规模向量搜索的高效更新

者按:欢迎阅读“科研上新”栏目!“科研上新”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里,你可以快速浏览研究院的亮点资讯,保持对前沿领域的敏锐嗅觉,同时也能找到先进实用的开源工具。 本期内容速览 01…

JavaScript日期和时间处理手册

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

vscode设置python脚本运行参数

1 添加配置文件 点击到你要配置的python文件,然后右上角点击 运行 ,再点击 添加配置 再点击 “Pyhton文件” 选项(其实就是在选择 当前的python文件 进行配置) 接着就生成了配置文件 lanunch.json 2 参数配置 再上面代码的基础上…

1月10号代码随想录左叶子之和

404.左叶子之和 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24示例 2: 输入: root [1]…

206. 反转链表(Java)

题目描述: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 输入: head [1,2,3,4,5] 输出: [5,4,3,2,1] 代码实现: 1.根据题意创建一个结点类: public class ListNode {int val…

【详细】双系统 Ubuntu 如何给根目录扩容

1.分配出一块未分配空间(需要和Ubuntu系统存储分区位于同一个硬盘上) 这一步我直接利用windows系统自带的“创建并格式化硬盘分区”功能进行的。 如图,在想要切割出来一部分空间的卷上右键,选择压缩卷选项,之后输入空…

使用Windbg动态调试目标进程的一般步骤详解

目录 1、概述 2、将Windbg附加到已经启动起来的目标进程上,或者用Windbg启动目标程序 2.1、将Windbg附加到已经启动起来的目标进程上 2.2、用Windbg启动目标程序 2.3、Windbg关联到目标进程上会中断下来,输入g命令将该中断跳过去 3、分析实例说明 …

leetcode:1716. 计算力扣银行的钱(python3解法)

难度:简单 Hercy 想要为购买第一辆车存钱。他 每天 都往力扣银行里存钱。 最开始,他在周一的时候存入 1 块钱。从周二到周日,他每天都比前一天多存入 1 块钱。在接下来每一个周一,他都会比 前一个周一 多存入 1 块钱。 给你 n &am…

安卓文件传输工具---Android File Transfer中文

Android File Transfer是一款专为安卓设备设计的文件传输工具,可以帮助用户快速方便地在安卓设备和计算机之间传输文件。这款软件支持多种文件类型,包括图片、音乐、视频、文档等,使得用户可以轻松地将文件从计算机传输到安卓设备&#xff0c…