维特比算法本质上就是一个动态规划DP算法,在知乎上看到了关于一个解释维特比算法的解释https://www.zhihu.com/question/20136144, 因此在此特意在转载下,并加入一些个人对于结合实际案例场景下的算法理解说明:

1.题目背景:

从前有个村儿,村里的人的身体情况只有两种可能:健康或者发烧。
假设这个村儿的人没有体温计或者百度这种神奇东西,他唯一判断他身体情况的途径就是到村头我的偶像金正月的小诊所询问。
月儿通过询问村民的感觉,判断她的病情,再假设村民只会回答正常、头晕或冷。
有一天村里奥巴驴就去月儿那去询问了。
第一天她告诉月儿她感觉正常。
第二天她告诉月儿感觉有点冷。
第三天她告诉月儿感觉有点头晕。
那么问题来了,月儿如何根据阿驴的描述的情况,推断出这三天中阿驴的一个身体状态呢?

因此,从HMM隐马尔科夫模型的角度来说,健康或者发烧 是身体隐含的状态state, 而正常,头晕或者冷是观察序列,

因此这三天的观察序列为: 正常, 冷, 头晕, 而每天的身体隐含状况则未知, 这在HMM问题中属于解码问题,可以通过维特比算法,利用动态规划算法,来求解出整个HMM链中每天的隐含状态。

2.已知情况:

隐含的身体状态 = { 健康 , 发烧 }

可观察的感觉状态 = { 正常 , 冷 , 头晕 }

假定阿驴身体状态的概率分布为 = { 健康:0.6 , 发烧: 0.4 }   这就是初始状态序列。

假定阿驴身体健康状态的转换概率分布 = {
健康->健康: 0.7 ,
健康->发烧: 0.3 ,
发烧->健康:0.4 ,
发烧->发烧: 0.6
}

这样就可以列出相应的状态转移矩阵:


月儿认为的在相应身体状况条件下,身体感觉这一观测序列的条件概率分布 = {
             正常            冷            头晕

健康:    0.5             0.4             0.1

发烧:    0.1             0.3             0.6

}

这样就可以列出相应的观测矩阵:


由上面我们可以发现,HMM的三要素都齐备了,下面就是解决问题了。
阿驴连续三天的身体感觉依次是: 正常、冷、头晕 。

3.题目:

