当前位置: 首页 > news >正文

.【机器学习】隐马尔可夫模型(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

相关文章:

  • 使用串口 DMA 模式接收不定长数据
  • 金蝶云星空与金蝶云星空对接集成逐个单据查询连通员工新增(3009-销售退货清理卡片)
  • 小程序中滚动字幕
  • windows搭建银河麒麟v10虚拟机
  • WAMP apache 无法启动(端口 80 未使用)
  • Android Jetpack中Lifecycle使用生命周期感知型组件处理生命周期
  • Canvas 指南与总结
  • 基于Python的汽车信息爬取与可视化分析系统
  • 带你玩转汇编
  • 单片机原理及应用:定时器/计数器综合应用
  • BioTech - 蛋白质结构、核酸结构、小分子构象的预测
  • npm run dev,vite 配置 ip 访问
  • 怎么把身份证压缩到200k以下?一分钟教你如图片压缩
  • 人工智能技术的应用
  • 重生奇迹mu敏弓加点攻略
  • 【翻译】babel对TC39装饰器草案的实现
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • css系列之关于字体的事
  • Fastjson的基本使用方法大全
  • js写一个简单的选项卡
  • js学习笔记
  • React as a UI Runtime(五、列表)
  • TCP拥塞控制
  • Vue实战(四)登录/注册页的实现
  • 闭包--闭包之tab栏切换(四)
  • 对超线程几个不同角度的解释
  • 给Prometheus造假数据的方法
  • 机器学习学习笔记一
  • 简析gRPC client 连接管理
  • 离散点最小(凸)包围边界查找
  • 如何学习JavaEE,项目又该如何做?
  • 我看到的前端
  • NLPIR智能语义技术让大数据挖掘更简单
  • 湖北分布式智能数据采集方法有哪些?
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #DBA杂记1
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (十三)Flask之特殊装饰器详解
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)http-server应用
  • (转)linux 命令大全
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Micro Framework初体验(二)
  • .Net 高效开发之不可错过的实用工具
  • .net 简单实现MD5
  • .NET中的十进制浮点类型,徐汇区网站设计
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured