CSDN博客:皮乾东 
知乎:Htrying 
微博:Htring的微博 
微信公众号:自然语言处理爱好者(ID:NLP_lover) 
文章来自:《数学之美》
Viterbi-Algorithm算法
维特比算法是一个特殊但应用最广的动态规划算法。利用动态规划,可以解决任何一个图中的最短路径问题。而维特比算法是针对一个特殊的图-篱笆网了(Lattice)的有向图最短路径问题而提出来的。它之所以重要,是因为凡是使用隐马尔科夫模型描述的问题都可以用它解码,包括当前的数字通信、语音识别、机器翻译、拼音转汉字、分词等。
背景
假定用户(盲打时)输入的拼音时y1,y2,...,yNy1,y2,...,yN,对应的汉字是x1,x2,...,xNx1,x2,...,xN(虽然真正的输入法产品都是以词作为输入单位的,为了便于说明问题及简单起见,以字为单位来解释维特比算法),那么根据当前介绍的工具:
x1,x2,...,xN=ArgMaxx∈XP(x1,x2,...,xN|y1,y2,...,yN)=ArgMaxx∈X∏Ni=1P(yi|xi)P(xi|xi−1)x1,x2,...,xN=ArgMaxx∈X⁡P(x1,x2,...,xN|y1,y2,...,yN)=ArgMaxx∈X⁡∏i=1NP(yi|xi)P(xi|xi−1) (1)
输入的可见序列为y1,y2,...,yNy1,y2,...,yN,而产生他们的隐含序列是x1,x2,...,xNx1,x2,...,xN。可以用下图描述这样一个过程: 
这是一个相对简单的隐马尔科夫链,没用状态跳跃,也没有自环。P(xi|xi−1)P(xi|xi−1)是状态之间的转移概率,P(yi|xi)P(yi|xi)是每个状态的产生概率。现在,这个马尔科夫链的每个状态的输出是固定,但是每个状态的值可以变化。比如输出读音”zhong”的字可以是”中”、”种“等多个字。我们不妨抽象一点,用符号xijxij表示状态xixi的第jj个可能的值。如果把每个状态按照不同的值展开,就得到下面这个篱笆网络(Lattice):
 