已知如上,求:阿驴这三天的身体健康状态变化的过程是怎么样的?即已知观测序列和HMM模型的情况下,求状态序列。
4.过程:

  • 第一天的时候,观测值为正常, 因此对每一个状态(健康或者发烧)的情况下,根据状态分布矩阵与条件概率矩阵,求得观测值与每个状态的联合概率分布
  • P(正常,第一天健康) = P(正常|健康) * P(健康|初始情况) = 0.5 * 0.6 = 0.3  
  • P(正常, 第一天发烧) = P(正常|发烧) * P(发烧|初始情况) = 0.1 * 0.4 = 0.04
  • 注意点:P(第一天健康) == P(正常,第一天健康), 因为观察值正常 是实际确定了的序列值,因此联合概率与隐含状态的概率 等价
  • 第二天的时候,观测值为冷,继续来求观测值与所有可能的隐含状态的联合概率, 而此时每个隐含状态(健康或者发烧),都要考虑上一个状态的概率以及到当前状态的条件转移概率分布,
  • 例如: 当前观测值为冷,假定当前隐含状态为健康,求当前的联合概率分布P(冷,第二天健康) 。首先从 昨天的状态到当前的健康状态 有两种路径(昨天的状态还没确定,而只是先计算出每个状态的概率分布): 昨天健康 ----> 今天健康,   昨天发烧 -----> 今天健康。 这两个路径分别的概率为 0.3 * 0.7 以及 0.04 * 0.4, 可以看到 当前如果为健康时,昨天为健康的概率更大,因此我们选定昨天健康 ----> 今天健康 这条路径,即记录下当前为健康时,昨天也为健康状态, 然后求得当前的联合概率分布 P(冷,第二天健康) = (0.3 * 0.7 ) * 0.4 = P(第二天健康), 即如下:
  • P(冷,第二天健康) = max{0.3*0.7, 0.04*0.4} * 0.4=0.3* 0.7 * 0.4=0.084 此时我们需要记录概率最大的路径的前一个状态,即0.084路径的前一个状态,我们在小本本上记下,第二天健康时,第一天的状态也为健康。
  • 同理, 假定当前隐含状态为发烧时, 求当前的联合概率分布P(冷,第二天发烧) 。一样的道理,从昨天的状态到当前的发烧状态也有两种路径:  昨天健康 ----> 今天发烧,   昨天发烧 -----> 今天发烧,这两个路径分别的概率为 0.3 * 0.3以及 0.04 * 0.6, 可以看到 当前如果为发烧时,昨天为健康的概率更大,因此我们选定昨天健康 ----> 今天发烧 这条路径,即记录下当前为发烧时,昨天也为健康状态, 当前的联合概率分布 P(冷,第二天发烧) = (0.3 * 0.3 ) * 0.3 = P(第二天发烧), 即如下:
  • P(冷,第二天发烧) = max{0.3*0.3,  0.04*0.6} * 0.3=0.027, 同样的在0.027这个路径上,第二天为发烧时,第一天也是健康的。
  • 第三天的时候,观察序列为头晕,仍旧来求第三天观察序列与所有状态的联合概率分布,此时通过第二天的计算,可以求得第二天的健康状态与发烧状态的概率分别0.084 和0.027,针对当前健康和发烧两个状态下,分别求昨天所有的状态到当前两个状态的各自所有路径,求得当前健康和发烧下的各自最大概率路径,得到:
  • P(第三天健康)=max{0.084*0.7, 0.027*0.4} * 0.1=0.00588,在这条路径上,当前第三天健康时,第二天是健康的。
  • P(第三天发烧)=max{0.084*0.3, 0.027*0.6} * 0.6=0.01512,   在这条路径上,当前第三天发烧时,第二天是健康的。
  • 假定到第三天是最后一天, 此时看第三天为发烧时状态概率最大,即为最优状态,即P(最优)=0.01512,这样我们可以得到最优路径的终点,是发烧状态
  • 由最优状态开始回溯。根据前面所记录的, 在求得第三天发烧的时候,我们记录的第二天最大概率的状态为健康,因此确定第二天为健康状态,继续回溯,当第二天为健康状态时,我们记录的第一天是健康的。这样,我们的状态序列逆推出来了。即为:健康,健康,发烧
  • 简略的画个图吧:
  • 注意点:图中求得max概率的时候 其实省略了 状态到观测值的概率,例如max = 0.084 = 03 * 0.7 * 0.3, 由于画图缘故省略了这一块,P(第一天健康) = P(正常,第一天健康), 因为观察值正常 是实际确定了的序列值,因此联合概率与隐含状态的概率 等价
别人也给出了一个HMM概率图 可以参考下:
这儿的箭头指向就是一个回溯查询小本本的过程,我们在编写算法的时候,其实也得注意,每一个概率最大的 单条路径 上都要把前一个状态记录下来。
知乎上也有人给出了相应的代码实现:
https://github.com/qqiang00/Machine-Learning-Samples/blob/master/mynltk/cn_viterbi.py
后续CRF条件随机场其实也是强化版的马尔科夫随机场,核心还是维特比算法等等

