.【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)

概率图模型是一种用图形表示概率分布和条件依赖关系的数学模型。概率图模型可以分为两大类:有向图模型和无向图模型。有向图模型也叫贝叶斯网络,它用有向无环图表示变量之间的因果关系。无向图模型也叫马尔可夫网络,它用无向图表示变量之间的相关关系。概率图模型可以用于机器学习,人工智能,自然语言处理,计算机视觉,生物信息学等领域。

c3874033a7f26f6b6663094bb65356f5.png

一、马尔科夫模型

随机过程

4ef928ec51a14e3a6c03b0f587ef8960.png

马尔科夫过程

ee4dba09e2b75026e63d223c968142af.png

马尔科夫链

1afd38203bf7571c24942242a3428240.png

状态转移矩阵通过训练样本学习得到,采用最大似然估计

d32380559f5cd6ae90c81c8b1fbd300e.png

二、隐马尔可夫模型简介

2.1 模型结构

隐马尔可夫模型(Hidden Markov Model,HMM)

2c2c79e7fc85cc7bfb10a980eda3915f.png

隐马尔可夫模型(Hidden Markov Model,HMM)是一种统计模型,用于描述一个含有隐含未知参数的马尔可夫过程。在隐马尔可夫模型中,隐藏状态(Hidden State)和观测值(Observation)的数量是根据实际问题人工设定的,例如,如果我们用隐马尔可夫模型来进行中文分词,那么隐藏状态的数量可以设为4,分别表示词语的开始(B)、中间(M)、结束(E)和单字词(S),观测值的数量可以设为汉字的种类数。状态转移矩阵(Transition Matrix)和混淆矩阵(Confusion Matrix)是隐马尔可夫模型的两个重要参数,分别描述了隐藏状态之间的转移概率和隐藏状态与观测值之间的发射概率。这两个参数可以通过样本学习得到,例如,可以使用最大似然估计或贝叶斯估计的方法,根据给定的状态序列和观测序列,估计这两个参数的值。

隐马尔可夫模型需要解决以下三个基本问题:

  • 概率计算问题:给定模型参数和观测序列,计算该观测序列出现的概率。这个问题可以使用前向算法(Forward Algorithm)或后向算法(Backward Algorithm)来求解,它们都是基于动态规划(Dynamic Programming)的方法,可以有效地利用中间结果,避免重复计算,提高效率。

  • 学习问题:给定观测序列,估计模型参数。这个问题可以使用鲍姆-韦尔奇算法(Baum-Welch Algorithm)或期望最大化算法(Expectation-Maximization Algorithm)来求解,它们都是基于迭代(Iteration)的方法,可以从一个初始的参数值开始,不断地更新参数,直到收敛到一个局部最优解。

  • 预测问题:给定模型参数和观测序列,求最有可能的隐藏状态序列。这个问题可以使用维特比算法(Viterbi Algorithm)来求解,它也是基于动态规划的方法,可以找到一条最优的状态路径,使得该路径下的观测序列的概率最大。

2.2 中文分词

34a2c5d2237c16fdba1b0350cd1d1513.png

三、估值问题

85b7a856a6a5d7fd01b90116512fc6f6.png

四、解码问题

c410ee07f77176c051ac3ae3f51a66b3.png

五、训练算法

db23e8fbef011fe6609f46df1522d359.png

六、应用

03b878f345e6d5fd06acdc5bf1d54ac0.png

示例代码:

  • 该代码是一个用 jajapy 库实现的隐马尔可夫模型(HMM)的例子,用于生成和学习观测序列。

  • 该代码首先创建了一个 HMM,指定了状态转移矩阵、发射矩阵和初始状态概率,然后用该模型生成了一个训练集,包含 1000 个长度为 10 的观测序列。

  • 该代码接着创建了一个随机的初始假设模型,然后用鲍姆-韦尔奇算法(BW)对其进行训练,得到一个输出模型,该模型尽可能地拟合训练集。

  • 该代码最后用原始模型和输出模型分别生成了一个测试集,包含 1000 个长度为 10 的观测序列,然后计算了两个模型在测试集上的对数似然,并用对数似然之差作为评估指标,输出到屏幕上。

a409e51b1b72bfd4f62f1c359e9f0c3a.png

