4

我试图通过 DTW 获得下面显示的这两个数组之间的距离。 在此处输入图像描述

我正在使用mlpy提供的 Python 包

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 在此处输入图像描述 显然,由于曲线仍然是那两条曲线,我不希望距离会有所不同!

为什么会这样?哪里出错了?

4

2 回答 2

2

让我重申一下我的理解,如果我在任何地方出错,请纠正我。我观察到,在您的两个图中,蓝色的一维系列保持不变,而绿色则被拉伸。你是怎么做的,你已经在 2013 年 9 月 19 日 9:36 的帖子中解释了它。您的前提是,因为(1)DTW“照顾”时移,并且(2)您所做的只是纵向拉伸一个时间序列,而不影响y值,(推论:)您期望距离保持不变。

[(1),(2)] 和 [(Inference)] 之间缺少一点联系。也就是说,对应于映射的各个距离值将随着您更改信号集本身而改变。这将导致整体距离计算的差异。绘制扭曲路径,成本网格以亲自查看。

让我们举一个过于简单的案例......

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...96,100],a 和 b 之间的 DTW 映射仍然会以 a 的 0 开始映射到 b 的 0,并以 a 的 100 结束,映射到 b 的 100(边界约束)。此外,由于 DTW 会“处理”时移,我还希望两个信号中的 20、40、60 和 80 能够相互映射。(我自己没有尝试对这两个进行DTWing,是凭直觉说的,所以请检查一下。根据允许的步骤模式/全局约束,也几乎没有发生非直觉变形的可能性,但让我们使用直观的变形为了便于理解/简单起见的时刻)。

对于剩余的数据点,显然,映射对应的距离现在非零,因此总距离也非零。我们的距离/总成本值已从零变为非零。

现在,当我们的信号过于简单,呈线性增长时,就是这种情况。想象一下当你有现实生活中的非单调信号时会出现的变化,并且需要在它们之间找到时间扭曲。:)

(PS:请不要忘记支持答案:D)。谢谢。

于 2014-01-21T19:52:16.113 回答
1

显然,曲线不相同,因此距离函数不能为 0(否则,它不是定义上的距离)。

什么是“比较大”?距离大概不是无限的吧?

140 个时间点,每个时间点都有一个小增量,这仍然是一个非零数字。

“纽约”到“北京”的距离大约是11018公里。或 1101800000 毫米。

到 Alpha Centauri 的距离很小,只有 4.34 lj。那是离我们最近的其他恒星系统...

与非相似序列的距离进行比较;这个距离应该大得多。

于 2013-09-19T07:46:53.657 回答