用一个实际例子,演示动态时间规整(Dynamic Time Warping, DTW )算法
动态时间规整 (Dynamic Time Warping, DTW) 是一种用于度量两个时间序列之间的差异的算法,尤其是当这两个序列出现时间偏移或速度不同的情况。例如,DTW 可用于语音识别或股价数据分析。
以下是一个简单的 DTW 算法实现例子,我们将使用 Python 和 numpy 来计算两个时间序列之间的 DTW 距离:
1. 定义 DTW 函数
pythonCopy code
2. 定义两个时间序列并计算它们的 DTW 距离
pythonCopy code
import numpy as np
def dtw(seq1, seq2):
m, n = len(seq1), len(seq2)
# 创建一个 m x n 的矩阵,初始化为无穷大
dtw_matrix = np.zeros((m+1, n+1))
dtw_matrix[0, 1:] = float('inf')
dtw_matrix[1:, 0] = float('inf')
for i in range(1, m+1):
for j in range(1, n+1):
cost = (seq1[i-1] - seq2[j-1])**2
# 选择之前三个操作中的最小值
dtw_matrix[i, j] = cost + min(dtw_matrix[i-1, j], dtw_matrix[i, j-1], dtw_matrix[i-1, j-1])
return dtw_matrix[m, n]
seq1 = np.array([1, 1, 2, 3, 2, 0])
seq2 = np.array([0, 1, 1, 2, 3, 2, 1])
distance = dtw(seq1, seq2)
print("DTW distance between seq1 and seq2:", distance)
# 答案是2
seq1 = np.array([1, 3, 2, 2, 4, 4])
seq2 = np.array([1, 1, 3, 3, 2, 4])
distance = dtw(seq1, seq2)
print("DTW distance between seq1 and seq2:", distance)
# 答案是0 见图
在上述例子中,我们定义了两个简单的时间序列并使用 DTW 函数来计算它们之间的距离。返回的距离给出了两个时间序列之间的差异度量。
需要注意的是,这只是一个基本的 DTW 实现,专门为了说明算法而设计。在实际应用中,可能会使用更高级的版本和优化技术,例如使用约束条件来减少计算复杂性,或者使用快速近似方法来加速计算。
本质上就是一个最短路的动态规划算法,无非是路径可以斜着走而已!
这里是不是有错啊?cost = (seq1[i-1] - seq2[j-1])**2 是不是应该是取绝对值?
对于 DTW,计算两个点之间的“距离”或“代价”可以有多种方式。常用的方式确实是取两点的绝对差,但平方差也是合理的选择。选择哪种方式取决于应用的具体需求。
使用绝对差值:
pythonCopy code
cost = abs(seq1[i-1] - seq2[j-1])
使用平方差:
pythonCopy code
cost = (seq1[i-1] - seq2[j-1])**2
这两种方式都可以用在 DTW 算法中,但它们可能会导致稍微不同的结果。绝对差值可能在某些应用中更有意义,尤其是当我们关心的是实际的差异大小而不是差异的平方时。
因此,如果你的应用更适合使用绝对差值,那么可以替换为 cost = abs(seq1[i-1] - seq2[j-1])
。
我看到默认都是绝对值!