维特比算法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)及一个相应的观察序列,我们常常希望 ...
 
随机推荐
- 43(function pointer 1)
			
#include<iostream> using namespace std; typedef int A; typedef void (*PF)(); typedef int (*P_A ...
 - python requests模块的两个方法content和text
			
requests模块下有两个获取内容的方法,很奇怪,都是获取请求后内容的方法,有什么区别呢?? 一.区别 content:返回bytes类型的数据也就是二进制数据 text:返回的就是纯文本(Unic ...
 - CH0201 费解的开关 枚举
			
正解:枚举 解题报告: 入门傻逼题,思维难度不高代码量极小,非常适合上手 然后傻逼的我第二次看这道题的时候依然没想到解法:D 没有办法,就想着写个笔记好歹记录一下以后多复习几次就记着了趴qwq 就是, ...
 - 带宽bandwidth,也叫频宽
			
1.两种意义 (1)在数字设备中,带宽通常以bps(bit per second)或bit/s或b/s表示. (2)在模拟设备中,带宽通常以每秒传送周期或赫兹 (Hz)来表示.如传送模拟信号(连续变化 ...
 - 冒泡排序快速版(C)
			
冒泡排序C语言版:在每轮排序中检查时候有元素位置交换,如果无交换,说明数组元素已经有序,无需继续排序 #include <stdio.h> #include <stdlib.h> ...
 - SRM 619
			
easy: 假设每堆石头不全为1,那么每次我们总能取一堆石头分给另外两堆,堆数-1.而且新的局面肯定有一堆的个数大于1. 于是,假设每堆石头数都为1 -> lose.否则的话推断堆数奇偶就可以 ...
 - 下厨房6月26日数据丢失事故总结 MYSQL主分区被rm 命令误删除
			
下厨房6月26日数据丢失事故总结 MYSQL主分区被rm 命令误删除 http://tech.xiachufang.com/?p=18 在6月26日凌晨12点左右,我们在做线上数据库的备库时,误将线上 ...
 - 在centos7下安装svn
			
SVN的安装 yum install subversion 服务端命令 1. svnserver - 控制svn系统服务的启动等 2. svnadmin - 版本库的创建/导出/导入/删除等 3. s ...
 - ID和Name
			
ID和Name都可以用来标识一个标记,Javascript分别有两个方法getElementById和getElementByName来定位Dom节点. 区别如下: 1.我们知道在网页做Post提交时 ...
 - Haproxy启动故障:Starting proxy:cannot bind socke
			
Haproxy启动时提示失败: [ALERT] 146/132210 (3443) : Starting frontend Redis: cannot bind socket [0.0.0.0:637 ...