我正在尝试使用dtw-python
包以匹配具有不同振荡次数的曲线形状。我有时间序列数据,其中包含许多构成各种曲线形状的线。这些行从 x 轴上的不同时间戳开始,因此我将所有行发送到单独的数组,仅记录它们的 y 轴值,并假设每个观察值以相等的时间间隔出现,因此基本上将每一行作为如果它在同一个时间戳开始。所以这些数组中的每一个都代表不同的线。我想要做的是使用动态时间扭曲(DTW)将每条线配对在一起并分配一个DTW距离分数,以匹配相似/相似的曲线形状。例如,如果我有来自数组 X 和 Y 的两条看似平稳的曲线,那么应该为这对分配比数组 X 和数组 Z 之间的分数低得多的分数,其中 Z 将是波浪形曲线。这就是基本思想。我正在使用 dtw-python 包来执行此操作。这是我到目前为止所拥有的,其中“ts1”和“ts2”是要比较的时间序列数组,“111”和“222”只是数组的不同 ID:
#Indicate two time series IDs to be compared
ts1 = '111'
ts2 = '222'
#Convert time series curves to arrays
df_y['ID'] = df_y['ID'].astype(str)
v = df_y[df_y["ID"].str.contains(ts1)]
v = v['Value'].to_numpy()
df_y['ID'] = df_y['ID'].astype(str)
z = df_y[df_y["ID"].str.contains(ts2)]
z = z['Value'].to_numpy()
#Run DTW
ds = dtw(v,z, keep_internals=True)
ds.plot(type="twoway")
ds.plot(type="threeway")
print("DTW Distance Metric:")
print(ds.distance)
然后我看到了这个:
DTW 得分:1074.0
然后我尝试与波浪形曲线进行比较并收到以下信息:
这获得了 16103.0 的 DTW 分数
好吧,这看起来有道理,高原形状匹配高原形状,波浪形状匹配波浪形状。好的,但是如果我试图匹配两条具有不同振荡次数的波浪形曲线呢?
我试试这个,看看:
得分为 73745.0(这看起来不太好!)
然后我尝试在代码中添加一些参数参数:
ds = dtw(v,z, keep_internals=True,
window_type=None,
open_end=True)
然后我看到了这个:
得分为 21365.0(现在要低得多!)
然后我尝试:
ds = dtw(v,z, keep_internals=True,
step_pattern=asymmetric,
window_type=None,
open_end=True)
我看到了:
12572.0的分数,现在更低了!我看到最后的振荡被忽略了,这很有趣,因为这可能是我正在寻找的方法。
最后我尝试:
ds = dtw(v,z, keep_internals=True,
step_pattern=asymmetric,
window_type=None,
open_end=False,
open_begin=True)
我看到了:
得分为 19227.0,现在比以前更差,我对这里发生的事情有点困惑。
我的目标是改进我的代码,以便 DTW 函数理解这两条波浪曲线,尽管曲线振荡的数量不同,但实际上是相同的形状。根据我上面的发现,我上面尝试过的这个包的参数参数的哪个组合最适合改进 DTW 函数,以便我的曲线形状尽可能地正确匹配?我正在使用 python 来完成这项任务。
我很难从 dtw-python 的可用文档中找到有关这些论点的含义以及如何使用这些论点的足够背景和文档:https ://dynamictimewarping.github.io/python/#online-documentation