在 Pandas 数据框中计算动态时间扭曲距离

Posted

技术标签:

【中文标题】在 Pandas 数据框中计算动态时间扭曲距离【英文标题】:Calculating Dynamic Time Warping Distance in a Pandas Data Frame 【发布时间】:2016-04-02 19:05:35 【问题描述】:

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

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

from scipy.spatial.distance import pdist, squareform
euclidean_dist = squareform(pdist(sample_dataframe,'euclidean'))

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

提前致谢。

【问题讨论】:

这个问题并不适合 Stack Overflow。也许您应该尝试实现自己的算法(可能关注this 博客帖子)并将其发布到Code Review 以获得反馈。 ***.com/q/5695388/1461210 也许你可以使用pypi.org/project/fastdtw? 谢谢我已经使用它并且它有效。 【参考方案1】:

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

如果想知道欧几里得距离和 DTW 之间的区别,this is a good resource。


选项 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 (Source)

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 

它的工作原理如下

【讨论】:

@venom 如果有帮助,请考虑将答案标记为正确。

以上是关于在 Pandas 数据框中计算动态时间扭曲距离的主要内容,如果未能解决你的问题,请参考以下文章

在单个特征数据框中查找质心和点之间的距离 - KMeans

计算数据框中两个长纬度坐标之间的距离

使用距离矩阵计算 Pandas Dataframe 中行之间的距离

将测地线数据类型更改为整数

使用 dtwclust 进行动态时间规整距离 (DTW) 的时间序列聚类

如何将函数应用于增加数据框中的数据子集