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

22- 隐马尔科夫HMM (NLP自然语言算法) (算法)

HMM模型 :

from hmmlearn.hmm import GaussianHMM
model= GaussianHMM(n_components=3,n_iter=100000, covariance_type = 'diag')
model.fit(X)


1、马尔科夫链

有向图模型(贝叶斯网络):用有向图表示变量间的依赖关系;
无向图模型(马尔可夫网):用无向图表示变量间的相关关系。

HMM 就是贝叶斯网络的一种--虽然它的名字里有和"马尔可夫网"一样的马尔可夫。
对变量序列建模的贝叶斯网络又叫动态贝叶斯网络。HMM 就是最简单的动态贝叶斯网络。
注意,马尔可夫过程其原始模型是马尔可夫链。该过程具有如下特性:在已知系统当前状态的条件下,它未来的演变不依赖于过去的演变。
也就是说,一个马尔可夫过程可以表示为系统在状态转移过程中,第 T+1 次结果只受第 T 次结果的影响,即只与当前状态有关,而与过去状态,即与系统的初始状态和此次转移前的所有状态无关。

上图就是一个非常简单的马尔可夫链。两个节点分别表示睡和哭。边表示节点之间的转移概率。
睡之后,0.7 的可能又接着睡,只有 0.3 的可能变成哭。而哭之后,0.9 的可能是睡,也就有 0.1 的可能接着哭。
假设这是某个孩子的预报模型(这个孩子就只有哭和睡),则下一个状态只和上一个状态有关。和之前是在哭还是睡的状态没有关系。那么我们只要知道现在的状态,就可以推测接下来是睡还是哭的可能性了。
由马尔科夫链演化而成了隐含马尔可夫模型(Hidden Markov Model, HMM)!

2、HMM概述

2.1、HMM模型介绍

隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理,模式识别等领域得到广泛的应用。
当然,随着目前深度学习的崛起,尤其是RNN,LSTM等神经网络序列模型的火热,HMM的地位有所下降。但是作为一个经典的模型,学习HMM的模型和对应算法,对我们解决问题建模的能力提高以及算法思路的拓展还是很好的。

2.2、HMM模型应用

首先我们来看看什么样的问题解决可以用HMM模型。
使用HMM模型时我们的问题一般有这两个特征:

  • 我们的问题是基于序列的,比如时间序列,或者状态序列。
  • 我们的问题中有两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列。

有了这两个特征,那么这个问题一般可以用HMM模型来尝试解决。这样的问题在实际生活中是很多的。比如:我现在在打字写博客,我在键盘上敲出来的一系列字符就是观测序列,而我实际想写的一段话就是隐藏序列,输入法的任务就是从敲入的一系列字符尽可能的猜测我要写的一段话,并把最可能的词语放在最前面让我选择,这就可以看做一个HMM模型了。再举一个,我在和你说话,我发出的一串连续的声音就是观测序列,而我实际要表达的一段话就是状态序列,你大脑的任务,就是从这一串连续的声音中判断出我最可能要表达的话的内容。

8、代码演练

8.1、参数估计问题

参数估计问题,也叫学习问题。已知观察序列,来对HMM模型的参数进行估计。

