我试图通过DTW得到这两个数组之间的距离。
我使用的pythonmlpy包提供

dist, cost, path = mlpy.dtw_std(y1, y2, dist_only=False)

我知道DTW确实负责“转移”。此外,从上面可以看出,mlpy.dtw_std()只接受2个一维数组。所以我希望无论我如何左/右移动曲线,函数返回的dist都不会改变。
然而,将绿色曲线向右移动一点后,dist返回的mlpy.dtw_std()会发生变化!
转换前:pythonmlpy.dwt_std报告dist = 14.014
转换后:pythonmlpy.dwt_std报告dist = 38.078
显然,由于曲线仍然是这两条曲线,我不希望距离不同!
为什么会这样?哪里出错了?

最佳答案

让我重申我所理解的,如果我在任何地方出错,请纠正我。我观察到,在你们的两个图中,蓝色的1D序列保持不变,而绿色的被拉伸。你是怎么做到的,你已经在9月19日9:36的帖子中解释过了。你的前提是,因为(1)DTW“照顾”了时间偏移,(2)你所做的一切都是按一个时间序列的长度拉伸,而不是影响Y值,(推论:)你期望距离保持不变。
在[(1),(2)]和[(推论)]之间有一点缺失。也就是说,对应于映射的各个距离值将随信号集本身的更改而更改。这将导致总距离计算的差异。绘制扭曲路径,成本网格自己看。
让我们来看一个过于简单化的案子…

a=range(0,101,5)=[0,5,10,15…95,100]
以及b=range(0,101,5)=[0,5,10,15…95,100]。
现在直观地说,您/我希望2个信号(对于DTW映射)之间有一对一的对应关系,并且所有映射的距离都是0,信号看起来是相同的。
现在如果我们做,b=range(0,101,4)=[0,4,8,12…96100],
A和B之间的DTW映射仍然从A的0映射到B的0开始,到A的100映射到B的100结束(边界约束)。另外,由于DTW“负责”时间偏移,我也希望这两个信号中的20、40、60和80彼此映射。(我还没试过自己去揣摩这两个人,是凭直觉说的,所以请查查。根据允许的步进模式/全局约束,发生非直观扭曲的可能性也很小,但为了便于理解/简单起见,让我们暂时使用直观扭曲)。
显然,对于其余的数据点,对应于映射的距离现在是非零的,因此总距离也是非零的。我们的距离/总成本值已从零变为非零。
现在,当我们的信号过于简单化,线性增加时,情况就是这样。想象一下,当你有现实生活中的非单调信号时,你会想到这些变化,你需要在它们之间找到时间扭曲。:)
(注:请不要忘了投票给D)。谢谢。

09-26 12:21