维特比算法详解(隐马尔科夫模型)

嗯…,在写这个之前看了几篇文章,写的极其学术化,根本就看不懂吗。。。
我个人认为写文章就是应该写的通俗易懂才好,让别人也能学会,能理解到你想表达的东西。
维特比算法说白了就是动态规划实现最短路径,就是说只要知道“动态规划可以降低复杂度”这一点就能轻松理解维特比算法。

维特比算法是一个特殊但应用最广的动态规划算法,利用动态规划,可以解决任何一个图中的最短路径问题。而维特比算法是针对一个特殊的图——篱笆网络的有向图(Lattice )的最短路径问题而提出的。 它之所以重要,是因为凡是使用隐含马尔可夫模型描述的问题都可以用它来解码,包括今天的数字通信、语音识别、机器翻译、拼音转汉字、分词等。——《数学之美》

篱笆网络有向图的特点是同一列节点有多个,并且和上一列节点交错地连接起来。同一列节点代表同一个时间点上不同的状态的并列,大概因为这种一列一列整齐的节点和交错的边很像篱笆而得名。
维特比算法详解(隐马尔科夫模型)_第1张图片
假设上图每一列分别有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)。
开箱即用的维特比算法代码,可参考《通用维特比算法的Java实现》

你可能感兴趣的:(机器学习and深度学习)