维特比算法Python实现
前言
维特比算法是隐马尔科夫问题的一个基本问题算法。维特比算法解决的问题是已知观察序列,求最可能的标注序列。
什么是维特比算法?
维特比算法尽管是基于严格的数学模型的算法,但是维特比算法毕竟是算法,因此可以感性地去理解。关于感性的认识,知乎上有维特比算法的感性认识讲解,讲的非常好,也非常仔细。在这里,我阐述一下自己的理解,如果有没有讲明白的地方,可以参考知乎上的讲解。
比如说我们知道一个人有三个精神状态,比如说正常、冷、头晕。并且我们知道身体状态转换概率
| 状态 | 健康 | 发烧 |
|---|---|---|
| 健康 | 0.7 | 0.3 |
| 发烧 | 0.4 | 0.6 |
以及精神状态和身体状态的概率分布
| 状态 | 正常 | 冷 | 头晕 |
|---|---|---|---|
| 健康 | 0.5 | 0.4 | 0.1 |
| 发烧 | 0.1 | 0.3 | 0.6 |
我们已经知道一个人的精神状态是正常、冷、头晕。我们想要知道这个人三天的身体状态。利用维特比算法就可以很好的预测。
看起来很神奇?
维特比算法完全基于普通的概率论知识,下面结合Python实现来阐述一下维特比算法究竟是什么。
首先可以将概率矩阵借助Numpy输入程序
tran = np.array([[0.7, 0.3],
[0.4, 0.6]])
laun = np.array([[0.5, 0.4, 0.1],
[0.1, 0.3, 0.6]])
init = np.array([0.6,0.4 ])
look = np.array([0, 1,2]) # 观测序列
kind = ['健康', '发烧']
上面的init矩阵是健康状态的初始概率,0.6代表初始状态有0.6的概率为健康,0.4代表初始状态有0.4的概率为发烧。
我们已经知道第一天的精神状态是正常,那么健康的概率就是P(正常|健康)*P(健康|初始状态)。发烧的概率也是同理。
因此我们可以利用下面的代码实现初始健康状态的计算
dp = np.array([a * b for a, b in zip(init, laun[:, look[0]])])
print(max(dp))
print('第1次' + kind[np.where(dp==max(dp))[0][0]])
上面算出来的概率并不是代表初始状态下健康的概率,初始状态下健康的概率我们在问题初始时就已经知道,不需要计算。这里计算的是,在初始状态下,究竟是健康更可能推出来正常,还是发烧更能推出来健康。从这个角度来思考问题,可以发现这样也可以决定这个人的第一天的健康状态究竟是什么。
后面的问题也是采用相同的办法来处理,比如对于第二天来说,精神状态是冷,也就是状态1。这里我们可以计算概率为P(冷|健康)P(健康|上一天健康)P(上一天健康)
相应的python代码如下:
for i in range(1,3):
temp = np.copy(dp)
for j in range(2):
dp[j] = max([a * b for a, b in zip(temp, tran[:,j])])*laun[j,look[i]]
print('第{}次'.format(i+1) + kind[np.where(dp==max(dp))[0][0]])
根据上述代码,我们就可以计算出每天最有可能的健康状态。
总结
维特比算法利用概率知识,通过已知的观察序列情况,通过推算在某种标注序列的情况下发生观察序列的概率,然后求出最有可能的标注序列情况,从而解决标注序列推测的问题。
维特比算法Python实现的更多相关文章
- 简单说维特比算法 - python实现
动态规划求最短路径算法,与穷举法相比优点在于大大降低了时间复杂度; 假如从起点A到终点S的最短路径Road经过点B1,那么从起点A到B1的最短路径的终点就是B1,否则如果存在一个B2使得A到B2的距离 ...
- 【机器学习】【条件随机场CRF-2】CRF的预测算法之维特比算法(viterbi alg) 详解 + 示例讲解 + Python实现
1.CRF的预测算法条件随机场的预测算法是给定条件随机场P(Y|X)和输入序列(观测序列)x,求条件概率最大的输出序列(标记序列)y*,即对观测序列进行标注.条件随机场的预测算法是著名的维特比算法(V ...
- 维特比算法(Viterbi)及python实现样例
维特比算法(Viterbi) 维特比算法 维特比算法shiyizhong 动态规划算法用于最可能产生观测时间序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔科夫模型中.术语“维特 ...
- 前向算法Python实现
前言 这里的前向算法与神经网络里的前向传播算法没有任何联系...这里的前向算法是自然语言处理领域隐马尔可夫模型第一个基本问题的算法. 前向算法是什么? 这里用一个海藻的例子来描述前向算法是什么.网上有 ...
- 维特比算法(Viterbi)-实例讲解(暴力破解+代码实现)
1.简介 维特比算法是一个通用的求序列最短路径的动态规划算法,也可以用于很多其他问题,比如:文本挖掘.分词原理.既然是动态规划算法,那么就需要找到合适的局部状态,以及局部状态的递推公式.在HMM中,维 ...
- Machine Learning系列--维特比算法
维特比算法(Viterbi algorithm)是在一个用途非常广的算法,本科学通信的时候已经听过这个算法,最近在看 HMM(Hidden Markov model) 的时候也看到了这个算法.于是决定 ...
- Java实现:抛开jieba等工具,写HMM+维特比算法进行词性标注
一.前言:词性标注 二.经典维特比算法(Viterbi) 三.算法实现 四.完整代码 五.效果演示: 六.总结 一.前言:词性标注 词性标注(Part-Of-Speech tagging, POS t ...
- Viterbi 算法 Python实现 [NLP学习一]
最近思考了一下未来,结合老师的意见,还是决定挑一个方向开始研究了,虽然个人更喜欢鼓捣.深思熟虑后,结合自己的兴趣点,选择了NLP方向,感觉比纯粹的人工智能.大数据之类的方向有趣多了,个人还是不适合纯粹 ...
- 维特比算法(Viterbi Algorithm)
寻找最可能的隐藏状态序列(Finding most probable sequence of hidden states) 对于一个特殊的隐马尔科夫模型(HMM)及一个相应的观察序列,我们常常希望 ...
随机推荐
- Cache replacement policies 缓存实现算法
Cache replacement policies - Wikipedia https://en.wikipedia.org/wiki/Cache_replacement_policies Cach ...
- 伪列ROWNUM、ROWID部分用法
ROWNUM是逻辑值,不可以参与计算 ROWID是物理值,可以参与计算 在ROWNUM和ROWID使用中,现将查找结果形成一个结果集 在结果集中给ROWID 和ROWNUM别名,在外层中使用这个别名找 ...
- sublime text3控制台每次报错会显示几行[ ]
如下图所示,每次编译报错的时候会显示: 我只需要报错信息,不想红框中的信息出现. 解决方案: 1 找到sublime Text3安装路径下的Default.sublime-package,如~Subl ...
- TortoiseGit的使用
TortoiseGit只是一个外壳而已,它调用的是msysgit,相当于msysgit的windows gui而已,如果喜欢用git命令行,那就不需要安装它. 所以要先安装msysgit(window ...
- post方式提交数据
<!DOCTYPE HTML><html> <head> <meta charset="utf-8" /> ...
- 10 ref 和 out 之间的差别
(1) 两者都是按地址传递的,使用后都将改变原来的数值 (2) ref传进去的參数必须在调用前初始化,out不必 (3) ref传进去的參数在函数内部能够直接使用,而out不可 (4) ref传进去的 ...
- HTML5-CSS3-JavaScript(4)
CSS3中 变形与动画相关属性 CSS3在原来的基础上新增了变形和动画相关属性,通过这些属性可以实现以前需要大段JavaScript才能实现的功能.CSS3的变形功能可以对HTML组件执行位移.旋转. ...
- Y2K Accounting Bug(poj2586)
题意: 有一个公司由于某个病毒使公司赢亏数据丢失,但该公司每月的 赢亏是一个定数,要么一个月赢利s,要么一月亏d.现在ACM只知道该公司每五个月有一个赢亏报表,而且每次报表赢利情况都为亏.在一年中这样 ...
- 怎么申请 bing api key
1:打开网址 https://login.live.com/ 注册帐号并登录(点击上图中的登录按钮即可),在新窗口点击下方的“立即注册”(有帐号的可以直接登录) 2:填写相关信息(推荐使用hotmai ...
- Catch all the latest Jordan Release Dates
In case y'all missed yesterday's news, Air Jordan 13 Olive 2018 officially unveiled their 2017 Holid ...