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)的主要内容,如果未能解决你的问题,请参考以下文章