HMM:Hidden Markov Model,是用来描述隐含未知参数的统计模型,由显状态(可观测序列)、隐状态、发射概率(隐状态产生显状态的概率)、转移概率(显状态之间的转换)、初始概率(通常指隐状态)五部分构成,关于HMM的原理,这里我不便过多赘述,有原理不清的同学,建议大家参考这边博客,写得十分详细:https://www.cnblogs.com/skyme/p/4651331.html

那么给定一个显状态序列(观测状态),我们如何根据给定内容来推断隐状态序列呢?我们这里就来介绍(Viterbi)维特比算法

这里我们通过一个十分著名的例子来理解维特比算法思想,以及代码部分:

例:一个东京的朋友每天根据天气{下雨,天晴}决定当天的活动{公园散步,购物,清理房间}中的一种,我每天只能在twitter上看到她发的推“啊,我前天公园散步、昨天购物、今天清理房间了!”,那么我可以根据她发的推特推断东京这三天的天气。在这个例子里,显状态是活动,隐状态是天气。

现在我们已知:

初始概率:{'Rainy': 0.6, 'Sunny': 0.4}

转换概率:{ 'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},                                                                                                                                                        'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},}

发射概率:{ 'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},                                                                                                                                          'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},}

让我们来预测东京的天气。

思路:例,第一天晴的概率P(一,晴) = P(晴) * P(散步 | 晴),即初始概率 * 发射概率。分别计算第一天晴和阴的概率来更新初始化概率。

第二天晴的概率 = P(一,晴) * P(晴->晴) * P(购物 | 晴),即初始概率 * 转换概率 * 发射概率。注意,这里的初始化:这里会在第一天的基础上计算4组,两组晴天概率,两组阴天概率,选各组的最大值作为最终结果,并更新初始化概率。

第三天依然如此,要在上一天的基础上计算四组,如果第三天是序列最后一个值,则计算4组中的唯一一个最大值作为结果,并回溯,得到隐状态预测序列,算法结束。否则重复:‘两组晴天概率,两组阴天概率,选各组的最大值作为最终结果,并更新初始化概率 ’操作。

值得注意的是,这里的回溯选择回溯可以说是维特比算法的经典,也是维特比算法不同于前向传播的地方,大家要注意这一点。

代码:这里的代码链接:https://github.com/hankcs/Viterbi

现在我们来看代码:

#初始化条件
states = ('Rainy', 'Sunny')observations = ('walk', 'shop', 'clean')start_probability = {'Rainy': 0.6, 'Sunny': 0.4}transition_probability = {'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},}emission_probability = {'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
}# 打印每一次计算的保留值,对应到本题即晴天,阴天各自的最大值
def print_dptable(V):print "    ",for i in range(len(V)): print "%7d" % i,printfor y in V[0].keys():print "%.5s: " % y,for t in range(len(V)):print "%.7s" % ("%f" % V[t][y]),printdef viterbi(obs, states, start_p, trans_p, emit_p):""":param obs:观测序列:param states:隐状态:param start_p:初始概率(隐状态):param trans_p:转移概率(隐状态):param emit_p: 发射概率 (隐状态表现为显状态的概率):return:"""# 路径概率表 V[时间][隐状态] = 概率V = [{}]# 一个中间变量,代表当前状态是哪个隐状态path = {}# 初始化初始状态 (t == 0),即第一天的计算在这里进行for y in states:V[0][y] = start_p[y] * emit_p[y][obs[0]]path[y] = [y]# 对第二天及以后应用维特比算法for t in range(1, len(obs)):V.append({})newpath = {}for y in states:#这里即为计算每一组中的最大值,即前一天阴天的的情况下今天是y的概率,以及前一天晴天时今天是y的概率中选择一个最大值#隐状态概率 =    前状态是y0的概率 * y0转移到y的概率 * y在t状态是为当前状态的概率(prob, state) = max([(V[t - 1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states])# 记录最大概率V[t][y] = prob# 记录路径,这里为了方便回溯,记录回溯结果newpath[y] = path[state] + [y]# 记录回溯结果path = newpathprint_dptable(V)(prob, state) = max([(V[len(obs) - 1][y], y) for y in states])return (prob, path[state])def example():return viterbi(observations,states,start_probability,transition_probability,emission_probability)print example()

运行结果:

          0       1       2
Rainy:  0.06000 0.03840 0.01344
Sunny:  0.24000 0.04320 0.00259
(0.01344, ['Sunny', 'Rainy', 'Rainy'])

通过这样一个简单的例子我们就能明白维特比算法的原理了。

