algorithm - 加速维特比执行

标签 algorithm performance machine-learning

我已经为我观察到的基于 HMM 的信号实现了一个朴素的维特比算法。解码器的执行时间似乎对我的要求来说太慢了。我现在正试图了解如何加快执行速度。当我要确定算法的计算复杂性时,我看到它被称为具有 t * s^2 的复杂性。 ,其中 t 是观察数,s 是状态数。我大约有 3500 个状态和 100 个观察值。每个州有 729 个排放概率。

我还看到在这个 paper 中提到了它,维特比解码在本文中是指数的(2^k,其中 k 是约束长度)。我不太理解这个解释。但是,我相信如果 Viterbi 是关于状态的指数,那么算法肯定会非常慢,即使我将它并行化也是如此。

我的问题是:

  1. Viterbi 算法/解码的复杂度是多少?它们在两种情况下是否相同?
  2. 如何修改 Viterbi 算法以加快速度?

编辑:我正在用 C++ 实现它,希望将来对其进行修改和并行化。

最佳答案

回答第一个问题:

如果你有 t 个观察值,s 个状态,并且每个状态有 e 个发射概率,那么网格将有 t*s 个节点,并且评估每个节点将花费 e 个操作,所以整体简单实现的复杂度将是 O(t*s*e)

维特比解码可用于解码位序列。如果观察依赖于前k个二进制位,那么k位不同序列的个数就是2^k。这表示进行流解码所需的状态数(每个状态表示先前位的一种配置)。但是,这不太可能与您相关。

您链接到的论文描述了一种减少需要扩展的节点数量的方法。这不会改善最坏情况下的复杂性,但可能会根据您的特定问题的性质在典型使用中显着改善。

关于algorithm - 加速维特比执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30741167/

相关文章:

string - 构造回原始字符串

algorithm - 鉴于我的航向和方位到另一个物体,我如何才能转身面对它?

c - 为什么我的 CPU 突然工作速度提高了一倍?

python - 列表中所有字符串的长度 : the fastest way

machine-learning - 验证准确性停滞,而训练准确性提高

c - 可以形成多少种不同的二叉树?

python - python中快速排序的实现和交换枢轴值

python - 字符串性能 - Windows 10 与 Ubuntu 下的 Python 2.7 与 Python 3.4

matlab - 最近均值分类器的距离计算器

python-3.x - linerrud 数据集上的线性回归