import numpy as np
# pip install hmmlearn
import hmmlearn.hmm as hmm# 首先定义变量
status = ['盒子1', '盒子2', '盒子3']   # 隐藏的状态集合
obs = ['红球', '白球']     # 观察值集合,0==红球,1==白球
n_status = len(status)    # 隐藏状态的长度
# 初始概率分布: π 表示初次抽时,抽到1盒子的概率是0.2,抽到2盒子的概率是0.4,抽到3盒子的概率是0.4
pi = np.array([0.2, 0.4, 0.4])   # 状态转移概率矩阵 A[0][0]=0.5 表示当前我抽到1盒子,下次还抽到1盒子的概率是0.5
A = np.array([[0.5, 0.2, 0.3],[0.3, 0.5, 0.2],[0.2, 0.3, 0.5]])
# 观测概率矩阵 B:B[2][0]=0.7,表示第三个盒子抽到红球概率0.7,B[2][1]=0.3,表示第三个盒子抽到白球概率0.3
B = np.array([[0.5, 0.5],[0.4, 0.6],[0.7, 0.3]])
# 下面开始定义模型
'''
hmmlearn中主要有两种模型,分布为:GaussianHMM和MultinomialHMM;
如果观测值是连续的,那么建议使用GaussianHMM,否则使用MultinomialHMM
参数:
初始的隐藏状态概率π参数为: startprob;
状态转移矩阵A参数为: transmat;
状态和观测值之间的转移矩阵B参数为: 
emissionprob_(MultinomialHMM模型中)或者在GaussianHMM模型中直接给定均值(means)和方差/协方差矩阵(covars)
'''
model = hmm.MultinomialHMM(n_components=n_status) # 隐藏状态长度
model.startprob_ = pi # 初始概率
model.transmat_ = A # 状态概率矩阵
model.emissionprob_ = B # 观测概率矩阵
# 观测序列[红、白、红]
se = np.array([[0,1,0]]).T# 对数概率,index索引
logprob,box_index = model.decode(se,algorithm = 'viterbi')
print('隐藏状态盒子:')
print('  '.join(map(lambda t:status[t],box_index)))
print('最终计算的概率是:')
print(np.round(np.exp(logprob),4))

8.2、参数估计(训练问题)

已知观察序列,求什么样的隐藏状态序列最可能生成一个给定的观察序列