在上图中,每个状态有3个或4个值,当然时间中它们可以有任意个值。
那么从第一个状态到最后一个状态的任何一条路径(Path)都可能产生我们观察到的输出序列Y。当然这些路径的可能性不一样,而我们要做的就是找到最可能的这条路径,并不是很难。但麻烦的是这样的路径组合数非常多,会让序列状态数的增长呈指数式增长。汉语中每个无声调的拼音对应13个左右的国标汉字,假定句子长为10个字,那么这个组合数为1310∼5×10141310∼5×1014这个计算量就相当的大了。因此,需要一个最好能和状态数目成正比的算法,而这个算法在1967年首次提出,即维特比算法。
主要内容
维特比算法基础
1.如果概率最大的路径P(或者说是最短路径)经过某个点,比如下图中的x22x22,那么这条路径上从起始点S到x22x22的这一段路径Q,一定是S到x22x22之间的最短路径。否则,用S到x22x22的最短路径R代替Q,便构成了一条比P更短的路径,这就和之前的假设矛盾了。
2.从S到E路径必定经过第i时刻的某个状态,假定第i时刻有k个状态,那么如果记录了从S到i个状态的所有k个节点(所有时刻的所有状态)的最短路径,最终的最短路径必经过其中的一条。这样,在任何时刻,只要考虑非常有限条候选路径即可。
3.结合以上两点,假定当我们从状态i进入到i+1时,从S到i上各个节点的最短路径已经找到,并且记录到这些节点上,那么在计算出从起点S到第i+1状态的某个结点的最短路径时,只要考虑从S到前一个状态i所有的k个节点的最短路径,以及从这k个节点到xi+1,jxi+1,j的距离即可。 
维特比算法
1.从点S触发,对于第一个状态x1x1的各个节点,不妨假定有n1n1个,计算出S到它们的距离d(S,x1i)d(S,x1i),这里的x1ix1i表示的是状态1的节点,因为只有一步,所以这些都是S到它们各自的最短路径。
2.(算法的关键)对于第二个状态x2x2的所有节点,要计算S到它们的最短距离,我们知道,对于特定的节点x2ix2i,可以经过状态1的n1n1中的任何一个节点x1ix1i,当然,对应的路径长度就是d(S,x2i)=d(S,x1j)+d(x1j,x2i)d(S,x2i)=d(S,x1j)+d(x1j,x2i)。由于j有n1n1种可能性,我们要一一计算,然后找出最小值。即
d(S,x2i)=minI=1,n1d(S,x1j)+d(x1j,x2i)d(S,x2i)=minI=1,n1d(S,x1j)+d(x1j,x2i)
这样对于第二个状态的每个节点,需要进行n1n1次乘法计算。假定这个状态有n2n2个节点,把S这些节点的距离都计算一遍,就有O(n1⋅n2)O(n1⋅n2)次计算。
接下来,类似地按照上述方法从第二个状态走到第三个状态,一直走到最好一个状态,就得到了整个网格从头到尾的最短路径。每一步计算的复杂度都和相邻两个状态SiSi和Si+1Si+1各自的节点数目ni,ni+1ni,ni+1的乘积成正比,即O(ni⋅ni+1)O(ni⋅ni+1)。如果假定这个在这个隐含马尔可夫链中节点最多的状态有D个节点,也就是说整个网格的宽度为D,那么任何一步的复杂度不超过O(D2)O(D2),由于网格长度是N,所以整个维特比算法的复杂度是O(N⋅D2)O(N⋅D2).
回到最初的问题中,计算量基本上是13×13×10=1690≈10313×13×10=1690≈103,这样就降低了很大的计算量。
总的来说,无论在语音识别、输入法打字中,输入都是按照流(Stream)的方式进行的,只要处理每个状态的时间比讲话,或者打字速度,那么无论输入有多长,解码过程永远就是实时的。 
--------------------- 
作者:AIAS编程有道 
来源:CSDN 
原文:https://blog.csdn.net/meiqi0538/article/details/80960128 
版权声明:本文为博主原创文章,转载请附上博文链接!

