我试图通过DTW获得下面显示的这两个数组之间的距离。
我正在使用提供
的Pythonmlpy
包
dist, cost, path = mlpy.dtw_std(y1, y2, dist_only=False)
我知道DTW会照顾"转移"。另外,从上面可以看出,mlpy.dtw_std()
仅接收2个1-D阵列。所以我希望无论我如何向左/右移动曲线,函数返回的dist
都不应该改变。
然而,在将绿色曲线向右移动一点之后,dist
返回的mlpy.dtw_std()
发生了变化!
转移之前:Python mlpy.dwt_std
报告dist = 14.014
转移后:Python mlpy.dwt_std
报告dist = 38.078
显然,由于曲线仍然是那两条曲线,我不希望距离不同!
为什么会这样?出了什么问题?
答案 0 :(得分:2)
让我重申我的理解,如果我在任何地方出错,请纠正我。我观察到,在你的两个地块中,你的蓝色1D系列保持相同,而绿色则被拉伸。你是如何做到的,你在2013年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 ... 96,100],
a和b之间的DTW映射仍然会以0映射到b的0开始,并以100的结束映射到b的100(边界约束)。此外,由于DTW'负责'时移,我还希望两个信号中的20,40,60和80相互映射。 (我没有试过DTWing这两个,从直觉上说,所以请检查。根据允许的步骤模式/全局限制,几乎不可能发生非直观的扭曲,但让我们直观的扭曲易于理解/简单的那一刻)。
对于剩余的数据点,显然,与映射相对应的距离现在不为零,因此总距离也不为零。我们的距离/总成本值已从零变为非零值。
现在,当我们的信号过于简单,线性增加时就是这种情况。想象一下,当你拥有现实生活中非单调的信号,并且需要在它们之间找到时间扭曲时,会出现变化。 :)
(PS:请不要忘记upvote回答:D)。感谢。
答案 1 :(得分:1)
显然,曲线不相同,因此距离函数不能为0(否则,根据定义,它不是距离)。
什么是“相对较大”?距离可能不是无限的,是吗?
140个时间点,每个点都有一个小的增量,这仍然是一个非零数字。
“纽约”到“北京”的距离约为11018公里。或1101800000毫米。
到半人马座阿尔法星的距离很小,仅为4.34 lj。那是我们最近的其他恒星系统...
与非相似系列的距离进行比较;那个距离应该大得多。