Matlab 中的快速 DP(用于轮廓 HMM 的 Viterbi)

Posted

技术标签:

【中文标题】Matlab 中的快速 DP(用于轮廓 HMM 的 Viterbi)【英文标题】:Fast DP in Matlab (Viterbi for profile HMMs) 【发布时间】:2014-02-08 03:03:14 【问题描述】:

我在 Matlab 中遇到了 viterbi logodds 计算的效率问题。

基本上我的问题是嵌套循环是强制性的,这会大大降低代码速度。这是昂贵的部分:

for i=1:input_len
    for j=1:num_states
        v_m=emission_value+max_over_3_elements; %V_M
        v_i=max_over_2_elements; %V_I
        v_d=max_over_2_elements; %V_D
    end
end

我相信我不是第一个为配置文件 HMM 实施 viterbi 的人,所以也许你有一些建议。我还查看了 Matlab 自己的 hmmviterbi,但没有发现(也使用嵌套循环)。我还测试了用一些原始操作替换 max,但没有明显差异(实际上慢了一点)。

【问题讨论】:

Kevin Murphy 的概率建模工具包可能要快得多,因为它包含一个名为 Lightspeed 的包,它用高度优化的版本替换了概率建模中使用的许多内置 matlab 函数。 github.com/probml/pmtk3 【参考方案1】:

不幸的是,Matlab 中的循环速度很慢(不过使用更新的版本会变得更好)——而且我不认为它可以很容易地矢量化/并行化,因为循环内的操作不独立于其他迭代。

这似乎是 MEX 的一项任务 - 用 C 语言编写它应该不会有太多的工作,而且预期的加速可能非常大。

【讨论】:

以上是关于Matlab 中的快速 DP(用于轮廓 HMM 的 Viterbi)的主要内容,如果未能解决你的问题,请参考以下文章

Matlab - 生成 HMM

在 Matlab 中使用 HMM 的一个很好的例子

用matlab画地图基本轮廓

在matlab中,怎么把图片中的图像轮廓坐标找出来?

MATLAB Murphy 的 HMM 工具箱

计算图像中闭合轮廓的数量 - MATLAB