viterbi 算法与python实现
Viterbi算法
(部分内容转自知乎:《如何通俗地讲解 viterbi 算法?》)
1、问题描述
如下如所示,如何快速找到从 S 到 E 的最短路径?
一:遍历穷举法,可行,但速度太慢;
二:viterbi算法!
注:viterbi 维特比算法解决的是篱笆型图的最短路径问题,图的节点按列组织,每列的节点数量可以不一样,每一列的节点只能和相邻列的节点相连,不能跨列相连,节点之间有着不同的距离,距离的值就不在图上一一标注出来了,大家自行脑补。
2、算法分析
(1)S 到 A 列的最短路径
首先起点是S,从S到A列的路径有三种可能:S-A1、S-A2、S-A3,如下图:
我们不能武断地说S-A1、S-A2、S-A3中的哪一段必定是全局最短路径中的一部分,目前为止任何一段都有可能是全局最短路径的备选项。继续往右看,到了B列,按B列的B1、B2、B3逐个分析。
(2)S 到 B 列的最短路径
先看 B1,经过B1的所有路径只有3条:S-A1-B1,S-A2-B1,S-A3-B1。
这三条路径,各节点距离加起来对比一下,就可以知道其中哪一条是最短的。假设S-A3-B1是最短的,那么我们就知道了经过B1的所有路径当中S-A3-B1是最短的,其它两条路径路径S-A1-B1和S-A2-B1都比S-A3-B1长,绝对不是目标答案,可以大胆地删掉了。删掉了不可能是答案的路径,就是viterbi算法(维特比算法)的重点,因为后面我们再也不用考虑这些被删掉的路径了。现在经过B1的所有路径只剩一条路径了,如下图:
接下来我们继续看B2,同理,经过B2的路径有3条:S-A1-B2,S-A2-B2,S-A3-B2。
这三条路径中,各节点距离加起来对比一下,肯定也可以知道其中哪一条是最短的,其它两条路径路径S-A2-B2和S-A3-B1也可以删掉了。经过B2所有路径只剩一条,如下图:
接下来我们继续看B3,同理,经过B3的路径也有3条:S-A1-B3,S-A2-B3,S-A3-B3。
这三条路径中我们也肯定可以算出其中哪一条是最短的,假设S-A2-B3是最短的,那么我们就知道了经过B3的所有路径当中S-A2-B3是最短的,其它两条路径路径S-A1-B3和S-A3-B3也可以删掉了。经过B3的所有路径只剩一条,如下图:
现在对于B列的所有节点我们都过了一遍,B列的每个节点我们都删除了一些不可能是答案的路径,删掉这些不可能是最短路径的情况之后,留下了三个有可能是最短的路径:S-A3-B1、S-A1-B2、S-A2-B3。现在我们将这三条备选的路径放在一起汇总到下图:
(3)S 到 C 列的最短路径
类似上面说的B列,我们从C1、C2、C3一个个节点分析。
经过C1节点的路径有:S-A3-B1-C1、S-A1-B2-C1、S-A2-B3-C1。
和B列的做法一样,从这三条路径中找到最短的那条(假定是S-A3-B1-C1),其它两条路径同样道理可以删掉了。那么经过C1的所有路径只剩一条,如下图:
同理,我们可以找到经过C2和C3节点的最短路径,汇总一下:
到达C列时最终也只剩3条备选的最短路径,我们仍然没有足够信息断定哪条才是全局最短。最后,我们继续看E节点,才能得出最后的结论。
(4)S 到 E 的最短路径
到E的路径也只有3种可能性:
E点已经是终点了,我们稍微对比一下这三条路径的总长度就能知道哪条是最短路径了。
在效率方面相对于粗暴地遍历所有路径,viterbi 维特比算法到达每一列的时候都会删除不符合最短路径要求的路径,大大降低时间复杂度。
(以上所有内容转自知乎《如何通俗地讲解 viterbi 算法?》,如有侵权请联系我删除!)
3、python实现
上述问题只涉及节点之间的距离,这里我们假设每个节点本身有一个状态,节点与节点之间的距离用权重表示。为了简化描述和编程方便,将 S 到 A 列的权重全部置为1,C 列到 E 的权重也全部置为1,只考虑A、B、C三列。
用矩阵 state
表示节点的状态,(d, n)=state.shape
,d 就表示每一层节点的数量,n 表示总层数。
用矩阵 weight
表示相邻层之间的路径距离,n 层就有 n-1 个权重矩阵,weight[k][i][j]
表示第 k-1 层的节点 i 到第 k 层的节点 j 之间的距离。
import numpy as npstate = [[0.9, 0.1, 0.3],[0.1, 0.8, 0.4],[0.0, 0.1, 0.3]]
weight = [[[0.1, 0.4, 0.5], [0.2, 0.7, 0.1], [0.9, 0.0, 0.1]],[[0.8, 0.1, 0.1], [0.4, 0.3, 0.3], [0.1, 0.2, 0.7]]]def viterbi(state, weight):''':param state: 状态矩阵:param weight: 权重矩阵:return:'''state = np.array(state)weight = np.array(weight)d, n = state.shapeassert weight.shape == (n - 1, d, d), 'state not match path!'# 路径矩阵,元素值表示当前节点从前一层的那一个节点过来是最优的path = np.zeros(shape=(d, n))for i in range(n):print(f'进入第 {i} 层')if i == 0:path[:, i] = np.array(range(d)) + 1print('')continuefor j in range(d):print(f'更新节点 ({j}, {i}) 的状态')temp = state[:, i - 1] * weight[i - 1, :, j]temp_max = max(temp)temp_index = np.where(temp == temp_max)path[j, i] = temp_index[0] + 1state[j, i] = max(temp) * state[j, i]print('')print(state)print(path)if __name__ == '__main__':viterbi(state, weight)
viterbi 算法与python实现相关推荐
- 深入浅出Viterbi算法与python实现
Viterbi动态规划算法 参考文章https://www.zhihu.com/question/20136144 我们以上图为例讲解从阶段1到阶段3的最短路径.首先如果按照贪婪算法,我们一共需要 ...
- viterbi算法实例及python实现
Python中hmmlearn给出了三种HMM模型:MultiomialHMM,GaussianHMM,GMMHMM.本文以MultiomialHMM为例,使用<从机器学习到深度学习>中第 ...
- 隐马尔科夫模型 Viterbi算法 Python实现
已知初始状态概率向量 pi,状态转移概率矩阵 P,发射概率矩阵 B,求观察序列为 O 的条件下状态序列为 Q 的概率.代码如下: def HMM_ProCond(pi, P, B, Q, O):Q, ...
- BiLSTM, CRF,BiLSTM+CRF原理讲解以及viterbi算法python实现
目录 1 训练数据 2 模型结构 2.1 BiLSTM 2.1.1 结构 2.1.2 预测 2.1.3 缺点 2.2 CRF 2.2.1 基础概念 2.2.2 如何计算特征函数 2.2.3 如何求解归 ...
- 隐马尔可夫HMM中viterbi算法
引言 viterbi算法简化最有可能的天气序列的运算过程,forward算法简化该该观察值的概率. 问题描述 你在中国,你朋友F在美国,F的作息有walk, shop, clean,但这选择跟天气有关 ...
- 隐马尔可夫模型中的Viterbi算法zz
隐马尔可夫模型中的Viterbi算法zz 这篇文章简单描述一下Viterbi算法--一年之前我听过它的名字,直到两周之前才花了一点时间研究了个皮毛,在这里做个简单检讨.先用一句话来简单描述一下:给出一 ...
- 隐马尔可夫模型(HMM)及Viterbi算法
HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引入该模型 ...
- 【机器学习】隐马尔可夫模型及其三个基本问题(四)状态序列预测算法及python实现
[机器学习]隐马尔可夫模型及其三个基本问题(四)状态序列预测算法及python实现 一.维特比算法 二.python实现 参考资料 隐马尔可夫模型状态序列预测问题是指给定模型 λ=[A,B,∏]\la ...
- 基于Hmm模型和Viterbi算法的中文分词和词性标注
使用 python 实现基于Hmm模型和Viterbi算法的中文分词及词性标注:使用 最大概率算法 进行优化.最终效果:人民日报语料:分词(F1:96.189%):词性标注(F1:97.934%) 完 ...
最新文章
- vue.js----之router详解(三)
- 儿童学python编程入门用途-干货 | 看了此文,家长就知道为啥要让孩子学Python?...
- python游戏脚本实例-python实现的简单文本类游戏实例
- CrazyWing:Python自动化运维开发实战 四、Python变量
- C#-几个STL相关
- 安卓开发之Intent系统调用系统相机Camera(中软杯项目)
- (WebKit) ViewPort + Backing Store + Page Content
- 汇编[bx+idata](8086)
- python 西门子交换机_python读取交换机
- python日志,支持彩色打印和文件大小切片写入和写入mongodb
- .NET设计模式(1):1.1 单例模式(Singleton Pattern)
- Qt翻译文件(.ts)的使用
- vultarget-a红日靶场全面解析(完整版)
- iOS集成EasyAR实现虚拟现实
- 电源设计基础笔记:DC-DC与LDO电路
- 架构 - 单点登录 - Springboot 模拟单点登录
- Linux中PAM模块详解
- android 打开系统键盘的方法
- java bll dal_实体框架DAL,BLL与存储库模式
- Windows证书管理
热门文章
- 手把手教你读财报----银行业---第十四课
- Android Studio 3.6 稳定版发布,你用上了吗?
- 神舟战神笔记本Controlcenter3.0安装教程,解决osd only
- Commonly Used Afx Functions
- 用c语言做判断题题库及答案,河南工业大学C语言题库判断题
- python 做软件授权代理_软件提卡+授权API+代理系统三合一网站源码(开源)
- PHP如何接入医疗HIS系统发送短信
- 南昌大学 计算机专业,考研:计算机专业选深圳大学和南昌大学?老师给出一个实用建议...
- JS 实现百度搜索功能
- ​Win10更新清理怎么做?