我试图了解如何实现动态时间规整(DTW)来比较python中的时间序列曲线。我正在尝试获取两个数组的曲线,并测量它们之间的距离,然后用连接每个节点的线绘制两条曲线,正如您在特征 DTW 图中看到的那样。
我正在尝试以下实验代码:
import numpy as np
from scipy.spatial.distance import euclidean
from fastdtw import fastdtw
s = np.array([205, 10, 203, 27, 505, 60, 704, 80, 900, 24, 400, 260])
z = np.array([230, 25, 236, 22, 520, 55, 653, 70, 967, 15, 480, 190])
distance, path = fastdtw(s, z, dist=euclidean)
print(distance)
我正在关注fastdtw
文档中的一个示例:https ://pypi.org/project/fastdtw/
我有两个数组:“s”和“z”,我将它们视为时间序列数据,但没有时间戳,并且时间间隔相等。此代码采用我的两个数组“s”和“z”,并计算它们之间的距离,显示为:385.0
所以我可以找到这两条曲线之间的距离,但我不确定如何实际绘制这个距离,比如像这样的图(我相信这被称为“双向”DTW 图):https://动态时间扭曲.github.io/py-images/Figure_2.png
这是使用fastdtw
包,但我也想使用 dtw-python,因为这似乎也是一个不错的选择。我正在尝试使用此dtw-python
文档示例:https ://dynamictimewarping.github.io/python/
我正在尝试这个实验代码:
from dtw import *
alignment = dtw(s, z, keep_internals=True)
print(alignment)
这打印:
DTW alignment object of size (query x reference): 12 x 12
不过,这并不能告诉我太多,因为我想揭示曲线之间的 DTW 距离。
我还尝试使用以下方式绘制此 DTW 运行:
alignment.plot(type="twoway")
但我得到这个错误:ValueError: cannot convert float NaN to integer
这让我感到困惑,因为我认为我的数组中没有任何 NaN 值。
给定我的两个数组,它们基本上用作要绘制为曲线的 y 轴值,我如何找到它们之间的 DTW 距离并将它们绘制为 DTW 距离匹配图?
这个想法是在我的数据集中不断交换新数组并不断比较距离以查看哪些数组具有最相似的曲线形状。我想匹配具有最相似形状的曲线,据我了解,这意味着 DTW 距离最低。