Algorithm 加快执行维特比
我已经为我观察到的基于HMM的信号实现了一个朴素的维特比算法。解码器的执行时间对于我的要求来说似乎太慢了。我现在想知道如何加快执行速度。当我要确定算法的计算复杂度时,我看到它的复杂度是,其中t是观察数,s是状态数。我大概有3500个州和100个观测值。每个州有729个发射概率 我还看到,在本文中提到,维特比译码是指数的(2^k,其中k是约束长度)。我不太理解这个解释。但是,我相信如果维特比与状态成指数关系,那么算法肯定会非常慢,即使我将其并行化 我的问题是:Algorithm 加快执行维特比,algorithm,performance,machine-learning,Algorithm,Performance,Machine Learning,我已经为我观察到的基于HMM的信号实现了一个朴素的维特比算法。解码器的执行时间对于我的要求来说似乎太慢了。我现在想知道如何加快执行速度。当我要确定算法的计算复杂度时,我看到它的复杂度是,其中t是观察数,s是状态数。我大概有3500个州和100个观测值。每个州有729个发射概率 我还看到,在本文中提到,维特比译码是指数的(2^k,其中k是约束长度)。我不太理解这个解释。但是,我相信如果维特比与状态成指数关系,那么算法肯定会非常慢,即使我将其并行化 我的问题是: 维特比算法/解码的复杂度是多少?这两
编辑:我在C++中实现,希望能对它进行修改和并行化。
< p>回答第一个问题: 如果有t个观测值,s个状态,并且每个状态都有e个发射概率,那么网格将有t*s
节点,并且评估每个节点将花费e个操作,因此简单实现的总体复杂性将是O(t*s*e)
维特比解码可用于解码比特序列。如果观察值取决于之前的k个二进制位,则k个位的不同序列数为2^k。这表示需要进行流解码的状态数(每个状态表示先前位的一种配置)。但是,这不太可能与您相关
您链接到的论文介绍了一种减少需要扩展的节点数的方法。这不会提高最坏情况下的复杂性,但根据具体问题的性质,在典型应用中可能会有显著的改进。维特比算法的复杂性是
O(t | S | ^{n+1}
,其中n
是马尔可夫模型的顺序(在您的情况下为1),t
观察序列的长度和|S |
隐藏状态的数量。所以在你的例子中,你有一个O(t)
,有一个巨大的常数因子3500^2=1250000。您最好尝试减少模型中隐藏状态的数量,或者使用随机算法进行研究,随机算法可以运行得更快,但不能保证总是返回绝对最佳的结果。为什么您要重新实现Viterbi而不是首先使用它?我添加了一个编辑来解释。而且,它很容易实现,所以我就这么做了。在你看来,我的用例执行起来会很慢吗?因为这个数字在我看来并没有那么大。我想知道我是否在正确的道路上。此外,使用动态规划算法,是否会发生任何节点扩展?因为我们在每次迭代中都会查看t-1历史记录,所以它是一个单节点扩展吗?您的用例表明x86上的时间大约为1秒,足够快吗?当然,这在很大程度上取决于您在什么系统上实现它-FPGA和GPU将比嵌入式微控制器快得多。在标准的DP方法中,每个节点都会被评估。现在,我的节点大约需要6秒。稍后我会转向GPU,但我并不认为幼稚的实现会很慢。