前言

维特比算法是隐马尔科夫问题的一个基本问题算法。维特比算法解决的问题是已知观察序列,求最可能的标注序列。

什么是维特比算法?

维特比算法尽管是基于严格的数学模型的算法,但是维特比算法毕竟是算法,因此可以感性地去理解。关于感性的认识,知乎上有维特比算法的感性认识讲解,讲的非常好,也非常仔细。在这里,我阐述一下自己的理解,如果有没有讲明白的地方,可以参考知乎上的讲解。

比如说我们知道一个人有三个精神状态,比如说正常、冷、头晕。并且我们知道身体状态转换概率

状态 健康 发烧
健康 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实现的更多相关文章

  1. 简单说维特比算法 - python实现

    动态规划求最短路径算法,与穷举法相比优点在于大大降低了时间复杂度; 假如从起点A到终点S的最短路径Road经过点B1,那么从起点A到B1的最短路径的终点就是B1,否则如果存在一个B2使得A到B2的距离 ...

  2. 【机器学习】【条件随机场CRF-2】CRF的预测算法之维特比算法(viterbi alg) 详解 + 示例讲解 + Python实现

    1.CRF的预测算法条件随机场的预测算法是给定条件随机场P(Y|X)和输入序列(观测序列)x,求条件概率最大的输出序列(标记序列)y*,即对观测序列进行标注.条件随机场的预测算法是著名的维特比算法(V ...

  3. 维特比算法(Viterbi)及python实现样例

    维特比算法(Viterbi) 维特比算法 维特比算法shiyizhong 动态规划算法用于最可能产生观测时间序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔科夫模型中.术语“维特 ...

  4. 前向算法Python实现

    前言 这里的前向算法与神经网络里的前向传播算法没有任何联系...这里的前向算法是自然语言处理领域隐马尔可夫模型第一个基本问题的算法. 前向算法是什么? 这里用一个海藻的例子来描述前向算法是什么.网上有 ...

  5. 维特比算法(Viterbi)-实例讲解(暴力破解+代码实现)

    1.简介 维特比算法是一个通用的求序列最短路径的动态规划算法,也可以用于很多其他问题,比如:文本挖掘.分词原理.既然是动态规划算法,那么就需要找到合适的局部状态,以及局部状态的递推公式.在HMM中,维 ...

  6. Machine Learning系列--维特比算法

    维特比算法(Viterbi algorithm)是在一个用途非常广的算法,本科学通信的时候已经听过这个算法,最近在看 HMM(Hidden Markov model) 的时候也看到了这个算法.于是决定 ...

  7. Java实现:抛开jieba等工具,写HMM+维特比算法进行词性标注

    一.前言:词性标注 二.经典维特比算法(Viterbi) 三.算法实现 四.完整代码 五.效果演示: 六.总结 一.前言:词性标注 词性标注(Part-Of-Speech tagging, POS t ...

  8. Viterbi 算法 Python实现 [NLP学习一]

    最近思考了一下未来,结合老师的意见,还是决定挑一个方向开始研究了,虽然个人更喜欢鼓捣.深思熟虑后,结合自己的兴趣点,选择了NLP方向,感觉比纯粹的人工智能.大数据之类的方向有趣多了,个人还是不适合纯粹 ...

  9. 维特比算法(Viterbi Algorithm)

      寻找最可能的隐藏状态序列(Finding most probable sequence of hidden states) 对于一个特殊的隐马尔科夫模型(HMM)及一个相应的观察序列,我们常常希望 ...

随机推荐

  1. Mayor's posters---poj2528线段树、离散化

    题目链接:http://poj.org/problem?id=2528 题意:有n张海报要贴,每张需要用的区间为L到R,后面的可以贴在之前的上面,就是吧之前的挡住,求最后我们能看到几张海报: 我们可以 ...

  2. sql批量修改wordpress文章发布时间

    有时为了体现wordpress文章的更新程度,会在后台那边重新设置发布时间,有没更简单的方法呢?用sql批量修改wordpress文章发布时间怎么操作呢? UPDATE `wp_posts` SET ...

  3. iphone传照片还是用QQ比较好

    之前设置相机格式为高效,通过用91助手的苹果助手导出来文件格式为HEIC,window下没法打开.网上介绍用微信传,发现传的是缩略图,不清楚.最后选择通过qq传比较高清.注意,如果从相册中进行选择的话 ...

  4. [vue]计算和侦听属性(computed&watch)

    先看一下计算属性 vue只有data区的数据才具备响应式的功能. 计算和侦听属性 - v-text里可以写一些逻辑 <div id="example"> {{ mess ...

  5. [LeetCode] 438. Find All Anagrams in a String_Easy

    438. Find All Anagrams in a String DescriptionHintsSubmissionsDiscussSolution   Pick One Given a str ...

  6. iOS开发--底部按钮和应用图标显示未读消息

    我们要实现的效果如下: 我们使用系统自带的,实际上,代码量很少,在我们要显示的按钮上,打上下面一句代码即可: self.tabBarItem.badgeValue = @"1"; ...

  7. TraceSource记录程序日志

    1.配置文件 <system.diagnostics> <sources> <source name="TraceError" switchValue ...

  8. 【介绍+安装】Nginx的介绍和安装详解

    == 介绍和安装 == Nginx是一个自由.开源.高性能及轻量级的HTTP服务器及反转代理服务器, 其性能与IMAP/POP3代理服务器相当.Nginx以其高性能.稳定.功能丰富.配置简单及占用系统 ...

  9. linux centos系统下升级python版本

    本文参考资料:https://www.cnblogs.com/leon-zyl/p/8422699.html,https://blog.csdn.net/tpc1990519/article/deta ...

  10. 史上最全的HTML和CSS标签常用命名规则

    文件夹主要建立以下文件夹: 1.Images 存放一些网站常用的图片: 2.Css 存放一些CSS文件: 3.Flash 存放一些Flash文件: 4.PSD 存放一些PSD源文件: 5.Temp 存 ...