问题描述
我有以下两个时间序列信号:
import numpy as np
x = np.cos(2*np.pi*np.power(3*(np.linspace(1,1000,1000))/1000,2))
y = np.cos(2*np.pi*(9*(np.linspace(1,399,399))/400))
所以 x
和 y
的形状分别为 (1000,)
和 (399,)
。我想使用 fastdtw
python 包进行以下两个动态时间扭曲:
-
x
是参考信号(较长的信号):
我想将 y
映射到更长的信号形状 (x.shape=(1000,)
)。它由以下代码完成:
from scipy.spatial.distance import euclidean
from fastdtw import fastdtw
distance,path = fastdtw(x,y,dist=euclidean) # x:reference signal
inds = [ind[1] for ind in path]
y_warped = y[inds]
在这种情况下,上面的代码可以正常工作并将 y:(399,)
映射到 y_warped:(1000,)
。
-
y
是参考信号(较短的信号):
我想将 x
映射到较短的信号形状 (y.shape=(399,)
)。
from scipy.spatial.distance import euclidean
from fastdtw import fastdtw
distance,path = fastdtw(y,x,dist=euclidean) # y:reference signal
inds = [ind[1] for ind in path]
x_warped = x[inds]
但在这种情况下,我得到的 x_warped
与 x
的形状相同,但我希望得到 x.shape=(399,)
。如何将较长的信号变形为较短的信号?
提前致谢!
解决方法
首先,我注意到您使用的是 FastDTW,但是“FastDTW 是近似的,并且通常比它近似的算法慢。”
在用代码回答问题之前,您需要从语义上回答问题。 考虑以下两种情况
-
A= CAT 和 B = CAAAT 在这种情况下,您可以将时间序列插入到相同的长度
-
C = CAT 和 B = CATXXXX 在这种情况下,您需要使用开放式 DTW [b]
[a]https://arxiv.org/abs/2003.11246 [b] https://www.cs.unm.edu/~mueen/DTW.pdf