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代码.
提前致谢.
有多种方法可以做到这一点。我将在下面留下两个选项。
如果有人想知道欧氏距离和 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)
它的工作原理如下
| 归档时间: |
|
| 查看次数: |
1574 次 |
| 最近记录: |