作者 | 梁云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 | 极客头条

  • 那个放弃谷歌回老家二本教书的清华姚班生,现在怎么样了?

60分钟看懂HMM的基本原理相关推荐

  1. 30分钟看懂XGBoost的基本原理

    作者 | 梁云1991 转载自Python与算法之美(ID: Python_Ai_Road) 一.XGBoost和GBDT xgboost是一种集成学习算法,属于3类常用的集成方法(bagging,b ...

  2. xgboost算法_30分钟看懂XGBoost的基本原理

    作者 | 梁云1991 转载自Python与算法之美(ID: Python_Ai_Road) 一.XGBoost和GBDT xgboost是一种集成学习算法,属于3类常用的集成方法(bagging,b ...

  3. 三分钟看懂5G NSA和SA

    原标题:三分钟看懂5G NSA和SA 来源:无线深海 作者:蜉蝣采采 物联网智库 转载 导 读 本文将详细讨论什么是5G NSA(非独立组网)和5G SA(独立组网),以及它们有何异同之处. 01 5 ...

  4. 量子计算机 漫画,漫画 | 10分钟看懂量子比特、量子计算和量子算法

    原标题:漫画 | 10分钟看懂量子比特.量子计算和量子算法 请做好准备,即将进入烧脑模式! 宏观世界的生活经验很多都是表象.比如,你可能认为世界的运行是确定的.可预测的:一个物体不可能同时处于两个相互 ...

  5. java和python的web自动化有什么区别-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  6. python和java一样吗-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  7. 图像拾取点_10分钟看懂Photoshop 照片修饰(用“消失点”滤镜编辑照片)

    "消失点"滤镜具有特殊的功能,它可以在包含透视平面(如建筑物侧面或热和矩形对象)的图像中进行透视校正.在应用诸如绘画.仿制.拷贝或粘贴,以及变换等编辑操作时,Photoshop可以 ...

  8. 怎么看到方法内引用方法的注释_网页内文字无法复制怎么办?一分钟看懂这些方法,让你随意复制...

    网页内文字无法复制怎么办?一分钟看懂这些方法,让你随意复制 现在的生活中,无论你是一名上班族还是学生或者什么职业,遇到不会的问题,总是需要上网查资料,找到某些好用的资料,却因为某些原因需要付费才能复制 ...

  9. 三相逆变器双pi控制器参数如何调节_一分钟看懂维也纳三相整流器

    欢迎加入技术交流QQ群(2000人):电力电子技术与新能源 1105621549 高可靠新能源行业顶尖自媒体 在这里有电力电子.新能源干货.行业发展趋势分析.最新产品介绍.众多技术达人与您分享经验,欢 ...

最新文章

  1. 【程序猿猴年金牌福利包】让你远离Bug,紧跟春天的脚步
  2. scrapy 中爬取时被重定向_一篇文章教会你理解Scrapy网络爬虫框架的工作原理和数据采集过程...
  3. C# 8.0的三个令人兴奋的新特性 1
  4. 科学家公布“寿命计算器”,快算一下你能活多久?
  5. Wexflow:C#中的开源工作流引擎
  6. java11和13_Java1113
  7. Cocos2d-x 3.2:定时器的使用和原理探究(2)
  8. python列表(list)和元组(tuple)之间的转换
  9. IT业十大热门职位介绍 (转)
  10. 如何在Mac电脑中设置安全与隐私?如何加密应用?
  11. html文本框虚线并加上文字,文字边框虚线样式用css怎么写?(示例)
  12. 4.JavaScript对象和初始面向对象
  13. 从零开始java数据库SQL优化(二):多个LEFT JOIN的SQL优化
  14. 使用虹软SDK实现离线人脸注册,人脸登录(H5-JS前端,java后台)
  15. 中铁员工入职培训心得体会
  16. https://nbicddnbp.pxvqgzr.com/f/Y315nOiv1 fu指喲 考貝该段,点開块手
  17. Linux版的杀毒软件——avast
  18. 快站模板 连接mysql_建站实操:如何用CMS快速建站
  19. MT6739,MT6762 MTK Browser打开网页预加载时,界面闪屏
  20. 史上最详细配置阿里镜像加速器方法

热门文章

  1. 基于qml创建最简单的图像处理程序(1)-基于qml创建界面
  2. js 创建一条通用链表
  3. Java:多个文档合并输出到一个文档
  4. 网络管理常用命令之二 - Ipconfig 命令详解(图文)
  5. 利用SMS OSD实现win2008操作系统的部署
  6. Cartographer学习笔记
  7. 16.matlab并行处理,调用CPU得多核
  8. C#编写dll进行sql server数据库扩展储存过程
  9. 【算法学习】堆排序建立最大堆
  10. Java学习笔记七——数组工具类Arrays