如何让DTW跑得更快?
问题描述:
我有一个包含4500个长度为1800的向量的矩阵,为此我需要计算矩阵中每两个向量之间的DTW(动态时间翘曲)距离。如何让DTW跑得更快?
我已经使用一个嵌套循环填满一个4500x4500矩阵(其看起来像一个三角形)的一半:
matr = zeros(4500,4500); %initializing empty matrix to fill dtw distance
for i=1:4500
x = new(i,:); %new is where the data lies
for j = i+1:4500
y = new(j,:);
matr(i,j) = dtw(x,y);
end
end
的问题是,代码运行极为缓慢。根据我的计算,我需要4天的时间才能在我的电脑上运行。
我不知道矢量化如何工作。但有没有办法我的代码可以矢量化,以便运行速度更快?还有没有内置的功能,我可以插入所有的向量,并获得自动生成的DTW dist矩阵?
答
不,没有明显的方法来在Matlab中矢量化您的代码以使其更快。您要求进行大量计算(〜4500^2/2个DTW计算),无论您做什么,都可能需要时间。但是你有一些选择:
- 如果你只需要做一次这个计算,就运行它并等待四天。如果您在学校或公司,您可能可以在个人计算机以外的计算机上运行它。
- 您可以尝试在
pdist2
的调用中使用dtw
作为自定义距离函数。这可能会稍微快一点。 - 你可以在Matlab中编写自己的DTW,并尽量节省时间。一个明显的加速是,每个
dtw
的调用都必须分配一个1800x1800矩阵。在你自己的代码中,你可以分配一次并重用它。 - 您可以使用其他语言编写自己的DTW,或使用其他语言的其他DTW代码。这些可以从Matlab通过MEX调用,并且可能会更快,具体取决于语言和实现。
- 你可以解决一个近似值。例如,选择一个参考信号x0,并为每个4500矢量计算
dtw(x0, xi)
。然后进行近似,即dtw(xi, xj)
=dtw(x0, xi) + dtw(x0, xj)
。这样做比您提议的快大约4500倍。
+0
谢谢!这是我正在寻找的答案。我只需要运行一次。所以我从1800年的时候将信号调整到接近600,并在大约6小时内完成。我会在下次尝试矩阵的想法! – Polisetty
[关于'dtw']的文档(http://mathworks.com/help/signal/ref/dtw.html?s_tid=doc_ta)建议你可以输入'x'和'y'的矩阵,尝试一下,看看它是否加快了速度。第二个和第三个输出也给矩阵,这可能是有用的 – Adriaan
@Adriaan这是比较两个矩阵。我想比较单个矩阵中的每两个向量。 – Polisetty
提供示例矩阵示例 –