import jajapy as ja # 导入 jajapy 库,这是一个用于创建和训练隐马尔可夫模型的库def example_7():# 模型创建#----------------# 在下一个状态 (s0) 中,我们以 0.4 的概率生成 'x',以 0.6 的概率生成 'y'# 一旦生成了一个观测值,我们就以 0.5 的概率转移到状态 1 或 2transitions = [(0,1,0.5),(0,2,0.5),(1,3,1.0),(2,4,1.0),(3,0,0.8),(3,1,0.1),(3,2,0.1),(4,3,1.0)] # 定义转移矩阵,每个元素表示从一个状态到另一个状态的概率emission = [(0,"x",0.4),(0,"y",0.6),(1,"a",0.8),(1,"b",0.2),(2,"a",0.1),(2,"b",0.9),(3,"x",0.5),(3,"y",0.5),(4,"y",1.0)] # 定义发射矩阵,每个元素表示在一个状态下生成一个观测值的概率original_model = ja.createHMM(transitions,emission,initial_state=0,name="My HMM") # 使用转移矩阵和发射矩阵创建一个隐马尔可夫模型,初始状态为 0,模型名称为 "My HMM"#original_model.save("my_model.txt") # 将模型保存到文件中#original_model = ja.loadHMM("my_model.txt") # 从文件中加载模型# 训练集生成#------------------------# 我们生成 1000 个长度为 10 的观测序列training_set = original_model.generateSet(set_size=1000, param=10) # 使用模型生成训练集,参数 set_size 表示训练集的大小,param 表示每个序列的长度#training_set.save("my_training_set.txt") # 将训练集保存到文件中#training_set = ja.loadSet("my_training_set.txt") # 从文件中加载训练集# 学习#---------initial_hypothesis = ja.HMM_random(5,alphabet=list("abxy"),random_initial_state=False) # 创建一个随机的假设模型,参数 5 表示状态的数量,alphabet 表示观测值的集合,random_initial_state 表示是否随机选择初始状态output_model = ja.BW().fit(training_set, initial_hypothesis) # 使用鲍姆-韦尔奇算法(BW)对假设模型进行训练,参数 training_set 表示训练集,initial_hypothesis 表示初始假设,返回一个训练后的模型# 输出评估#------------------# 我们生成 1000 个长度为 10 的观测序列test_set = original_model.generateSet(set_size=1000, param=10) # 使用原始模型生成测试集,参数 set_size 表示测试集的大小,param 表示每个序列的长度ll_original = original_model.logLikelihood(test_set) # 计算原始模型在测试集上的对数似然ll_output   =   output_model.logLikelihood(test_set) # 计算训练后的模型在测试集上的对数似然quality = abs(ll_original - ll_output) # 计算两个模型的对数似然之差,作为评估指标print("loglikelihood distance:",quality) # 打印评估指标if __name__ == "__main__":example_7() # 调用 example_7 函数

输出:

/07-hmm.py

WARNING: Stormpy not found.

Learning an HMM...

WARNING: stormpy not found. The output model will be a Jajapy model

|████████████████████████████████████████| 104 in 3:22.9 (0.51/s)

loglikelihood distance: 0.4953666912796937

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

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

相关文章

02.部署LVS-DR群集

技能展示: 了解LVS-DR群集的工作原理 会构建LVS-DR负载均衡群集 2.1 LVS-DR 集群 LVS-DR( Linux Virtual Server Director Server )工作模式,是生产环境中最常用的一种工作模式。 2.1.1.LVS-DR 工作原理 LVS-DR 模式&…

在root账号下启动 elasticsearch

最新版本的 elasticsearch 不能用root账号运行,但是每次启动都要切换到其他账号下面,也是一件很麻烦的事情。下面写个脚本,以指定用户运行elasticsearch 假设服务器已经装好了elasticsearch,并且在 /usr/local/elasticsearch-8.1…

Spark---RDD持久化

文章目录 1.RDD持久化1.1 RDD Cache 缓存1.2 RDD CheckPoint 检查点1.3 缓存和检查点区别 1.RDD持久化 在Spark中,持久化是将RDD存储在内存中,以便在多次计算之间重复使用。这可以显著减少不必要的计算,提高Spark应用程序的性能。 val line…

蓝桥杯练习题(七)

📑前言 本文主要是【算法】——蓝桥杯练习题(七)的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 …

kotlin运行

1.使用android studio 由于我本身是做android的,android studio本身有内置kotlin的插件。但若只是想跑kotlin的程序,并不像和android程序绑在一起,可以创建一个kt文件,在里面写一个main函数,就可以直接运行kotlin程序…

Qt中的多线程

Qt中的多线程 目录 1 为什么需要多线程 2 Qt中使用多线程的一些注意事项 3 QThread类 3.1 QThread类的主要接口 3.2 线程的优先级 4 通过继承QThread类实现多线程 5 从QObject类进行派生实现多线程 5 小结 1 为什么需要多线程 在现代化的程序设计开发中,多进程…

【机器学习 西瓜书】期末复习笔记整理

