前言

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

什么是维特比算法?

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

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

状态 健康 发烧
健康 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. web前端开发笔记(1)

     一.HTML标签书写有哪些规范? 页面编码. 文档声明. 关键字与描述. 行内元素不能包含块级元素. a标签不能嵌套a标签. 标签名和属性必须用小写字母书写,属性必须加引号,标签必须闭合,单标签页必 ...

  2. IRC and security tools

    login:::   /msg NickServ identify <password>. join:::   /join #metasploit 浏览器: Tor操作系统: Tails加 ...

  3. iOS多线程编程之多线程简单介绍(转载)

    一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“ ...

  4. Time Profiler Instrument分析卡顿

    https://www.jianshu.com/p/080108c969e8 启动Time Profile:Xcode ——> Product ——> Profile ——> Tim ...

  5. PL/SQL类的应用

    类的定义 直接声明字段类型‘VARCHAR2或NUMBER等’ declare type kingsql_tp1 is record(empno number,ename varchar2(100)) ...

  6. Java中的反射机制(一)

    基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...

  7. C++三大特性之封装

    原文地址:https://qunxinghu.github.io/2016/09/12/C++%20%E4%B8%89%E5%A4%A7%E7%89%B9%E6%80%A7%E4%B9%8B%E5%B ...

  8. libevent 网络IO分析

    libevent 网络IO分析 Table of Contents 1. 简介 2. 简单使用与入门 2.1. 定时器-timeout 超时回调 2.2. 信号事件 2.3. 读取 socket 3. ...

  9. html 1:1比例显示

    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale= ...

  10. Shell初学(二)变量及数组

    精简版: 定义:your_name=123      PS:=符号左右不能有空格! 使用:${your_name},单独使用变量时可以不加{} 只读:readonly your_name  PS:设置 ...