0

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

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

4

1 回答 1

0

首先,我注意到您使用的是 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

于 2021-06-28T04:44:19.857 回答