60分钟看懂HMM的基本原理
作者 | 梁云1991
来源 | Python与算法之美
HMM模型,韩梅梅的中文拼音的缩写,所以又叫韩梅梅模型,由于这个模型的作者是韩梅梅的粉丝,所以给这个模型取名为HMM。开玩笑!
HMM模型,也叫做隐马尔科夫模型,是一种经典的机器学习序列模型,实现简单,计算快速,广泛用于语音识别,中文分词等序列标注领域。
下面通过一个村民看病的故事理解什么是HMM模型。
想象一个乡村诊所,村民的身体状况要么健康要么发烧,他们只有问诊所的医生才能知道是否发烧。
医生通过询问村民的感觉去诊断他们是否发烧。村民自身的感觉有正常、头晕或冷。
假设一个村民每天来到诊所并告诉医生他的感觉。村民的感觉只由他当天的健康状况决定。
村民的健康状态有两种:健康和发烧,但医生不能直接观察到,这意味着健康状态对医生是不可见的。
每天村民会告诉医生自己有以下几种由他的健康状态决定的感觉的一种:正常、冷或头晕。
于是医生会得到一个村民的感觉的观测序列,例如这样:{正常,冷,冷,头晕,冷,头晕,冷,正常,正常}。
但是村民的健康状态这个序列是需要由医生根据模型来推断的,是不可直接观测的。
这个村民看病的故事中由村民的健康状态序列和村民的感觉序列构成的系统就是一个隐马尔科夫模型(HMM)。
其中村民的健康状态序列构成一个马尔科夫链。其每个序列值只和前一个值有关,和其它值无关。由于这个马尔科夫链是隐藏的,不可以被直接观测到,只能由其关联的村民的感觉序列来进行推断,因此叫做隐马尔科夫模型(HMM)。
HMM模型的上帝视角
HMM模型是一个生成模型,描述了两个相关序列的依赖关系。
这两个相关序列称为状态序列 和 观测序列 .
其中状态序列在t时刻的值只和t-1时刻状态序列的取值有关,观测序列在t时刻的值只和t时刻观测序列的取值有关。
其联合概率函数如下:
如果能够确定联合概率函数中的各个参数,那么HMM模型也就完全地确定了,我们就拥有了HMM模型描述的这个体系的上帝视角,可以用来计算任何关心的事件的概率,从而解决我们感兴趣的问题。
HMM的三大假设
1,马尔科夫性假设:t时刻的状态出现的概率只和t-1时刻的状态有关。
2,齐次性假设:可以理解为时间平移不变性
如果
3,观测独立性假设:某个时刻t的观测值只依赖于该时刻的状态值,与任何其它时刻的观测值和状态值无关。
上述HMM的联合概率函数中,实际上就用到了HMM的三大假设。
HMM的三要素
观察HMM的联合概率函数:
可以看到只依赖于三种概率值参数
, ,
分别是初始状态概率,状态值转移概率,观测值输出概率(发射概率)
这就是HMM的三要素,也就是HMM的全部参数,确定了这三种概率,HMM模型就完全确定下来了。
对于状态值取值和观测值取值为离散值的情况下,这三种概率可以表示为矩阵。
假定状态值可能的取值为 ,一共有M种可能取值。观测值可能的取值为 ,一共有N种可能取值。
则HMM的全部参数可以表示为三个矩阵
其中 叫做初始概率矩阵,是一个M维向量,
叫做转移概率矩阵,是一个M×M维矩阵,
叫做发射概率矩阵,是一个M×N维矩阵,
以上面村民看病的例子为例,假设这三个矩阵分别为:
pi = {'Healthy': 0.6, 'Fever': 0.4} #初始状态矩阵A = {'Healthy' : {'Healthy': 0.7, 'Fever': 0.3},'Fever' : {'Healthy': 0.4, 'Fever': 0.6},} #状态矩阵B = {'Healthy' : {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1},'Fever' : {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6},
} # 发射矩阵
HMM的三个基本问题
HMM模型相关的应用问题一般可以归结为这三个基本问题中的一个:
1,评估问题:已知模型参数 ,和观测序列 , 计算观测序列出现的概率。以村民看病问题为例, 计算一个村民连续出现 {正常,冷,头晕} 感觉的概率。评估问题一般使用前向算法或者后向算法进行解决,其中前向算法相对简单,容易理解一些。后向算法较难理解。设想有两个描述两人语音的HMM模型,那么给一个新的语音序列,利用前向算法或者后向算法就可以计算这个语音序列更可能是哪个人的。
2,预测问题:也叫做解码问题。已知模型参数 ,和观测序列 , 计算该观测序列对应的最可能的状态序列。以村民看病问题为例,假设一个病人连续出现 {正常,冷,头晕} 的感觉,计算病人对应的最可能的健康状态序列。预测问题一般使用贪心近似算法或者维特比算法解决。其中贪心近似算法相对简单一些,但不一定能找到全局最优解。维特比算法可以找到全局最优,是一种动态规划算法。
3,学习问题:模型参数 未知,推断模型参数。有两种可能的场景,一种是监督学习的场景,已知诸多观测序列和对应的状态序列,推断模型参数,第二种是非监督学习的场景,只知道诸多观测序列,推断模型参数。监督学习的场景,学习方法相对简单。非监督学习的场景,一般使用EM期望最大化方法进行迭代求解。
三个基本问题的简单解法
1,评估问题的简单解法
已知模型参数 ,和观测序列 , 计算观测序列出现的概率。
评估问题一般使用前向算法或者后向算法进行解决,其中前向算法相对简单。
如果暴力求解,这个概率可以计算如下:
计算复杂度大约为
前向算法是一种递推算法,可以大大减少重复计算,降低计算复杂度。
构造序列
则初始值如下:
而:
不难发现存在递推公式如下:
通过, 我们可以计算
计算复杂度已经降低为
2,预测问题的简单解法
已知模型参数 ,和观测序列 , 计算该观测序列对应的最可能的状态序列。
预测问题一般使用贪心近似算法或者维特比算法解决。较常用的是维特比算法。但贪心近似算法更加简单,很多时候就已经足够使用。
其基本思想是贪心思想,每一个步骤都取相应的, 使得对应输出的概率最大。
3, 学习问题的简单解法
模型参数 未知,推断模型参数。监督学习的场景,学习方法相对简单。已知诸多观测序列和对应的状态序列,推断模型参数。
这种情况下可以统计相应的频率作为, , 中各个概率的估计值。
三个基本问题的复杂解法
1,评估问题的复杂解法
已知模型参数 ,和观测序列 , 计算观测序列出现的概率。
除了前向算法,还有一种后向算法,功能和前向算法相当,也是使用递推法实现的,但没有前向算法那么直观。
构造序列
我们规定 对任何都成立。
类似地我们可以发现后向递推关系:
通过, 我们可以计算
2,预测问题的复杂解法
已知模型参数 ,和观测序列 , 计算该观测序列对应的最可能的状态序列。
解决这一预测问题较常用的方法是维特比算法,是一种动态规划算法,也可以理解成一种搜索空间的剪枝方法,可以保证找到全局最优路径。
不同于贪心近似算法在每个步骤只保留一条当前最优路径,维特比算法在每个步骤会保留若干条当前最优路径,这些最优路径和每个步骤的最后一个隐含状态值的可能取值相对应,如果状态值有M个可能取值,则每个步骤保留M条当前最优路径。
由于HMM的马尔科夫性质,之后的概率计算只和最后一个隐藏状态取值相关,因此全局的最优路径必定在这M条当前最优路径中,如此递推不断向前寻找M个隐状态值对应的M条当前最优路径,最后取最终得到的M条当前最优路径中概率最大的那条作为全局最优路径。
3,学习问题的复杂解法
模型参数 未知,推断模型参数。
这是一个存在隐变量的概率模型的参数估计问题,一般使用EM期望最大化算法进行求解。
原始问题可以定义为
根据期望最大化算法的算法原理,可以得到迭代条件如下:
于是可以得到三个参数 的 迭代条件:
其中 不含待优化参数,求导为0,考虑概率之和为1的约束,可以构造拉格朗日乘子法进行求解,过程较为繁琐,从略。
参考文章:
《一站式解决:隐马尔可夫模型(HMM)全过程推导及实现》:https://zhuanlan.zhihu.com/p/85454896
《机器学习:HMM原理及其实践》:https://www.cnblogs.com/zhangxinying/p/12071061.html
《概率图模型体系:HMM、MEMM、CRF》:https://zhuanlan.zhihu.com/p/33397147
更多精彩推荐
国产开源,GitHub 标星 47000+ ,百度飞桨从打响第一枪到战役突围
激发企业大“智慧” | 深度赋能AI全场景 揭秘你不知道的移动云
首次在手机端不牺牲准确率实现BERT实时推理,比TensorFlow-Lite快近8倍,每帧只需45ms
华为澳大利亚大动作,终止4.9亿投资;iPhone 12 或10月13日发布;Swift正式登陆Win 10 | 极客头条
那个放弃谷歌回老家二本教书的清华姚班生,现在怎么样了?
相关文章:

