维特比算法

来源:互联网 发布:阿里云ecs传文件 编辑:程序博客网 时间:2024/04/29 13:23
最近小组长要求我做一个HMM的专题算法报告,后来发现HMM里用到了Viterbi 算法,且是核心算法,结合网上各位大牛的博客和自己的理解。
百度百科的维特比算法定义:维特比算法是一种动态规划算法用于寻找最有可能产生观测事件序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中。
你们能看懂吗?

原理

根据动态规划原理,最优路径具有这样的特征:如果最优路径在时刻t通过节点it*,那么这一路径中“从节点i1*到终点it*的部分路径”对于“从节点i1*到终点it*的所有可能的部分路径”来说必须是最优的。

        根据这一原理,我们只需从时刻t=1开始,递推的计算在时刻t状态为i的各条部分路径的最大概率,直至得到时刻t=T时状态为i的各条路径的最大概率。时刻t=T的最大概率即为最优路径的概率P*,最优路径的终点it*也就同时得到了。

        之后,为了找出最优路径的各个节点,从终结点iT*开始,由后向前逐步求得节点iT-1*,..., i1*,得到最优路径I* = (i1*, i2*, ...,iT*)

维特比算法说白了就是动态规划实现最短路径,只要知道“动态规划可以降低复杂度”这一点就能轻松理解维特比算法
维特比算法是一个特殊但应用最广的动态规划算法,利用动态规划,可以解决任何一个图中的最短路径问题。而维特比算法是针对一个特殊的图——篱笆网络的有向图(Lattice )的最短路径问题而提出的。 它之所以重要,是因为凡是使用隐含马尔可夫模型描述的问题都可以用它来解码,包括今天的数字通信、语音识别、机器翻译、拼音转汉字、分词等。——《数学之美》 ps 多处摘录此书,不再赘述。
反正我是没看懂。简单的理解一下算法思想。上一篇 我也谈到了动态规划的思想。Viterbi算法就是利用了动态规划的思想,单单说维特比算法没有什么意义,个人感觉,只有结合HMM才能激发它的洪荒之力。
维特比算法 - zm_szu - 这孩子谁懂的博客
篱笆网络有向图的特点是同一列节点有多个,并且和上一列节点交错地连接起来。同一列节点代表同一个时间点上不同的状态的并列,大概因为这种一列一列整齐的节点和交错的边很像篱笆而得名。

假设上图每一列分别有n1……nn个节点,如果不使用动态的话,那么计算复杂度就是O(n1*n2……nn)。

而维特比算法的精髓就是,既然知道到第i列所有节点Xi{j=123…}的最短路径,那么到第i+1列节点的最短路径就等于到第i列j个节点的最短路径+第i列j个节点到第i+1列各个节点的距离的最小值。

这是一句大白话,所谓中文伪码。

分析一下复杂度,假设整个篱笆有向图中每一列节点最多有D个(也就是图的宽度为D),并且图一共有N列,那么,每次计算至多计算D*D次(从i列的D个节点中挑一个计算到i+1列D个节点的距离)。至多计算N次。那么复杂度骤减为O(ND2),远远小于穷举O(DN)。

例子:

维特比算法 - zm_szu - 这孩子谁懂的博客

 
维特比算法 - zm_szu - 这孩子谁懂的博客
 
维特比算法 - zm_szu - 这孩子谁懂的博客
 
维特比算法 - zm_szu - 这孩子谁懂的博客
 
维特比算法 - zm_szu - 这孩子谁懂的博客
 



 
0 0