一些杂点: 测试集如何归一化? —— 不是用测试集的均值和标准差,而是用训练集的! 机器学习: 对计算机一部分数据进行学习,然后对另外一些数据进行预测与判断。 参考计算例题: 机器学习【期末复习…

多汗症是否与情绪有关?

多汗症与情绪之间确实存在密切的关系。情绪波动、紧张、焦虑等心理因素是多汗症的常见诱因之一。多汗症患者在情绪激动或紧张时,常常会出现出汗量明显增加的情况。 首先,我们需要了解多汗症的基本病理生理机制。多汗症是由于交感神经过度兴奋引起汗腺过…

Spark-RDD的依赖

RDD的依赖 rdd之间是有依赖关系 窄依赖 每个父RDD的一个Partition最多被子RDD的一个Partition所使用父rdd和子rdd的分区是一对一 mapflatMapfliter 宽依赖 父RDD的Partition会被多个子RDD的Partition所使用父rdd和子rdd的分区是一对多 grouBy()grouByKey()sortBy()sortByKey()…

PyCharm安装使用教程2024

简介 PyCharm是一种PythonIDE(Integrated Development Environment,集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单…

[oeasy]python0004_游乐场_和python一起玩耍_python解释器_数学运算

和python玩耍 🥊 Python 回忆 上次 了解shell环境中的命令 命令作用whoami显示当前用户名pwd显示当前文件夹ls列出当前文件夹下的内容python3仿佛进入大于号黑洞 这python3 怎么玩啊!😠 说好的python教程呢?🤔 运…

vue2使用Lottie

文章目录 学习链接1.安装依赖2.创建lottie组件3.在相对应的页面应用4.相关data.json5.测试效果 学习链接 原文链接&#xff1a;lottie在vue中的使用 lottie官网&#xff1a;https://lottiefiles.com/ 1.安装依赖 npm install lottie-web2.创建lottie组件 <template>…

5G+体育 贵阳电信为亚高原训练基地插上“数字羽翼”

2023年是《5G应用“扬帆”行动计划&#xff08;2021—2023年&#xff09;》的收官之年&#xff0c;5G融合应用正在从点状示范向规模化发展。截至2023年10月底&#xff0c;我国开通5G基站总数达321.5万个&#xff0c;已经建成了全球规模最大、技术领先的5G网络。目前&#xff0c…

MetaGPT前期准备与快速上手

大家好&#xff0c;MetaGPT 是基于大型语言模型&#xff08;LLMs&#xff09;的多智能体协作框架&#xff0c;GitHub star数量已经达到31.3k。 接下来我们聊一下快速上手 这里写目录标题 一、环境搭建1.python 环境2. MetaGpt 下载 二、MetaGPT配置1.调用 ChatGPT API 服务2.简…

Maven的安装和配置

国内Maven仓库之阿里云Aliyun仓库地址及设置 用过Maven的都知道Maven的方便便捷&#xff0c;但由于某些网络原因&#xff0c;访问国外的Maven仓库不便捷&#xff0c;好在阿里云搭建了国内的maven仓库。 需要使用的话&#xff0c;要在maven的settings.xml 文件里配置mirrors的子…

HTTP 常见协议:选择正确的协议,提升用户体验(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

opencv在linux上的编译

首先我们需要下载源码&#xff0c;我这里直接使用的是最新的4.x的版本&#xff0c;获取源码 wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip官方做法&#xff0c;链接如下&#xff1a;https://docs.opencv.org/4.x/d7/d9f/tutorial_linux_install.html&…

Java有哪些异常处理方式?

在Java中&#xff0c;异常处理主要通过try-catch语句块来实现。以下是Java中异常处理的几种主要方式&#xff1a; Try-Catch块&#xff1a;这是最常见的异常处理方式。在try块中编写可能会抛出异常的代码&#xff0c;然后在catch块中处理这些异常。可以有多个catch块来处理不同…

SQL语句详解二-DDL(数据定义语言)

文章目录 操作数据库创建&#xff1a;Create查询&#xff1a;Retrieve修改&#xff1a;Update删除&#xff1a;Delete使用数据库 操作表常见的几种数据类型创建&#xff1a;Create复制表 查询&#xff1a;Retrieve修改&#xff1a;Update删除&#xff1a;Delete 操作数据库 创…

Stable Diffusion XL Turbo 文生图和图生图实践

本篇文章聊聊&#xff0c;如何快速上手 Stable Diffusion XL Turbo 模型的文生图和图生图实战。 写在前面 分享一篇去年 11 月测试过模型&#xff0c;为月末分享的文章做一些技术铺垫&#xff0c;以及使用新的环境进行完整复现。 本篇文章相关的代码保存在 soulteary/docker…