Viterbi-Algorithm(维特比)算法的更多相关文章

  1. 维特比算法(Viterbi)

    维特比算法(Viterbi) 维特比算法 编辑 维特比算法是一种动态规划算法用于寻找最有可能产生观测事件序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中.术语“维特比路 ...

  2. 维特比算法(Viterbi)及python实现样例

    维特比算法(Viterbi) 维特比算法 维特比算法shiyizhong 动态规划算法用于最可能产生观测时间序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔科夫模型中.术语“维特 ...

  3. HMM模型学习笔记(维特比算法)

    维特比算法(Viterbi) 维特比算法  编辑 维特比算法是一种动态规划算法用于寻找最有可能产生观测事件序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中.术语“维特比 ...

  4. 维特比算法(Viterbi Algorithm)

      寻找最可能的隐藏状态序列(Finding most probable sequence of hidden states) 对于一个特殊的隐马尔科夫模型(HMM)及一个相应的观察序列,我们常常希望 ...

  5. HMM——维特比算法(Viterbi algorithm)

    1. 前言维特比算法针对HMM第三个问题,即解码或者预测问题,寻找最可能的隐藏状态序列: 对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列,找到生成此序列最可能的隐藏状态序列. 也就是说给定 ...

  6. Viterbi(维特比)算法在CRF(条件随机场)中是如何起作用的?

    之前我们介绍过BERT+CRF来进行命名实体识别,并对其中的BERT和CRF的概念和作用做了相关的介绍,然对于CRF中的最优的标签序列的计算原理,我们只提到了维特比算法,并没有做进一步的解释,本文将对 ...

  7. 维特比算法(Viterbi)-实例讲解(暴力破解+代码实现)

    1.简介 维特比算法是一个通用的求序列最短路径的动态规划算法,也可以用于很多其他问题,比如:文本挖掘.分词原理.既然是动态规划算法,那么就需要找到合适的局部状态,以及局部状态的递推公式.在HMM中,维 ...

  8. viterbi维特比算法和隐马尔可夫模型(HMM)

    隐马尔可夫模型(HMM) 原文地址:http://www.cnblogs.com/jacklu/p/7753471.html 本文结合了王晓刚老师的ENGG 5202 Pattern Recognit ...

  9. 【机器学习】【条件随机场CRF-2】CRF的预测算法之维特比算法(viterbi alg) 详解 + 示例讲解 + Python实现

    1.CRF的预测算法条件随机场的预测算法是给定条件随机场P(Y|X)和输入序列(观测序列)x,求条件概率最大的输出序列(标记序列)y*,即对观测序列进行标注.条件随机场的预测算法是著名的维特比算法(V ...

  10. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

随机推荐

  1. 字符串的常用操作和方法(Python入门教程)

    字符串的常用操作 很好理解 字符串可以用 ' + ' 连接,或者乘一个常数重复输出字符串 字符串的索引操作 通过一对中括号可以找到字符串中的某个字符 可以通过正负数双向操作噢 用一个中括号来实现 为什 ...

  2. 关于C++线程池的实现的思考

    今天突然对前些日子一直很疑惑的c++线程池有了新的想法.其实所谓的线程池无非就是两个技术点,一个,多线程,指工作线程和主线程分离,或者说数据接收和处理分两个线程,一般就是讲需要运行的函数放到子线程执行 ...

  3. Unity ML-agents 一、初次尝试

    前言 曾在高二寒假的时候,跟表哥在外面玩,当时他问我有没有想过以后要做什么,我愣了一下,回答不上来.是的,从没想过以后要做什么,只是一直在完成学校.老师安排的任务,于是那之后半年,我一直在思考,大学要 ...

  4. powershell提示无法将“”项识别

    解决: 完成! 解释: 权限问题.Powershell脚本的4种执行权限介绍,Windows默认不允许任何脚本运行,我们可以使用"Set-ExecutionPolicy"cmdle ...

  5. [转]PHP利用PCRE回溯次数限制绕过某些安全限制

    这次Code-Breaking Puzzles中我出了一道看似很简单的题目pcrewaf,将其代码简化如下: <?php function is_php($data){ return preg_ ...

  6. PHP Callable强制指定回调类型的方法

    如果一个方法需要接受一个回调方法作为参数,我们可以这样写 <?php function dosth($callback){ call_user_func($callback); } functi ...

  7. 非阻塞算法(Lock-Free)的实现

    目录 非阻塞的栈 非阻塞的链表 非阻塞算法(Lock-Free)的实现 上篇文章我们讲到了使用锁会带来的各种缺点,本文将会讲解如何使用非阻塞算法.非阻塞算法一般会使用CAS来协调线程的操作. 虽然非阻 ...

  8. 【Linux常见命令】paste命令

    paste - merge lines of files paste 命令用于合并文件的列. paste 指令会把每个文件以列对列的方式,一列列地加以合并. 语法: paste [OPTION]... ...

  9. 【BUG之group_concat默认长度限制】

    2019独角兽企业重金招聘Python工程师标准>>> 问题:mysql数据库使用group_concat将多个id组成字符串数组,一共200个,到160个被截断: 原因:mysql ...

  10. matlab画图(一)

    例1.画出函数图像 >> x=-pi/2:0.01:pi/2; >> y=x+sin(x)+exp(x); >> plot(x,y,'r','Linewidth', ...