DTW算法判断两条曲线的相似度,Python代码
本文目录
- 如何判断两条曲线的相似度
- 1.动态时间规整(DTW)
- 2.用法
- 2.1 安装库
- 2.2 代码示例
- 2.3 预期结果
- 2.4 DTW相似度距离的含义
如何判断两条曲线的相似度
在判断两条曲线的相似度时,常用的方法包括:动态时间规整(DTW
)、傅里叶变换、交叉相关、欧氏距离、以及基于机器学习的算法。 其中,动态时间规整(DTW
)是一个较为常用且高效的方法,它通过计算两条曲线在时间轴上的非线性对齐来衡量它们的相似度。
1.动态时间规整(DTW)
动态时间规整(Dynamic Time Warping, DTW
)是一种用于衡量两条时间序列(或曲线)相似度的算法,尤其适用于存在时间偏移或速度变化的情况。DTW通过计算两条曲线在时间轴上的最佳对齐路径,来最小化它们之间的距离。
DTW的核心思想是通过允许时间轴上的非线性变换,使得两条曲线在时间维度上对齐。具体步骤包括:
- 计算距离矩阵:首先,计算两条曲线的每个点之间的欧氏距离,生成一个距离矩阵。
- 寻找最优路径:利用动态规划算法,从距离矩阵的左上角到右下角,找到使得路径上的距离和最小的对齐路径。
- 计算相似度:最终的相似度就是沿着最优路径累计的距离和。
2.用法
2.1 安装库
pip install fastdtw -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2 代码示例
import numpy as np
from scipy.spatial.distance import euclidean
from fastdtw import fastdtw
import matplotlib.pyplot as plt# 定义两条曲线
curve1 = np.array([[1,3], [2,3.5], [3,4], [4,4.5], [5,3]])
curve2 = np.array([[1,1.5], [2,2], [3,1], [4,2], [5,1.5]])# 计算DTW距离和最优路径
distance, path = fastdtw(curve1, curve2, dist=euclidean)# 可视化两条曲线
plt.figure(figsize=(10, 6))# 绘制原始曲线 - 分别绘制x和y坐标
x1, y1 = curve1[:, 0], curve1[:, 1]
x2, y2 = curve2[:, 0], curve2[:, 1]plt.plot(x1, y1, marker='o', label='Curve 1', linewidth=2)
plt.plot(x2, y2, marker='s', label='Curve 2', linewidth=2)# 绘制DTW对齐路径
for (i, j) in path:plt.plot([curve1[i, 0], curve2[j, 0]], [curve1[i, 1], curve2[j, 1]], 'k--', alpha=0.3)# 添加图表信息
plt.xlabel('X Value')
plt.ylabel('Y Value')
plt.title(f'DTW Similarity Distance: {distance:.2f}')
plt.legend()
plt.grid(True, alpha=0.3)# 保存图片到 ./output.jpg
plt.tight_layout()
plt.savefig('./output.jpg', dpi=300, bbox_inches='tight')# 显示图表
plt.show()# 输出DTW相似度距离
print(f"DTW相似度距离: {distance}")
2.3 预期结果
成功运行后,控制台输出如下所示:
DTW相似度距离: 2.8284271247461903
可视化图像:
2.4 DTW相似度距离的含义
DTW距离的含义:
- DTW距离是用来衡量两条时间序列或曲线之间相似性的指标,它通过动态规划找到两个序列之间的最优对齐方式,计算的是在最优对齐情况下,对应点之间距离的累积和。
DTW值大小的含义:
值越小
:表示两条曲线形状越相似,在最优对齐下,对应点之间的差异越小,曲线的变化趋势越接近;值越大
:表示两条曲线形状差异越大,对应点之间的距离累积和较大,曲线的整体形态差异明显;值为0
:表示两条曲线完全相同(在经过最优对齐后)。
DTW距离主要用于相对比较:
- 在多个曲线中找出与目标曲线最相似的(距离最小),聚类分析中衡量曲线间的相似程度,时间序列分类和模式识别。