维特比算法(Viterbi)-实例讲解(暴力破解+代码实现)
1、简介
维特比算法是一个通用的求序列最短路径的动态规划算法,也可以用于很多其他问题,比如:文本挖掘、分词原理。既然是动态规划算法,那么就需要找到合适的局部状态,以及局部状态的递推公式。在HMM中,维特比算法定义了两个局部状态用于递推。
第一个局部状态是在时刻i隐藏状态为i所有可能的状态转移路径i1,i2.......it中的最大概率
第二个局部状态由第一个局部状态递推得到。
2、算法详解
(1)从点S出发,对于第一个状态X1的各个节点,不妨假定有n1个,计算出S到它们的距离d(S,X1i),其中X1i代表任意状态1的节点。因为只有一步,所以这些距离都是S到它们各自的最短距离。
(2)对于第二个状态X2的所有节点,要计算出从S到它们的最短距离。对于特点的节点X2i,从S到它的路径可以经过状态1的n1中任何一个节点X1i,对应的路径长度就是d(S,X2i) = d(S,X1i) + d(X1i,X2i)。
由于i有n1种可能性,我们要一 一计算,找出最小值。即:d(S,X2i) min =d(S,X1i) + {d(X1i,X2i)}1→n1这样对于第二个状态的每个节点,需要n1次乘法计算。假定这个状态有n2个节点,把S这些节点的距离都算一遍,就有O(n1·n2)次计算。
(3)接下来,类似地按照上述方法从第二个状态走到第三个状态,一直走到最后一个状态,就得到了整个网格从头到尾的最短路径。
(4)假设这个隐含马尔可夫链中节点最多的状态有D个节点,也就是说整个网格的宽度为D,那么任何一步的复杂度不超过O(D2),由于网格长度是N,所以整个维特比算法的复杂度是O(N·D2)。
3、实例展示
(1)天气只有三类(Sunny,Cloudy,Rainy),海藻湿度有四类{Dry,Dryish, Damp,Soggy },而且海藻湿度和天气有一定的关系。
(2)隐藏的状态:Sunny, Cloudy, Rainy;
(3)观察状态序列:{Dry, Damp, Soggy}
(4)初始状态序列:
(5)状态转移矩阵:
(6)发射矩阵:
假设连续观察3天的海藻湿度为(Dry,Damp,Soggy),求这三天最可能的天气情况。
1、暴力破解:
前提:第二天的情况只和第一天的天气有关,第三天的天气只和第二天的天气有关。
所以第一天湿度为Dry的情况为:
P(Dry|day1-Sunny)=0.63*0.6
P(Dry|day1-Cloudy)=0.17*0.25
P(Dry|day1-Rainy)=0.2*0.05
P(Dry|day1-Suny)的概率最大,所以第一天最大概率为:Sunny
第二天湿度为Damp的情况为:
P(Damp|day2-Sunny)=max{P(Dry|day1-Sunny)*0.5,P(Dry|day1-Cloudy)*0.25,P(Dry|day1-Rainy)*0.25}*0.15
P(Damp|day2-Cloudy)=max{P(Dry|day1-Sunny)*0.375,P(Dry|day1-Cloudy)*0.125,P(Dry|day1-Rainy)*0.625}*0.25
P(Damp|day2-Rainy)=max{P(Dry|day1-Sunny)*0.125,P(Dry|day1-Cloudy)*0.625,P(Dry|day1-Rainy)*0.35}*0.35
P(Damp|day2-Cloud)概率最大,所以第二天最大概率为:Cloud
第三天湿度为Soggy的情况为:
P(Soggy|day3-Sunny)=max{P(Damp|day2-Sunny)*0.5,P(Damp|day2-Cloudy)*0.25,P(Damp|day2-Rainy)*0.25}*0.05
P(Soggy|day3-Cloudy)=max{P(Damp|day2-Sunny)*0.375,P(Damp|day2-Cloudy)*0.125,P(Damp|day2-Rainy)*0.625}*0.25
P(Soggy|day3-Rainy)=max{P(Damp|day2-Sunny)*0.125,P(Damp|day2-Cloudy)*0.625,P(Damp|day2-Rainy)*0.375}*0.5
P(Soggy|day3-Rainy)概率最大,所以第三天最大概率为:Rainy
所以3天的天气最大概率为{Sunny,Cloud,Rainy}
分析:
第一天:对应每种天气下湿度为Dry放入最大概率则为可能的天气;
第二天:对应第一天的各种天气分别转换Sunny,且转换的概率最大的情况下,取天气湿度为Damp的概率,Cloudy和Rainy同理,然后取这三种天气下概率最大的天气
第三天:对应第二天的各种天气分别转换Sunny(注意这里第二天对应第一天,已经得到最大概率)且转换的概率最大的情况下,取天气湿度为Damp的概率,Cloudy和Rainy同理,然后取这三种天气下概率最大的天气
2、python代码实现:
#-*- coding:utf-8 -*-
import numpy as np
def viterbi(trainsition_probability,emission_probability,pi,obs_seq): #转换为矩阵进行计算
trainsition_probability=np.array(trainsition_probability)
emission_probability=np.array(emission_probability)
pi=np.array(pi) #定义要返回的矩阵
F = np.zeros((Row, Col)) #初始状态
F[:,0]=pi*np.transpose(emission_probability[:,obs_seq[0]]) for t in range(1,Col):
list_max=[]
for n in range(Row):
list_x=list(np.array(F[:,t-1])*np.transpose(trainsition_probability[:,n])) #获取最大概率
list_p=[]
for i in list_x:
list_p.append(i*10000)
list_max.append(max(list_p)/10000) F[:, t] = np.array(list_max) * np.transpose(emission_probability[:,obs_seq[t]]) return F if __name__ == '__main__':
#隐藏状态
invisible=['Sunny','Cloud','Rainy']
#初始状态
pi=[0.63,0.17,0.20]
#转移矩阵
trainsition_probability=[[0.5,0.375,0.125],
[0.25,0.125,0.625],
[0.25,0.375,0.375]]
#发射矩阵
emission_probability=[[0.6,0.2,0.15,0.05],
[0.25,0.25,0.25,0.25],
[0.05,0.10,0.35,0.5]]
#最后显示状态
obs_seq=[0,2,3] #最后返回一个Row*Col的矩阵结果
Row = np.array(trainsition_probability).shape[0]
Col = len(obs_seq) F=viterbi(trainsition_probability, emission_probability, pi, obs_seq) print F
结果:
[[ 0.378 0.02835 0.00070875]
[ 0.0425 0.0354375 0.00265781]
[ 0.01 0.0165375 0.01107422]]
每列代表Dry,Damp,Soggy的概率,每行代表Sunny,Cloud,Rainy,所以可以看出最大概率的天气为{Sunny,Cloud,Rainy}。
维特比算法(Viterbi)-实例讲解(暴力破解+代码实现)的更多相关文章
- 隐型马尔科夫模型(HMM)向前算法实例讲解(暴力求解+代码实现)---盒子模型
先来解释一下HMM的向前算法: 前向后向算法是前向算法和后向算法的统称,这两个算法都可以用来求HMM观测序列的概率.我们先来看看前向算法是如何求解这个问题的. 前向算法本质上属于动态规划的算法,也就是 ...
- HMM——维特比算法(Viterbi algorithm)
1. 前言维特比算法针对HMM第三个问题,即解码或者预测问题,寻找最可能的隐藏状态序列: 对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列,找到生成此序列最可能的隐藏状态序列. 也就是说给定 ...
- 【机器学习】【条件随机场CRF-2】CRF的预测算法之维特比算法(viterbi alg) 详解 + 示例讲解 + Python实现
1.CRF的预测算法条件随机场的预测算法是给定条件随机场P(Y|X)和输入序列(观测序列)x,求条件概率最大的输出序列(标记序列)y*,即对观测序列进行标注.条件随机场的预测算法是著名的维特比算法(V ...
- 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列
隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态 ...
- 维特比算法Python实现
前言 维特比算法是隐马尔科夫问题的一个基本问题算法.维特比算法解决的问题是已知观察序列,求最可能的标注序列. 什么是维特比算法? 维特比算法尽管是基于严格的数学模型的算法,但是维特比算法毕竟是算法,因 ...
- Java实现:抛开jieba等工具,写HMM+维特比算法进行词性标注
一.前言:词性标注 二.经典维特比算法(Viterbi) 三.算法实现 四.完整代码 五.效果演示: 六.总结 一.前言:词性标注 词性标注(Part-Of-Speech tagging, POS t ...
- (转)使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解
使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解 本文用代码简单介绍cjson的使用方法,1)创建json,从json中获取数据.2)创建json数组和解析json数组 1. 创 ...
- 维特比算法(Viterbi)
维特比算法(Viterbi) 维特比算法 编辑 维特比算法是一种动态规划算法用于寻找最有可能产生观测事件序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中.术语“维特比路 ...
- Viterbi(维特比)算法在CRF(条件随机场)中是如何起作用的?
之前我们介绍过BERT+CRF来进行命名实体识别,并对其中的BERT和CRF的概念和作用做了相关的介绍,然对于CRF中的最优的标签序列的计算原理,我们只提到了维特比算法,并没有做进一步的解释,本文将对 ...
随机推荐
- Windows 下安装mysql总结
1.配置环境变量 将安装目录添加到系统路径 我的电脑->属性->高级->环境变量->path 2.修改my.ini 位于解压安装目录下 在其中修改或添加配置: [mysqld] ...
- 记一次web服务模块开发过程
一.前言 之前在分析WCS系统的过程中,也赶上要开发其中的一个模块,用于和AGV系统对接完成一些取货.配盘等任务:在这里将这次模块开发的全过程记录一下,以便自己以后开发时能够更加快速的明白流程. 二. ...
- #include 和 #import 的区别, @class 的含义
#import 和 #include 会包含这个类的所有信息,包括实体变量和方法 而#include比起 #import的好处不会引起重复包含 @class是用来做类引用的 @class就是告诉编译 ...
- (字符串处理)Fang Fang -- hdu -- 5455 (2015 ACM/ICPC Asia Regional Shenyang Online)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=5455 Fang Fang Time Limit: 1500/1000 MS (Java/Others) ...
- (网络流) Sabotage -- UVA -- 10480
链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#problem/J 代码: #include<cstdio> ...
- Tmux与Oh-my-zsh环境整合
在Mac客户端配置好oh-my-zsh后,安装了tmux应用,但是每次进入tmux都会提示以下警告信息,虽然并没有实际上的影响,但是还是感觉每次弹出窗口后会很闹心,所以采用如下配置进行解决. 报错 ...
- 自适应XAML布局经验总结 (一)原则和页面结构设计
XAML布局回顾 Grid和StackPanel是核心布局,尤其以Grid最为重要. Grid是网格布局,XAML的设计者有可能参考了Html里的Table设计了Grid布局,但进行了改进.Html中 ...
- linux系统编程之文件与IO(六):实现ls -l功能
本文利用以下系统调用实现ls -l命令的功能: 1,lstat:获得文件状态, 2,getpwuid: #include <pwd.h> struct passwd *getpwuid(u ...
- cmd命令使用笔记
使用资源管理器打开当前路径 explorer %cd%
- Keil下Debug随笔
很多时候我们需要通过硬件仿真来调试程序,在仿真时有时候会遇到这样的情况,那就是选择全速运行时,我们的全局变量无法随时更新,而在那设一个断点后发现值是变化的,那么为什么会出现这种情况呢,那就是可能是我们 ...