动态时间规整(Dynamic Time Warping,DTW)概述
动态时间规整是一种用于衡量两条时间序列相似度的算法。它能够在序列长度不一致、速度(时间轴)出现伸缩的情况下,找到两条序列的最优对齐路径,并以该路径上的累计距离作为相似度度量。
1. 基本原理
- 对齐路径(Warping Path)
- 动态规划求解
- 时间复杂度
2. 常见约束与变体
约束/变体 | 目的 | 关键点 |
---|---|---|
全局窗口(Warping Window) | 限制对齐路径不偏离对角线太远,防止过度扭曲 | 常用 Sakoe‑Chiba 窗口或 Itakura 梯形窗口 |
子序列匹配(Subsequence DTW) | 只对齐较长序列中的一段与另一序列整体 | 适用于模式检测、异常检测 |
FastDTW | 采用多层分辨率近似,降低计算量至 | |
SoftDTW | 用软最小化替代硬最小化,使距离可微,便于梯度下降优化 | 适用于深度学习中的损失函数 |
3. 典型应用场景
- 语音识别:对不同说话速度的同一词语进行对齐,是 DTW 最早的成功案例。
- 手写/笔迹识别:对笔画序列进行时间轴扭曲匹配。
- 动作/姿态识别:对加速度计或关节角度序列进行相似度度量。
- 时间序列分类:在金融、气象、医学等领域,用 DTW 作为距离度量进行 K‑NN 分类或聚类。
- 生物信息学:DNA、蛋白质序列的非线性对齐。
- 音乐信息检索:对音频特征(如 MFCC)进行对齐,评估演奏相似度。
4. 实现要点(Python 示例)
import numpy as np
def dtw_distance(x, y, dist=lambda a,b: (a-b)**2):
n, m = len(x), len(y)
D = np.full((n+1, m+1), np.inf)
D[0,0] = 0
for i in range(1, n+1):
for j in range(1, m+1):
cost = dist(x[i-1], y[j-1])
D[i,j] = cost + min(D[i-1,j], D[i,j-1], D[i-1,j-1])
return np.sqrt(D[n,m])
该实现直接对应动态规划公式,适用于教学或小规模实验。若处理大规模序列,建议使用 fastdtw 包或 SoftDTW 实现。
5. 小结
- DTW 通过在时间轴上“拉伸/压缩”,在保持序列顺序的前提下寻找最小累计距离,实现对长度不等、速度不同的序列的精准对齐。
- 核心是 动态规划,但已有多种加速/约束技术可根据实际需求选用。
- 其应用跨越语音、手写、动作、金融、医学等多个领域,是时间序列相似度度量的经典工具。
声明:文章均为AI生成,请谨慎辨别信息的真伪和可靠性!