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,)。我想使用 fastdtw python 包进行以下两个动态时间扭曲:

  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_warpedx 的形状相同,但我希望得到 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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...