获取远程网卡MAC地址
出自: http://blog.joycode.com/liuhuimiao/朋友mingal急问我有关获取远程网卡MAC地址的ASP.net实现。我一开始以为是获取本机MAC地址,说了几种方法给他。由于他还需要获取服务器(本机)相关信息,如硬盘序列号、CPU信息…

[hadoop源码阅读][9]-mapreduce-概论
hadoop的mapreduce的运行流程大概就是如下图所示了 如果要是文字描述,估计要大篇幅了,大家可以参考下面的参考文档. 参考文档 1.http://caibinbupt.iteye.com/blog/336467 2.http://hadoop.apache.org/docs/r0.19.2/cn/mapred_tutorial.html 3.http://developer.yahoo.com/hado…

【小白的CFD之旅】小结及预告
这是小白系列的索引,后续会继续更新。 已更新的部分 01 引子02 江小白03 老蓝04 任务05 补充基础06 流体力学基础07 CFD常识08 CFD速成之道09 初识FLUENT10 敲门实例11 敲门实例【续】12 敲门实例【续2】13 敲门实例【续3】14 实例反思15 四种境界16 流程17 需要编程…
Kaggle金牌得主的Python数据挖掘框架,机器学习基本流程都讲清楚了
作者 | 刘早起来源 | 早起Python导语:很多同学在学习机器学习时往往掉进了不停看书、刷视频的,但缺少实际项目训练的坑,有时想去练习却又找不到一个足够完整的教程,本项目翻译自kaggle入门项目Titanic金牌获得者的Kernelÿ…

