Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 加快执行维特比_Algorithm_Performance_Machine Learning - Fatal编程技术网

Algorithm 加快执行维特比

Algorithm 加快执行维特比,algorithm,performance,machine-learning,Algorithm,Performance,Machine Learning,我已经为我观察到的基于HMM的信号实现了一个朴素的维特比算法。解码器的执行时间对于我的要求来说似乎太慢了。我现在想知道如何加快执行速度。当我要确定算法的计算复杂度时,我看到它的复杂度是,其中t是观察数,s是状态数。我大概有3500个州和100个观测值。每个州有729个发射概率 我还看到,在本文中提到,维特比译码是指数的(2^k,其中k是约束长度)。我不太理解这个解释。但是,我相信如果维特比与状态成指数关系,那么算法肯定会非常慢,即使我将其并行化 我的问题是: 维特比算法/解码的复杂度是多少?这两

我已经为我观察到的基于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,但我并不认为幼稚的实现会很慢。