我想在一个数据框中计算动态时间规整(DTW)距离。结果必须是一个新的数据框(距离矩阵),其中包括每行之间的成对DTW距离。
对于欧几里得距离,我使用以下代码:
from scipy.spatial.distance import pdist, squareform
euclidean_dist = squareform(pdist(sample_dataframe,'euclidean'))
我需要一段与DTW类似的代码。
提前感谢。
我想在一个数据框中计算动态时间规整(DTW)距离。结果必须是一个新的数据框(距离矩阵),其中包括每行之间的成对DTW距离。
对于欧几里得距离,我使用以下代码:
from scipy.spatial.distance import pdist, squareform
euclidean_dist = squareform(pdist(sample_dataframe,'euclidean'))
我需要一段与DTW类似的代码。
提前感谢。
有各种方法可以做到这一点。我将留下两个选项。
如果有人想知道欧几里得距离和DTW之间的区别,这是一个好资源。
选项1
使用fastdtw
。
安装它:
pip install fastdtw
然后按照以下方式使用
import numpy as np from scipy.spatial.distance import euclidean
from fastdtw import fastdtw
x = np.array([[1,1], [2,2], [3,3], [4,4], [5,5]])
y = np.array([[2,2],
[3,3], [4,4]])
distance, path = fastdtw(x, y, dist=euclidean)
print(distance)
选项 2 (来源)
def dtw(s, t):
n, m = len(s), len(t)
dtw_matrix = np.zeros((n+1, m+1))
for i in range(n+1):
for j in range(m+1):
dtw_matrix[i, j] = np.inf
dtw_matrix[0, 0] = 0
for i in range(1, n+1):
for j in range(1, m+1):
cost = abs(s[i-1] - t[j-1])
# take last min from a square box
last_min = np.min([dtw_matrix[i-1, j], dtw_matrix[i, j-1], dtw_matrix[i-1, j-1]])
dtw_matrix[i, j] = cost + last_min
return dtw_matrix