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实现相关推荐

  1. 深入浅出Viterbi算法与python实现

    Viterbi动态规划算法 参考文章https://www.zhihu.com/question/20136144   我们以上图为例讲解从阶段1到阶段3的最短路径.首先如果按照贪婪算法,我们一共需要 ...

  2. viterbi算法实例及python实现

    Python中hmmlearn给出了三种HMM模型:MultiomialHMM,GaussianHMM,GMMHMM.本文以MultiomialHMM为例,使用<从机器学习到深度学习>中第 ...

  3. 隐马尔科夫模型 Viterbi算法 Python实现

    已知初始状态概率向量 pi,状态转移概率矩阵 P,发射概率矩阵 B,求观察序列为 O 的条件下状态序列为 Q 的概率.代码如下: def HMM_ProCond(pi, P, B, Q, O):Q, ...

  4. 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 如何求解归 ...

  5. 隐马尔可夫HMM中viterbi算法

    引言 viterbi算法简化最有可能的天气序列的运算过程,forward算法简化该该观察值的概率. 问题描述 你在中国,你朋友F在美国,F的作息有walk, shop, clean,但这选择跟天气有关 ...

  6. 隐马尔可夫模型中的Viterbi算法zz

    隐马尔可夫模型中的Viterbi算法zz 这篇文章简单描述一下Viterbi算法--一年之前我听过它的名字,直到两周之前才花了一点时间研究了个皮毛,在这里做个简单检讨.先用一句话来简单描述一下:给出一 ...

  7. 隐马尔可夫模型(HMM)及Viterbi算法

    HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引入该模型 ...

  8. 【机器学习】隐马尔可夫模型及其三个基本问题(四)状态序列预测算法及python实现

    [机器学习]隐马尔可夫模型及其三个基本问题(四)状态序列预测算法及python实现 一.维特比算法 二.python实现 参考资料 隐马尔可夫模型状态序列预测问题是指给定模型 λ=[A,B,∏]\la ...

  9. 基于Hmm模型和Viterbi算法的中文分词和词性标注

    使用 python 实现基于Hmm模型和Viterbi算法的中文分词及词性标注:使用 最大概率算法 进行优化.最终效果:人民日报语料:分词(F1:96.189%):词性标注(F1:97.934%) 完 ...

最新文章

  1. vue.js----之router详解(三)
  2. 儿童学python编程入门用途-干货 | 看了此文,家长就知道为啥要让孩子学Python?...
  3. python游戏脚本实例-python实现的简单文本类游戏实例
  4. CrazyWing:Python自动化运维开发实战 四、Python变量
  5. C#-几个STL相关
  6. 安卓开发之Intent系统调用系统相机Camera(中软杯项目)
  7. (WebKit) ViewPort + Backing Store + Page Content
  8. 汇编[bx+idata](8086)
  9. python 西门子交换机_python读取交换机
  10. python日志,支持彩色打印和文件大小切片写入和写入mongodb
  11. .NET设计模式(1):1.1 单例模式(Singleton Pattern)
  12. Qt翻译文件(.ts)的使用
  13. vultarget-a红日靶场全面解析(完整版)
  14. iOS集成EasyAR实现虚拟现实
  15. 电源设计基础笔记:DC-DC与LDO电路
  16. 架构 - 单点登录 - Springboot 模拟单点登录
  17. Linux中PAM模块详解
  18. android 打开系统键盘的方法
  19. java bll dal_实体框架DAL,BLL与存储库模式
  20. Windows证书管理

热门文章

  1. 手把手教你读财报----银行业---第十四课
  2. Android Studio 3.6 稳定版发布,你用上了吗?
  3. 神舟战神笔记本Controlcenter3.0安装教程,解决osd only
  4. Commonly Used Afx Functions
  5. 用c语言做判断题题库及答案,河南工业大学C语言题库判断题
  6. python 做软件授权代理_软件提卡+授权API+代理系统三合一网站源码(开源)
  7. PHP如何接入医疗HIS系统发送短信
  8. 南昌大学 计算机专业,考研:计算机专业选深圳大学和南昌大学?老师给出一个实用建议...
  9. JS 实现百度搜索功能
  10. ​Win10更新清理怎么做?