一、viterbi算法的用途

在自然语言的工程实践中,viterbi算法常常被用来寻找最可能的隐藏状态序列。如,序列标注任务就需要用到viterbi算法。

二、viterbi求最优路径

李航老师《统计机器学习》有如下例题:

用viterbi算法解决上述例题的推理过程如下:

三、viterbi算法的实现

#!/usr/bin/python3
# -*- coding:utf-8 -*-"""
@Author  : heyw
@Time    : 2020/1/30 16:22
@Software: PyCharm
@File    : viterbi.py
"""
import  numpy as npdef viterbi(invisible, transition_prob, emission_prob, pi, obs_seq):# 转换为numpy形式transition_prob=np.array(transition_prob)emission_prob=np.array(emission_prob)pi=np.array(pi)# 计算路径矩阵的行数和列数row_num = np.array(transition_prob).shape[0]col_num = len(obs_seq)# 定义路径矩path_matrix = np.zeros((row_num,col_num))# 定义回溯矩阵back_matrix = np.zeros((row_num,col_num))# 初始状态path_matrix[:,0]=pi*np.transpose(emission_prob[:,obs_seq[0]])for t in range(1,col_num):list_max=[]for j in range(row_num):list_a = list(np.array(path_matrix[:,t-1]) * np.transpose(transition_prob[:,j]))list_max.append(max(list_a))back_matrix[j,t] = np.argmax(list_a)path_matrix[:,t] = np.array(list_max) * np.transpose(emission_prob[:,obs_seq[t]])def decode():back_path = []# 回溯隐藏序列末尾结点back_path.append(np.argmax(path_matrix[:, t]))# 依次回溯其他结点for idx in range(col_num - 1, 0, -1):back_path.append(int(back_matrix[back_path[-1], idx]))# 隐藏序列逆序back_path.reverse()# 隐藏序列映射back_path = [invisible[id] for id in back_path]return back_pathhidden_seq = decode()return hidden_seqif __name__=='__main__':# 隐藏状态种类invisible = {0:'A1',  # 盒子A11:'A2',  # 盒子A22:'A3'   # 盒子A3}# 初始状态pi = [0.2, 0.4, 0.4]# 转移矩阵transition_prob = [[0.5, 0.2, 0.3],[0.3, 0.5, 0.2],[0.2, 0.3, 0.5]]# 发射矩阵emission_prob = [[0.5, 0.5],[0.4, 0.6],[0.7, 0.3]]# 观察序列obs_seq = [0 ,1, 0]# 计算隐藏序列hidden_seq = viterbi(invisible, transition_prob, emission_prob, pi, obs_seq)print("隐藏序列:", hidden_seq)
隐藏序列: ['A3', 'A3', 'A3']

数据结构与算法:一图弄懂维特比viterbi算法相关推荐

  1. 一张图弄懂java线程的状态和生命周期

    转载自 一张图弄懂java线程的状态和生命周期 上图是一个线程的生命周期状态流转图,很清楚的描绘了一个线程从创建到终止的过程. 这些状态的枚举值都定义在java.lang.Thread.State下 ...

  2. 写日历的程序员,你必须弄懂的中国农历算法。

    写日历的程序员,你必须弄懂的中国农历算法. NANSHAN即时通讯,我们知道农历通过置闰月的方式协调农历年和回归年长度不相等的问题,也知道了置闰的方法是"中气置闰"法,那么到底什么 ...

  3. 人工智能里的数学修炼 | 隐马尔可夫模型 : 维特比(Viterbi)算法解码隐藏状态序列

    人工智能里的数学修炼 | 概率图模型 : 隐马尔可夫模型 人工智能里的数学修炼 | 隐马尔可夫模型:前向后向算法 人工智能里的数学修炼 | 隐马尔可夫模型 : 维特比(Viterbi)算法解码隐藏状态 ...

  4. 三幅图弄懂EventBus核心原理

    前言 好多分析EventBus的文章,喜欢上来就贴源码,我看了好多次总是迷迷糊糊的,这次花时间彻底整理一下EventBus,发现EventBus核心其实就是三幅图,这三幅图涉及的是三个HashMap表 ...

  5. 彻底弄懂LSH之simHash算法

    马克·吐温曾经说过,所谓经典小说,就是指很多人希望读过,但很少人真正花时间去读的小说.这种说法同样适用于"经典"的计算机书籍. 最近一直在看LSH,不过由于matlab基础比较差, ...

  6. 机器学习知识点(二十四)隐马尔可夫模型HMM维特比Viterbi算法Java实现

    1.隐马尔可夫模型HMM    学习算法,看中文不如看英文,中文喜欢描述的很高深.    http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/ht ...

  7. 自然语言处理之维特比(Viterbi)算法

    维特比算法 (Viterbi algorithm) 是机器学习中应用非常广泛的动态规划算法,在求解隐马尔科夫.条件随机场的预测以及seq2seq模型概率计算等问题中均用到了该算法.实际上,维特比算法不 ...

  8. 维特比(Viterbi)算法

    算法思想 维特比(Viterbi)算法属于一种动态规划算法,目标在于寻找最优路径.我个人用得最多就是与BiLSTM+CRF模型的结合,比如命名实体识别.分词等,计算了每个token的归一化概率矩阵和转 ...

  9. viterbi算法_序列比对(十四)——viterbi算法和后验解码的比较

    原创: hxj7 本文比较了viterbi算法求解最可能路径以及后验解码这两种不同的解码方法. 前文<序列比对(十)viterbi算法求解最可能路径>介绍了用viterbi算法求解最可能路 ...

最新文章

  1. MySQL-source报错1064
  2. c语言 图的存储邻接矩阵,数据结构之---C语言实现图的数组(邻接矩阵)存储表示...
  3. python【蓝桥杯vip练习题库】ADV-185五次方数(枚举)
  4. 新一代容器平台ACK Anywhere,来了
  5. 【Matlab】找到矩阵中每个连通域的最小值
  6. 技术干货 | iOS 高阶容器详解
  7. 【最新合集】编译原理习题(含答案)_1 绪论_MOOC慕课 哈工大陈鄞
  8. 程序员自我提高的几点建议 很实诚
  9. 文章发表5天就被举报学术不端,该知名大学迅速处理:停职半年!
  10. 拉取docker官方centos镜像时区不对问题
  11. C语言学习笔记---可变参数
  12. Python学习笔记【第十二篇】:Python异常处理
  13. intelssd在linux固件升级,BUG不再难缠 教会您升级主流SSD固件
  14. 呆萝卜 竞品分析报告
  15. java模拟器安卓7,指小游Java模拟器
  16. ROS编译C++文件过程出现 error: expected unqualified-id before ‘.’ token
  17. java如何做网页_java怎么做一个简单网页?网页包括什么?
  18. 记录win7安装Docker for Windows(DockerToolbox)的一记大坑:wating for an ip....卡死
  19. Pycharm打开Project(工程)时停留在preparing workspace时间过长,导致打开很慢的解决方法...
  20. c语言中双冒号意思_“c#excle的读取“c语言的双冒号是什么意思::

热门文章

  1. 【推荐】Tektronix 泰克示波器DPO3000系列固件升级方法
  2. tflearn入门笔记
  3. 山东大学数据结构课程设计实验五(低风险出行系统)
  4. 配置 Java 开发环境
  5. 创建Maven父子项目及发布到tomat的完整过程
  6. nginx配置错误页面,处理tomat版本号泄露问题
  7. 为什么TCP套接字用四元组标识而UDP是二元组?
  8. WeLink协作文档,职场的贴心助手
  9. Android Service服务不被杀死(保活)
  10. 到底死不死我就请了七天假_“我就请了7天假,你到底死不死啊?”