.【机器学习】隐马尔可夫模型(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.hqwc.cn/news/345075.html

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

相关文章

Java 面试题 - 多线程并发篇

线程基础 创建线程有几种方式 继承Thread类 可以创建一个继承自Thread类的子类,并重写其run()方法来定义线程的行为。然后可以通过创建该子类的实例来启动线程。 示例代码: class MyThread extends Thread {public void run() {// 定义线程的行为} …

【python】09.面向对象进阶

面向对象进阶 在前面的章节我们已经了解了面向对象的入门知识,知道了如何定义类,如何创建对象以及如何给对象发消息。为了能够更好的使用面向对象编程思想进行程序开发,我们还需要对Python中的面向对象编程进行更为深入的了解。 property装…

88.乐理基础-记号篇-反复记号(二)D.C.、D.S.、Fine、Coda

内容参考于:三分钟音乐社 上一个内容:87.乐理基础-记号篇-反复记号(一)反复、跳房子-CSDN博客 下图红色左括号框起来的东西,它们都相对比较抽象一点,这几个词都是意大利语 首先D.C.这个标记,然…

江苏桉木建筑模板 — 现货供应,施工高效

在快节奏的建筑行业中,有效率的施工和高质量的材料是成功的关键。江苏桉木建筑模板以其现货供应和高效施工的特点,在建筑行业中获得了广泛的认可和使用。 产品特点 高质量桉木材质:我们的建筑模板采用高品质的桉木,确保了模板的…

k8s中的基础概念

k8s可以从硬件和软件两方面来理解: 硬件: 1、节点(Node):类似于手机、平板、电脑 2、集群(Cluster):多个节点组合到一起 3、持久卷(Persistent Volumes)&…

Java多线程并发篇----第十篇

系列文章目录 文章目录 系列文章目录前言一、start 与 run 区别二、JAVA 后台线程三、什么是乐观锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、start 与 r…

Discourse 如何查看自己的信任级别

Discourse 如果要查看自己的用户信任级别还有点绕。 首先需要找到用户自己的摘要界面。 然后单击下面的扩展按钮。 这是因为 Discourse 的用户信任级别没有在当前页面中马上展示出来。 在展开的页面中,就可以看到当前你自己的用户信任级别了。 信任级别的改变和在…

JVM基础(10)——老年代调优

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

智能路由器 端口映射 (UPnP) Padavan内网端口映射配置方法

新版本Padavan 4.4内核的端口映射配置和老版本的不太一样,因为新版本默认是启用的 UPnP端口映射, 同时默认使用的是 IGD UPnP自动端口映射, UPnP名词解释: UPnP通用即插即用,是一组协议的统称,是一种基于TCP/IP、UDP和HTTP的分布式、开放体系&#xff…

C类期刊论文复现:基于共享储能电站的工业用户日前优化经济调度程序代码!

适用平台:MatlabYalmipCplex/Gurobi; 程序在用户群间引入共享储能电站,建立以用户群日运行成本最优为目标的优化调度模型,分析用户群接入共享储能电站后的充放电行为和经济效益,并对共享储能电站的投资回收年限等经济…

算法第十七天-构造有效字符串的最少插入数

构造有效字符串的最少插入数 题目要求 解题思路 考虑abc的个数 假设答案有n个"abc"组成,那么需要插入的字符个数为 3 ∗ n − l e n ( s ) 3*n - len(s) 3∗n−len(s)。 对于相邻的两个字符x和y(x在y左侧): 如果 x…

Android 12.0 系统开启和关闭黑白模式主题功能

1.概述 在12.0的rom系统开发定制化中,在系统SystemUI的下拉状态栏中,产品开发功能需求要求添加黑白模式功能开关的功能,就是打开黑白模式,系统颜色就会变成黑白颜色, 关闭黑白模式开关系统就会变成彩色模式,所以就需要了解下系统是怎么设置黑白模式和彩色模式的,然后添…