维特比算法( viterbi)
本文的内容大多来自李航的《统计学习方法》
点击此处下载书籍
这篇文章就是想以通俗易懂的方式解析维特比算法,最后用python代码实现。
算法原理
原理显而易见是求动态规划问题:
- 找出每个时刻概率最大的路径
- 将路径上的每个结点连接起来得到最优路径
- 根据观测求出每个时刻最有可能的状态
算法思路
- 初始化:t = 1时刻分别求出N个状态下产生观测变量1的概率。
- 递推:当t和i不变时j = 1,2,3,…,N是分别求出t - 1时刻所有可能的状态,转移到t时刻状态i的概率。max是求最大值,就是在t-1时刻各个状态转移到t时刻状态 i 的最大概率,最后乘以观测概率就是t状态 i 最有可能产生观测变量 t 的概率。argmax是求在t-1时刻的状态最有可能转移到 t 时刻的状态 i 。如果想求出t - 1时刻的所有可能状态转移到 t 时刻所有可能状态的最大概率,则在(2)的式子最外层再增加一个循环i = 1,2,3,…,N。如果想求出各个时刻最有可能的状态,则在(2)的式子最外层增加一个循环t = 2,3,4,…,T。
- 终止
- 最优路径回溯:根据t = T时刻最有可能的状态反向推出t = T - 1, t = T - 1,…,2,1时刻最有可能的状态。
实现
#@author: James_Bobo
#date: 2019/10/18
'''
Input:A = mat([[0.5, 0.2, 0.3],[0.3, 0.5, 0.2],[0.2, 0.3, 0.5]])B = mat([[0.5, 0.5],[0.4, 0.6],[0.7, 0.3]])PI = mat([[0.2],[0.4],[0.4]])O = mat([[0],[1],[0]])
'''
import numpy as np
from numpy import *
import mathdef viterbi(A, B, PI, O):N = shape(A)[0]I = mat(zeros((N, 1)))T = Nsigma = mat(zeros((N, N)))omiga = mat(ones((N, N)))index = 0for i in range(N):if(O[0, 0] == 0):index = 0else:index = 1sigma[0, i] = PI[i, 0] * B[i, index]t = 1while(t < T):for i in range(N):sigma_temp = mat(zeros((N, 1)))for j in range(N):sigma_temp[j, 0] = sigma[t - 1, j] * A[j, i]max_value = sigma_temp.max(axis = 0)if(O[t, 0] == 0):index = 0else:index = 1sigma[t, i] = max_value[0, 0] * B[i, index]omiga[t, i] = sigma_temp.argmax() + 1t += 1P = sigma[N - 1, :].max()I[T -1, 0] = sigma[N - 1, :].argmax() + 1t = T - 2print(omiga)while(t >= 0):index = int(I[t + 1, 0] - 1)I[t, 0] = omiga[t + 1, index]t -= 1return Iif __name__ == "__main__":A = mat([[0.5, 0.2, 0.3],[0.3, 0.5, 0.2],[0.2, 0.3, 0.5]])B = mat([[0.5, 0.5],[0.4, 0.6],[0.7, 0.3]])PI = mat([[0.2],[0.4],[0.4]])O = mat([[0],[1],[0]])I = viterbi(A, B, PI, O)print("I",I)
维特比算法( viterbi)相关推荐
- HMM——维特比算法(Viterbi algorithm)
1. 前言 维特比算法针对HMM第三个问题,即解码或者预测问题,寻找最可能的隐藏状态序列: 对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列,找到生成此序列最可能的隐藏状态序列. 也就是说给 ...
- 语音识别学习日志 2019-7-17 语音识别基础知识准备6 {维特比算法(Viterbi Algorithm)}
HMM 维特比算法(Viterbi Algorithm)详细解释参考:http://www.52nlp.cn/hmm-learn-best-practices-six-viterbi-algorith ...
- 维特比算法(Viterbi)
维特比算法 (Viterbi algorithm) 是机器学习中应用非常广泛的动态规划算法,在求解隐马尔科夫.条件随机场的预测以及seq2seq模型概率计算等问题中均用到了该算法.实际上,维特比算法不 ...
- 维特比算法(viterbi)原理以及简单实现
维特比算法 看一下维基百科的解释,维特比算法(Viterbi algorithm)是一种动态规划算法.它用于寻找最有可能产生观测事件序列的维特比路径--隐含状态序列,特别是在马尔可夫信息源上下文和隐马 ...
- C语言维特比算法,viterbi维特比算法
维特比算法:使用动态规划,找出最短路径 以下以图的形式来解释: 图的节点按列组织,每列的节点数量可以不一样,每一列的节点只能和相邻列的节点相连,不能跨列相连,节点之间有着不同的距离,距离的值就不在图上 ...
- 维特比算法Viterbi Algorithm
1.简介 维特比算法是一个特殊但应用最广的动态规划算法,它是针对篱笆网络的有向图(Lattice)的最短路径问题而提出的.凡是使用隐含马尔可夫模型描述的问题都可以用维特比算法来解码,包括今天的数 ...
- 机器学习:维特比算法(Viterbi Algorithm)
一.维特比算法(Viterbi Algorithm)讲解方式01:篱笆网络(Lattice)的最短路径问题 已知下图的篱笆网络,每个节点之间的数字表示相邻节点之间的距离,举个例子来说,如果我走,这个距 ...
- em算法怎么对应原有分类_[PRML]序列数据 HMM维特比算法及扩展
序列数据相关文章:1.马尔可夫模型2.隐马尔可夫模型简介3.HMM最大似然4.HMM前向后向算法5.HMM和积算法与尺度因子 1 维特比算法 在隐马尔可夫模型的许多应用中,潜变量有一些有意义的解释,因 ...
- NLP-基础任务-中文分词算法(2)-基于词典:基于N-gram语言模型的分词算法【基于词典的分词方法】【利用维特比算法求解最优路径】【比机械分词精度高】【OOV:基于现有词典,不能进行新词发现处理】
例子:"经常有意见分歧" 词典:["经常","有","意见","意","见",& ...
- 维特比算法 python_HMM-维特比算法理解与实现(python)
解码问题 给定观测序列 \(O=O_1O_2...O_T\),模型 \(\lambda (A,B,\pi)\),找到最可能的状态序列 \(I^∗=\{i^∗_1,i^∗_2,...i^∗_T\}\) ...
最新文章
- N-Case 律师事务所管理系统安装与卸载说明
- e.printStackTrace()会导致锁死?这仅仅是打印,怎么可能?
- 数据库跟尾过多的错误,能够的原因阐发及处置惩罚设备
- 使用js实现放大镜效果
- 关于unix下使用tar的一些常用技巧
- 吐槽今年一级计算机,吐槽大会#辽宁省考#当一个没有情感的计算机器
- 机器学习:Multinoulli分布与多项式分布
- vue读取服务器文件跨域,新版vue-cli模板下本地开发环境使用node服务器跨域的方法...
- 计算机网络—一个自治系统有5个局域网,其连接图如图所示。LAN2至LAN5上的主机数分别为:91,150,3,15。该自治系统分配到的IP地址块为30.138.118/23。试给出每一个局域网的地址块
- 冬小麦病虫害的高光谱识别方法研究
- 使用Typora上传博客到博客园
- 电路板的信号完整性问题及原因
- 如何让C/S应用支持多端(PC、Android、iOS)同时登录?
- 自制麦克纳姆轮遥控小车
- 基于深度学习的图像文字识别技术
- java m个苹果n个篮子_m个苹果放在n个筐里,每个筐至少一个,所有的筐都一样,有多少种放法...
- 那些年,我们关注过的放大电路设计要点
- attributeerror: module 'numpy.random' has no attribute 'randon'
- 第四周项目3单链表应用(2)
- 零和博弈(Zero-Sum Games)与非零和博弈(Non-Zero-Sum Games)
热门文章
- 从0开始学习C#第二天
- SQL server 数据导入导出BCP工具使用详解
- 一个简单的二层系统分析全程
- zend studio 本地调试php,Zend Studio调试php教程
- java实践体会,java实践心得体会范文3篇
- java 状态常量_Java 变量和常量
- 网站开发用什么语言好_兰州网站开发哪家策划效果好
- lua搭建ui_LTUI, 一个基于 lua 的跨平台字符终端 UI 界面库
- linux脚本中sed -i,Linux Shell 脚本之sed命令详解
- 深圳php程序培训班,深圳php编程培训班哪几个好