fastdtw-python包中长时间序列信号与较短参考时间序列信号的动态时间扭曲



我有以下两个时间序列信号:

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))

因此xy的形状分别为(1000,)(399,)。我想用fastdtwpython包做以下两个动态时间扭曲:

  1. 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,)中。

  1. 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形状相同的x_warped,但我希望得到x.shape=(399,)。如何将较长的信号扭曲为较短的信号?提前感谢!

首先,我注意到您使用的是FastDTW,但是"FastDTW是近似的,并且通常比它近似的算法慢">

在用代码回答问题之前,您需要从语义上回答问题。考虑以下两种情况

  1. A=CAT和B=CAAAT在这种情况下,您可以将时间序列插值到相同长度的

  2. C=CAT和B=CATXXXX在这种情况下,您需要使用开放式DTW[b]

[a]https://arxiv.org/abs/2003.11246[b]https://www.cs.unm.edu/~mueen/DTW.pdf

最新更新