Python:动态时间扭曲,什么是“相似度分数”以及如何计算它?

信息处理 Python 时间序列
2022-02-02 10:23:54

我想比较两个时间序列数据以查看它们彼此的相似性。

对于这个任务,我使用动态时间规整 (DTW) 算法。我已经尝试使用 Python 实现tslearn:(文档在这里

import tslearn.metrics
import numpy as np

s1 = [0, 0, 0, 0, 0, 0, 52, 50.144, 50.144, 50.144, 50, 51.1544, 50.284, 49.214, 48.5248] # sequence 1
s2 = [0, 0, 0, 0, 0, 0, 52.9304, 51.144, 50.144, 51.144, 50.1544, 51.1544, 49.2184, 49.2184, 49.5248] # sequence 2

a = tslearn.metrics.cdist_dtw(s1, s2) # Cross similarity matrix between time series datasets
b = tslearn.metrics.dtw_path(s1, s2) # Get both the matching path and the similarity score for DTW
c = tslearn.metrics.dtw(s1, s2) # Get only the similarity score for DTW
print("Similarity: ", a)
print("*"*127)
print("Path and Similarity: ", b)
print("*"*127)
print("DTW Similarity: ", c)
print("*"*127)

我得到了这个结果:

Similarity:  [[1.84218766]]
*********************************************************************************************************
Path and Similarity:  ([(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (6, 7), (7, 8), (8, 8), (9, 8), (10, 8), (11, 9), (12, 10), (12, 11), (13, 12), (13, 13), (14, 14)], 1.8421876560220476)
*********************************************************************************************************
DTW Similarity:  1.8421876560220476
*********************************************************************************************************

这里让我感到困惑的是图书馆中使用的术语相似性。我无法从文档中得到任何令人满意的解释,所以我目前很困惑。

当我比较 2 个完全相同的序列时,例如:

s1 = [0, 0, 0, 0, 0, 0, 52, 50.144, 50.144, 50.144, 50, 51.1544, 50.284, 49.214, 48.5248] 
s2 = [0, 0, 0, 0, 0, 0, 52, 50.144, 50.144, 50.144, 50, 51.1544, 50.284, 49.214, 48.5248]

相似度得分(变量a, b, c)将导致 0。

我的问题:

  1. 如果 0 表示我的 2 个序列相似,为什么库使用术语“相似性”而不是“不相似性”?我是否对这两个术语感到困惑?这里的相似性与距离具有相同的含义吗?

  2. 如何tslearn计算相似度分数?

1个回答

您已经得到了您在代码中所要求的内容。

DTW 是时间序列之间的相似性度量。默认情况下,tslearn 使用平方欧几里得距离作为基本度量(我引用了文档)。

当在代码中指定时,可以使用另一个地面度量。

您使用默认值,即欧几里德距离度量,您的序列(时间序列)对齐欧几里得距离是序列项的平方差和的平方根:对于相同的序列,您有:当提到这个 Python 生态系统的特征时,将相似度作为定性程度的概念被距离度量的概念所取代,尽管这个词仍然存在。你没有其他选择来适应这个词的使用。s1s2len(s1)=len(s2)DTWEuclid(s1,s2)=k(s1[k]s2[k])2DTWEuclid(s1,s1)=k(s1[k]s1[k])2=0

这就是tslearn使用默认指标时计算“相似性”的方式。对于其他指标和未对齐的序列,请参阅文档。门户网站 dsp.SE 随时准备在不确定的情况下为您提供帮助。