input type右对齐与只读的
右对齐的 <input type"text" style"background:#efefef; text-align:right" readonly value"this" /> 只读的input <input type"text" name"nodeCode" readonly value"<%functionNodeForm.getNodeCode()%…

如何从sdcard读取文件
2019独角兽企业重金招聘Python工程师标准>>> 首先,我们必须明白文件储存格式是有许多种的,如utf-8,unicode等。 那么,我们如何将文件原封不动的读取出来呢,我们可以设定,文件储存的绝对路径为filepath。则代…

HDU 2034 人见人爱A-B
人见人爱A-B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 77157 Accepted Submission(s): 21509 Problem Description参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}{B}&#…

Java中的包,类的导入,静态导入
包的作用 1. 为了更好的组织代码,能够将自己的代码与代码库的代码分离。 2. 在需要合作完成的工作中,可以使用分包的方式来尽量的减少类命名的冲突。 Sun公司推荐程序员使用公司域名的反向字符作为公司项目的起始包名:如 baidu.com --> c…

实现800*600,1024*768两套分辨率方案
下面这段代码,可以实现800*600,1024*768两套分辨率方案。 <html><head><title>Untitled Document</title><script language"javascript">function go(){var myWidthscreen.widthif (myWidth>800){window.location.repl…
倒计时 4 天!高通人工智能应用创新大赛颁奖典礼线上隆重举行
经过7 个月的激烈角逐,由高通公司(Qualcomm)、中国智谷重庆经开区、CSDN、Testin云测、OPPO、极视角、中科创达、创业邦联合主办,重庆经开区高通中国中科创达联合创新中心协办,TensorFlow Lite 作为开源技术合作伙伴的…

IOS分享扩展使用JS脚本
2019独角兽企业重金招聘Python工程师标准>>> 实现一个分享扩展插件,功能是从Safari网页中截取当前网页的图片内容 基本的步骤总结在下面: 1.创建一个JS文件,命名为MyJavascriptFile.js,文件的功能是解析safari网页内容…

电脑人会得哪些病----------关注健康,关爱生命!
作者:未知 随着科技水平的提高,现代办公室综合症,特别是高科技病渐渐成为现代职业病。电脑可以说是本世纪最伟大的发明之一,有了它,人们工作、生活、学习的方式都出现了划时代的改变,随着网络与电脑的普及&…

IOS上传图片的方法
下面是图片上传的方法:-(void)loadImage:(NSString*)aurl{NSData *imageData;NSMutableData *postBody;NSString *stringBoundary, *contentType;NSURL *url [NSURL URLWithString:aurl]; //将字符串转换为NSURL格式NSArray *paths…

企业数字化转型,AI平台能力建设是关键
企业数字化转型迎来一波又一波热潮。 IDC研究数据显示,目前中国已有41.4%的企业成为数字化转型的坚定者,到2023年,全球超过一半的GDP将由数字化转型企业的产品和服务推动。 加速数字化转型、让业务智能化,许多行业均认可这是全面…

CSS中连接属性的排序
在CSS超链接的属性中,有四个连接方式: a:link a:hover a:visited a:acticve 之前在使用的时候一直是按照自认为的顺序中去写的,就是 L H V A的排序方式,然而有些时候却发现并不起作用了,查找了一些资料,也上网查找了一…

Spring源代码解析(十):Spring Acegi框架授权的实现
我们从FilterSecurityInterceptor我们从入手看看怎样进行授权的: Java代码 //这里是拦截器拦截HTTP请求的入口 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException …
可租赁、可定制的虚拟人居然还能这么玩?9月25日来百度大脑人像特效专场一探究竟!...
百度大脑自2016年启动开放以来,已打造成为业内最全面、最领先的AI开放平台,服务规模、调用量都居于业界第一。百度大脑开放日于2019年开办,覆盖北/上/深等地区,成为众多AI开发者、合作伙伴近距离沟通及深度交流,一起分…

提供前进、后退功能及其他JAVASCRIPT速成秘诀
通过了解下面的一些例子,并运用到你的WEB中,不久你马上成为JAVASCIPT的高手。 例(一)、在页面加入当前时间 < script languageJavaScript > tdynew Date(); document.write(当前时间:,tdy.getHours()); document.write(:,td…

C#零碎知识点笔记(容易混淆的一些点)
1:按CWTAB就可以完成打印命令的快速输入; 2:声明变量的时候 记得在使用的时候给这个变量一个初始化; 3:明白 CPU___内存----硬盘 之间的 相互关系; 4:在增加浮点数的时候要记得为每一个变量后边…

正则表达式--检查颜色值
<input type"text" name"color"><input type"button" value"check" οnclick"checkColor(color)">检查一下颜色值 ,正确是#六位十六进制数比如:#3EEF4A <script language"JavaScript">functio…
AI安全最全“排雷图”来了!腾讯发布业内首个AI安全攻击矩阵
近年来,人工智能迅猛发展,与家居、金融、交通、医疗等各个领域深度融合,让人们的生活更为便利。但与此同时,基于人工智能的系统一旦存在风险也将带来更为严重的后果。如何确保人工智能在不同的应用场景下不会被轻易控制、影响或欺…

Tomcat5.5x+jndi配置
1、配置Tomcat5.5.X的Server.xml,在<host>下面加上: <Context path"/JNDIDemo" docBase"D:\workspace\JNDIDemo\WebRoot" debug"0" reloadable"true" crossContext"true"> <Logger cl…
设备物理像素、设备独立像素
视觉稿 在前端开发之前,视觉MM会给我们一个psd文件,称之为视觉稿。 对于移动端开发而言,为了做到页面高清的效果,视觉稿的规范往往会遵循以下两点: 首先,选取一款手机的屏幕宽高作为基准(以前是iphone4的32…

只要你敢进来,没有学不会xml滴
作者:喜悦国际村 开心果1、前言 本贴绝大部分资源均转自 http://www.xml.org.cn/ 声明先,免得有人说偶盗链 SHOW TIME2、黄金装备 XML Explorer简体中文正式版(免费)XML.ORG.CN下载 (推荐这个,简单易用&a…
李彦宏AI布局又下一城,成立生命科学公司“百图生科”
此前业内传闻的“李彦宏将投资生物计算”一事有了新进展。9月25日消息,一家名为“百图生科”(英文简称“BioMap”)的生命科学平台公司正式成立。百度创始人、董事长兼CEO李彦宏确定将作为牵头发起人,亲自出任新公司的董事长&#…

1004_C/C++笔试题_13:16道c语言面试【8/9】
8.关键字volatile含义,并给出三个不同的例子。 一个定义为volatile的变量是说这个变量可能会被意想不到的改变。因此,优化器在每次用到这个变量时都要重新读取这个值,而不是使用在寄存器里的备份。 实例: 1.并行设备的硬件寄存器&…

oracel 不为null 保存空字符串
2019独角兽企业重金招聘Python工程师标准>>> // oracle里面不为 null 就不能保存进入 "",必须加上一个空格才可以的。 hrEffPfmcePlaneePo.setGoal("");//不可以保存的。oracle 比较严谨很mysql 不一样 hrEffPfmcePlaneePo.setGoal(…
助力高校学子快速上手!昇腾AI处理器应用开发实践一览|华为昇腾师资培训沙龙北京场...
如今,AI技术已渗透到各个行业,随着AI技术应用的蓬勃发展,相关专业的人才缺口也日益增大。为了助力高校人工智能领域人才培养及学科建设,华为通过昇腾师资培训沙龙,面向广大高校教师提供昇腾全栈全场景AI技术知识点培训…

巧用CSS的RevealTrans滤镜
作者: 冯永曜 CSS的RevealTrans动态滤镜是一个神奇的滤镜,它能产生23种动态效果,更为奇妙的是它还能在23种动态效果中随机抽用其中的一种。用它来进行网页之间的动态切换,简直方便极了,你只要在网页源代码的< …

FOPEN FUNCTION
打开文件提供给低级文件函数使用. FOPEN(cFileName [, nAttribute]) 参数 cFileName 指定要打开的文件名,cFileName可以包含Microsoft Visual FoxPro在当前搜索路径中未指定的目录,文件夹,驱动器,或卷下要打开文件的路径.如果这个路径没有被包含在内,Visual FoxPro在下列位置索…