HMM:Hidden Markov Model 代码讲解相关推荐

  1. HMM(Hidden Markov Model)

    目录 HMM定义 HMM的确定 从⽣成式的观点考虑隐马尔科夫模型,我们可以更好地理解隐马尔科夫模型. HMM的参数 统一定义: HMM举例 HMM的3个基本问题 概率计算问题 定义:前向概率-后向概率 ...

  2. 语音识别学习日志 2019-7-14 语音识别基础知识准备3 {Kmean算法分析与HMM(Hidden Markov Model)模型}

    Kmean算法 聚类算法 对于"监督学习"(supervised learning),其训练样本是带有标记信息的,并且监督学习的目的是:对带有标记的数据集进行模型学习,从而便于对新 ...

  3. Hidden Markov Model

    #HMM隐马尔科夫模型 ###①通俗的理解 首先举一个例子,扔骰子,有三种骰子,第一个是比较常见的6个面,每一个面的概率都是1/6.第二个只有4个面,,每一个面的概率是1/4.第三个有8个面,,每一个 ...

  4. 机器学习中隐马尔可夫模型(Hidden Markov Model, HMM)理论

    隐马尔可夫模型(Hidden Markov Model, HMM) 前言 :内容从实际案例到模型提取.建立.求解以及应用,侧重于该模型在机器学习中的研究和应用. 参考书: <统计学习方法> ...

  5. 隐马尔可夫模型(Hidden Markov Model,HMM)是什么?隐马尔可夫模型(Hidden Markov Model,HMM)的三个基本问题又是什么?

    隐马尔可夫模型(Hidden Markov Model,HMM)是什么?隐马尔可夫模型(Hidden Markov Model,HMM)的三个基本问题又是什么? 隐马尔可夫模型 (Hidden Mar ...

  6. HHM(Hidden Markov Model)-隐式马尔科夫模型

    HHM(Hidden Markov Model)-隐式马尔科夫模型 隐式马尔科夫模型是通过对观察序列的观测推导出隐藏状态.举例说明,由于本人是在十一小长假写下该篇文章,因此就拿小长假的出行计划介绍该算 ...

  7. [转] 爱情的隐式马尔可夫模型(Love in the Hidden Markov Model)

    首先感谢原英文作者Tom Yeh的精彩描述,生动地讲述了HMM模型的原理,在此我斗胆用我自己的语言用中文修改描述一次. 感兴趣的可以点击这里下载latex生成的pdf 版本. 男生和女生分别是来自不同 ...

  8. 概率图模型笔记(二) 隐马尔科夫模型(Hidden Markov Model)

    写在前面 隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理,模式识别等领域得到广泛的应用.最近入坑NLP,看到好多算法都涉 ...

  9. 【大道至简】机器学习算法之隐马尔科夫模型(Hidden Markov Model, HMM)详解(3)---学习问题:Baum-Welch算法推导及Python代码实现

    ☕️ 本文系列文章汇总: (1)HMM开篇:基本概念和几个要素 (2)HMM计算问题:前后向算法 (3)HMM学习问题:Baum-Welch算法 (4) HMM预测问题:维特比算法 ☕️ 本文来自专栏 ...

最新文章

  1. 笔记 - AliCloud 云数据库 简介
  2. php包括web前端,web前端包括什么技术?
  3. 2020年中国冷链物流行业发展报告
  4. java tostring格式_如何在Java中使用toString()获得数字的字符串表示形式?
  5. 基于内容的视频标注——物体层视频标注
  6. php array函数 array_chunk把数组分割成相同的数组大小
  7. PS中rename-item的一些高级应用
  8. gradle下载与配置
  9. python关于pyaudio无法import的一系列问题
  10. 市科创委智能硬件联盟之打造公共平台,助力创新创业论坛圆满落幕
  11. java同构数_Java 同构数的问题
  12. 利用cookie实现登陆知网与抽屉网 基于session自动登录抽屉网 cookie与session区别
  13. 图扑智慧城市 | 搭建政务民生可视化管理系统
  14. pytorch transforms图像增强
  15. python生成小学数学练习题
  16. 聚类分析详细解读python
  17. python屏幕文字识别_python 图片文字识别 可截图识别
  18. 自定义异常:运行时期和编译时期的区别
  19. c语言字符串的题库,C考试系统题库含答案程序题
  20. 【数据结构课程设计报告】电话号码查询系统(Java实现)

热门文章

  1. nginx反向代理下thinkphp、php获取不到正确的外网ip
  2. 查看APK中MD5签名的方法
  3. Qt的MDI中多个子窗口响应一个菜单事件的优雅实现(动态slot)
  4. PowerDesigner如何导出建表sql脚本(转)
  5. UI Prototype Design IDE( 界面原型设计工具 )
  6. 学点 C 语言(9): if 语句
  7. [导入]用Javascript实现interface的类似功能
  8. Java+MyEclipse+Tomcat (四)Servlet提交表单和数据库操作
  9. Swift之字符串String的常规操作和处理
  10. HarmonyOS之调试分析打印HiLog日志