计算熊猫数据帧中的动态时间规整距离

ven*_*nom 6 python scipy pandas

我想计算数据帧中的动态时间扭曲(DTW)距离.结果必须是新的数据帧(距离矩阵),其包括每行之间的成对dtw距离.

对于欧几里德距离,我使用以下代码:

from scipy.spatial.distance import pdist, squareform
euclidean_dist = squareform(pdist(sample_dataframe,'euclidean'))
Run Code Online (Sandbox Code Playgroud)

我需要一个类似的DTW代码.

提前致谢.

Gon*_*ica 5

有多种方法可以做到这一点。我将在下面留下两个选项。

如果有人想知道欧氏距离和 DTW 之间的区别,这是一个很好的资源


选项1

使用fastdtw

安装它

pip install fastdtw
Run Code Online (Sandbox Code Playgroud)

然后按如下方式使用它

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)
Run Code Online (Sandbox Code Playgroud)

选项 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 
Run Code Online (Sandbox Code Playgroud)

它的工作原理如下

在此输入图像描述