维特比算法的通俗案例解释相关推荐

  1. 语音识别学习日志 2019-7-17 语音识别基础知识准备6 {维特比算法(Viterbi Algorithm)}

    HMM 维特比算法(Viterbi Algorithm)详细解释参考:http://www.52nlp.cn/hmm-learn-best-practices-six-viterbi-algorith ...

  2. DL之BP:神经网络算法简介之BP算法简介(链式法则/计算图解释)、案例应用之详细攻略

    DL之BP:神经网络算法简介之BP算法简介(链式法则/计算图解释).案例应用之详细攻略 相关文章:DL之DNN之BP:神经网络算法简介之BP算法/GD算法之不需要额外任何文字,只需要八张图讲清楚BP类 ...

  3. 维特比算法的java实现_维特比算法通俗明白

    维特比算法说白了就是动态规划实现最短路径,只要知道"动态规划可以降低复杂度"这一点就能轻松理解维特比算法维特比算法是一个特殊但应用最广的动态规划算法,利用动态规划,可以解决任何一个 ...

  4. 转载大神的~~~~~~ KMP算法的前缀next数组最通俗的解释,如果看不懂我也没辙了

    KMP算法的前缀next数组最通俗的解释,如果看不懂我也没辙了 分类: 常用基础算法 IT经典笔试题 2012-09-02 10:09  1042人阅读  评论(1)  收藏  举报 算法 c 编程 ...

  5. KMP算法的前缀next数组最通俗的解释,如果看不懂我也没辙了

    我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性, ...

  6. viterbi,维特比算法通俗理解

    维特比算法说白了就是动态规划实现最短路径,只要知道"动态规划可以降低复杂度"这一点就能轻松理解维特比算法 维特比算法是一个特殊但应用最广的动态规划算法,利用动态规划,可以解决任何一 ...

  7. 机器学习算法 10 —— HMM模型(马尔科夫链、前向后向算法、维特比算法解码、hmmlearn)

    文章目录 系列文章 隐马尔科夫模型 HMM 1 马尔科夫链 1.1 简介 1.2 经典举例 2 HMM简介 2.1 简单案例 2.2 案例进阶 问题二解决 问题一解决 问题三解决 3 HMM模型基础 ...

  8. 条件随机场(CRF) - 4 - 学习方法和预测算法(维特比算法)

    声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,由于本人在学习初始时有很多数学知识都已忘记,所以为了 ...

  9. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

最新文章

  1. VSCode 安装 Go 插件、gopls 是个什么东东
  2. Java项目:农资采购销售系统(java+SSM+Easyui+maven+Mysql)
  3. React是如何在后台运行的
  4. kaggle房价预测特征意思_R语言实战:复杂数据处理和分析之Kaggle房价预测
  5. 【小白学习C++ 教程】十五、C++ 中的template模板和泛型
  6. Leetcode 904.水果成蓝(滑动窗口,哈希容器map
  7. 数学公式(待慢慢总结)
  8. chrome 插件下载
  9. python程序可以在任何安装了解释器_Windows安装多个python解释器
  10. Vue 服务端渲染(SSR)、Nuxt.js - 从入门到实践
  11. Jmeter学习笔记ONE
  12. SqlMapConfig.xml 的配置
  13. php表单美化,使用css美化html表单控件详细示例(表单美化)_HTML/Xhtml_网页制作
  14. 正项级数收敛性判别方法
  15. 如何科学管理你的密码
  16. oracle的固定值
  17. mysql 部署master slave_MySQL Master Slave 数据同步,集群。
  18. unity2D制作一个2D游戏场景Tilemap
  19. node 对接微信支付的踩坑记录(服务端)
  20. html 如何完美的显示图片,不拉伸图片,完整显示等等。

热门文章

  1. 删除带头结点的单链表的奇数结点
  2. 【AE工具】AE一键切换中英文小工具,免费下载 支持CC2014-CC2019
  3. 作业调度算法【平均周转时间、平均带权周转时间、先来先服务FCFS、短作业优先SJF、高优先权(级)算法FPF、高响应比优先算法HRRN】
  4. 关于我AbortME
  5. python变量名长度有限制吗_怎么去除 Python 下载文件时的文件名长度 50 限制
  6. Java编程----函数
  7. [Python] 散点图(二维散点图、三维散点图、散点图矩阵)
  8. Tomcat乱码全解决
  9. 删除docker里的的容器
  10. Linux中阶—文件服务vsftpd (九)