import numpy as np
# pip install hmmlearn
import hmmlearn.hmm as hmm# 首先定义变量
status = ['盒子1', '盒子2', '盒子3']   # 隐藏的状态集合
obs = ['红球', '白球']     # 观察值集合,0==红球,1==白球
n_status = len(status)    # 隐藏状态的长度# 观测数据
X_train = np.array([[0,1,0,1,0],# 第一次观测得到结果:红、白、红、白、红[0,0,1,1,0],[1,1,1,1,0],[0,1,1,1,0],[1,0,1,0,1]])# 状态转移矩阵A?观察概率矩阵 B? 初始概率 Pi?
model = hmm.MultinomialHMM(n_components=n_status,n_iter=10,tol = 0.0001,algorithm='viterbi')
model.fit(X_train)# 查看模型估计的参数
# 概率问题,答案不是唯一的
print('初始概率是:',model.startprob_.round(5))
print('状态转移概率A:\n',model.transmat_.round(5))
print('观察概率矩阵B:\n',model.emissionprob_.round(5))

8.3、股票走势预测

8.3.1、加载数据

import numpy as np
import pandas as pdfrom hmmlearn.hmm import GaussianHMM   # 股票的交易,数据每天都不一样,变化,连续数值
data = pd.read_csv('./apple_stock.csv') # 苹果公司,股票情况
print(data.shape)data.head()

3.2  日期转换

data['Date'] = pd.to_datetime(data['Date'],format = '%Y/%m/%d',errors = 'ignore')
data.info()

3.3  数据提取

# 去除第一天的数据
volume = data['Volume'].values[1:] # 去除了交易额第一天的数据close_v = data['Close'].values# 前后两天股价数值的差值
diff = np.diff(close_v) # 涨、跌、平X = np.column_stack([diff,volume])
X.shape

3.4  HMM算法建模

model= GaussianHMM(n_components=3,n_iter=100000, covariance_type = 'diag')model.fit(X)for i in range(model.n_components):# 模型的隐含状态:涨跌平print('第{0}个隐含状态'.format(i))print('平均值是:',model.means_[i])print('方差是:',np.diag(model.covars_[i]))print('------------------------------')

3.5  状态转移

print(model.transmat_.round(3))
'''
Transition matrix
[[0.898 0. 0.102]
[0. 0.915 0.085]
[0.083 0.043 0.874]]
'''
  • 第一行最大的数值是0.915,因此跌倾向于保持自己的状态,即第二天仍旧为跌。
  • 第二行最大的数值是0.898,得知涨后第二天倾向于变为涨。
  • 根据第三行转变状态最大数值0.874,平后第二天仍旧倾向于平。

相关文章:

22- 隐马尔科夫HMM (NLP自然语言算法) (算法)

HMM模型 : from hmmlearn.hmm import GaussianHMM model GaussianHMM(n_components3,n_iter100000, covariance_type diag) model.fit(X) 1、马尔科夫链 有向图模型(贝叶斯网络):用有向图表示变量间的依赖关系; 无向图模型&…...

gRPC是什么,怎么用

RPC是什么 RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传…...

linux基本功系列之fdisk命令实战

文章目录前言一. fdisk命令介绍二. 语法格式及常用选项三. 参考案例3.1 列出每个分区的大小3.2 分区操作3.2.1 添加硬盘3.2.2 开启虚拟机并分区3.3.3 分区完成后进行格式化挂载四 . 设置分区自动挂载前言 大家好,又见面了,我是沐风晓月,本文…...

Mysql UDF提权复现Raven2

Raven2通关过程 主要通过Raven2靶机进行复现Mysql UDF提权,以下为通关过程。 靶机镜像:https://www.vulnhub.com/entry/raven-2,269/ 信息收集 拿到靶机ip:192.168.112.129 nmap -sP 192.168.112.0/24探测开放端口,nmap用烂了…...

枚举类(enum)

定义:在某些情况下,一个类的实例对象是有限且固定的,可将该类称为“枚举类”。枚举类是JDK 1.5 之后提出来的。例如:四季只有春夏秋冬4个季节,性别只有男女2个,故四季类和性别类均可称为“枚举类”。 在自…...

腾讯云架构师亲码“redis深度笔记”,从入门到精通,面面俱到

前言 作为这个时代码代码的秃头人员,对Redis肯定是不陌生的,如果连Redis都没用过,还真不好意思出去面试,指不定被面试官吊打多少次。 毕竟现在互联网公司和一些创业公司都要用到Redis,像亚马逊、谷歌、阿里、腾讯都要…...

萌新应该如何开始学习走向自动化测试高薪岗位?

对于测试人员来说,不管进行功能测试还是自动化测试,还是性能测试,都是需要编写测试用例,所以我们必须先要了解清楚手工测试用例与自动化测试用例的一些特点,才能更好的开展自动化测试工作。1.1手工测试用例和自动化测试…...

-bash: pip: command not found

背景 这个错误的原因就是,我们的服务器上没有安装pip,装上就可以了,下面我们看一下centos中的解决方案 下载 wget https://bootstrap.pypa.io/get-pip.py 下载完成后如下图: 安装 安装的时候首先需要看一下自己的python是什…...

使用HTTP隧道代理,请求超过频率要怎么办?

在网上,经常会看到有人说使用隧道代理经常遇到429错误(请求超过频率),我们要如何解决这一问题呢?通常情况,优质的HTTP代理厂商隧道代理服务器采用的是高性能主机构建的动态IP代理服务器,是可以支…...

paddle 49 ODConv的可部署调整

ODConv是一种适用于轻量化模型的conv结构,可以在较少的参数下训练出多参数模型才能达到的精度,在相同的flop下可以稳定的涨2-3%个点。但是在paddle下部署ODConv动态卷积模型时会报出各种异常,导致模型无法转静态图或onnx格式(可能在pytorch下也是无法转换的)。为此研究ODC…...

C++ STL 学习之【string】

✨个人主页: Yohifo 🎉所属专栏: C修行之路 🎊每篇一句: 图片来源 The key is to keep company only with people who uplift you, whose presence calls forth your best. 关键是只与那些提升你的人在一起&#xff0c…...

使用开源 MaxKey 与 APISIX 网关保护你的 API

1. Apache APISIX介绍 Apache APISIX 是 Apache 软件基金会下的云原生 API 网关,它兼具动态、实时、高性能等特点,提供了负载均衡、动态上游、灰度发布(金丝雀发布)、服务熔断、身份认证、可观测性等丰富的流量管理功能。我们可以…...

Linux之Xshell工具使用

shell简介Xshell是一个远程工具,可以远程连接linux系统 ,SSH,远程管理 Xshell来远程访问Linux系统的终端 。shell的英文含义是“壳”;它是相对于内核来说的,因为它是建立在内核的基础上,面向于用户的一种表…...

【数据结构与算法】时间复杂度与空间复杂度

目录 一.前言 二.时间复杂度 1.概念 二.大O的渐进表示法 概念: 总结: 三.常见时间复杂度计算举例 例1 例2 例3 例4 例5.计算冒泡排序的时间复杂度 例6.二分算法的时间复杂度 例7.阶乘递归Fac的时间复杂度 例8.斐波那契递归的时间复杂度 …...

Nginx如何配置Http、Https、WS、WSS的方法步骤

这篇文章主要介绍了Nginx如何配置Http、Https、WS、WSS的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 写在前面 当今互联网领域,Nginx是使…...

【博客621】iptables -J动作总结

iptables -J动作总结 1、iptables常见动作 ACCEPTDROPREJECTLOGSNATDNATMASQUERADEREDIRECT 2、iptables常见动作用法 2-1、ACCEPT: 作用:用于接收匹配的流量,使得流量继续往后面的规则和链路去匹配 2-2、DROP 作用:用于丢弃匹…...

Chrome开发者工具:利用网络面板做性能分析

Chrome 开发者工具(简称 DevTools)是一组网页制作和调试的工具,内嵌于 Google Chrome 浏览器中。 Chrome 开发者工具有很多重要的面板,比如与性能相关的有网络面板、Performance 面板、内存面板等,与调试页面相关的有…...

SpringCloud系列(十三)[分布式搜索引擎篇] - ElasticSearch 的概念及 Centos 7 下详细安装步骤

打开淘宝, 搜索 狂飙 会出现各种价格有关狂飙的书籍, 当然也有高启强同款的孙子兵法!!! 如下图所示: 那么面对海量的数据, 如何快速且准确的找到我们想要的内容呢? 淘宝界面已经可以按照综合排序 / 销量 / 信用 / 价格等进行筛选, 是如何做到的呢? ElasticSearch 11 Elastic…...

04_Docker 镜像和仓库

04_Docker 镜像和仓库 文章目录04_Docker 镜像和仓库4.1 什么是 Docker 镜像4.2 列出 Docker 镜像4.3 拉取镜像4.4 查找镜像4.5 构建镜像4.5.1 创建 Docker Hub 账号4.5.2 用 Docker 的 commit 命令创建镜像4.5.3 用 Dockerfile 构建镜像4.5.5 基于 Dockerfile 构建新镜像4.5.5…...

postman-enterprise-API

Postman 是一个用于构建和使用 API 的 API 平台。Postman 简化了 API 生命周期的每个步骤并简化了协作,因此您可以更快地创建更好的 API。 API存储库 在一个中央平台上围绕您的所有 API 工件轻松存储、编目和协作。Postman 可以存储和管理 API 规范、文档、工作流配…...

【ESP 保姆级教程】玩转emqx MQTT篇② ——保留消息和遗嘱消息

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-02-18 ❤️❤️ 本篇更新记录 2023-02-18 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…...

开启慢查询日志方法

步骤 开启慢查询日志 SET GLOBAL slow_query_log on;SHOW VARIABLES like slow_query_log;设置时间限制 SET GLOBAL long_query_time 1; -- 单位sSHOW VARIABLES LIKE %long_query_time%;因为long_query_time参数只对新的数据库连接生效,所以还需要重启msql客户端…...

宝塔搭建实战人才求职管理系统admin前端vue源码(二)

大家好啊,我是测评君,欢迎来到web测评。 上一期给大家分享骑士cms后台端在宝塔的搭建部署方式,这套系统是前后端分离的架构,前端是用vue2开发的,还需要在本地打包手动发布上宝塔,所以本期给大家分享&#x…...

SpringMVC——基础知识

基本概念 SpringMVC是基于servlet api构造的原始web框架,全称是Spring Web MVC 而MVC的全称是Model View Controller,翻译成中文分别是“模型”,“视图”,“控制器”,这是一种软件的架构模式 Model:用来…...

论文浅尝 | SpCQL: 一个自然语言转换Cypher的语义解析数据集

笔记整理:郭爱博,国防科技大学博士论文发表会议:The 31th ACM International Conference on Information and Knowledge Management,CIKM 2022动机随着社交、电子商务、金融等行业的快速发展,现实世界编织出一张庞大而…...

MongoDB 使用规范与限制及最佳实践

MongoDB 灵活文档的优势 灵活库/集合命名及字段增减同一字段可存储不同类型数据Json 文档可多层次嵌套文档对于开发而言最自然的表达 MongoDB 灵活文档的烦恼 数据库集合字段名千奇百怪同一字段数据类型各不一样业务异常可能写入“脏”数据 1.1 库命名规范 不能为空字符串 &…...

第五十六章 树状数组(一)

第五十六章 树状数组一、前缀和的缺陷二、树状数组1、作用2、算法分析3、算法实现(1)lowbits()(2)插入(3)查询三、例题1、问题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示2、代码一、前缀和…...

kubernetes教程 --Pod控制器详解

Pod控制器详解 介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建控制器创建的pod&am…...

N2750A Agilent Keysight HP 差分探头1.5GHz

N2750A Agilent Keysight HP 差分探头13554860890 N2750A 是 Agilent Keysight HP 的 1.5 GHz 差分探头。 特征: N2750A:1.5 GHz 衰减比:2:1 或 10:1(可切换) 动态范围: 5 V 或 10 Vpp(10:1 时…...

一文搞懂Linux内核进程CPU调度基本原理

为什么需要调度 进程调度的概念比较简单,我们假设在一个单核处理器的系统中,同一时刻只有一个进程可以拥有处理器资源,那么其他的进程只能在就绪队列中等待,等到处理器空闲之后才有计划获得处理器资源来运行。在这种场景下&#…...

英语培训建设网站方案/石家庄网络seo推广

原文:How To Make A UIViewController Transition Animation Like in the Ping App 作者:Luke Parham 译者:kmyhy 更新说明:本教程由 Luke Parhm 更新至 Xcode 9/Swift 4。原文作者是 Rounak Jain。 不久前,匿名社交…...

安贞网站建设公司/站长工具友链检测

注意事项请确保林的功能级别至少为 Windows Server 2008,并确保架构主机运行 Windows Server 2008 或更高版本。Windows Server 2012 和 Windows Server 2012 R2 的完全安装选项必须用于所有运行 Exchange 2016 服务器角色或管理工具的服务器。必须首先将计算机加入…...

大连手机自适应网站制作费用/某一网站seo策划方案

springCloud 微服务日志配置 项目日志配置 logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL&#xff0c; 如果设置为WARN&#xff0c;则低…...

用PS做的个人网站图片/钓鱼网站制作教程

这一条款主要来讨论模板中迭代器的属性iterator_category&#xff0c;它可以通过类似于vector<int>::iterator::iterator_category的方式来取得。 到这里我们有必要学习一下STL迭代器的类型&#xff0c;总共有五种&#xff0c;分别是&#xff1a; input_iterator&#xf…...

建设网站的HTML代码/网站做优化一开始怎么做

听说99%的同学都来这里充电吖 本系列为线下学员学习笔记整理分享,如有想要报名参加线下培训,可以点击以下超链接文章了解,购买开发板可以到叁芯智能科技企业淘宝店下单。 各类研修班 | FPGA就业研修班,短期班…… 叁芯智能FPGA开发板,初学小白必备!...

wordpress看板娘素材/企业网站推广有哪些

先将视频读入后将每帧进行图像二值化处理&#xff0c;然后在子文件夹下生成二值化之后的图片&#xff0c;代码如下 v VideoReader(f25.mp4); ii 1;while hasFrame(v)img readFrame(v);thresh graythresh(img); %自动确定二值化阈值 I2im2bw(img,thresh); %图像二值…...