动态时间规整 DTW 模拟器 返回
信号处理・时间序列分析

动态时间规整 DTW 模拟器

用于体验动态时间规整(Dynamic Time Warping, DTW)的工具,可以通过允许时间轴伸缩的最优对齐来比较速度或位相偏移的 2 个时间序列。改变序列长度、Sakoe-Chiba 窗口宽度、距离度量、位相偏移、振幅倍数,DTW 距离、朴素 L2 距离、成本矩阵单元数、内存降低率、加速比将实时更新。

参数设置
序列 1 长 N
pt
参考时间序列的采样数
序列 2 长 M
pt
比较对象时间序列的采样数
Sakoe-Chiba 窗口宽度
%
从对角线的最大偏离幅度(相对序列长度的 %)
距离度量
单元间距离 d(x,y) 的定义
真实位相偏移
%
序列 2 相对序列 1 的时间方向偏移量
振幅倍数
%
序列 2 相对序列 1 的振幅缩放倍数
计算结果
DTW 距离
单纯 L2 距离
对齐长度
约束单元数
内存降低 (%)
加速比
成本矩阵与最优对齐路径

上下为 2 个时间序列(白=序列 1,蓝=序列 2),右上为成本矩阵网格。蓝线为 Sakoe-Chiba 窗口约束下的最优路径,黄色高亮为窗口边界。

原时间序列 vs 对齐后
DTW 距离 vs 窗口宽度 (%)
理论・主要公式

$$D(i,j) = d(x_i, y_j) + \min\bigl\{D(i-1,j-1),\, D(i-1,j),\, D(i,j-1)\bigr\}$$

D = 累积成本矩阵,d = 点对点距离。通过动态规划逐单元更新,最终单元 D(N,M) 为 DTW 距离。

$$|i-j| \le w, \qquad w = \max\bigl(|N-M|,\ \lceil r\cdot\max(N,M)\rceil\bigr)$$

Sakoe-Chiba 窗口约束。r 为窗口宽度%,w 外的单元不计算。约束单元数为 N·(2w+1) − w·(w+1),可大幅降低内存和计算量。

$$\text{加速比} = \frac{N \cdot M}{N \cdot (2w+1) - w(w+1)}$$

相对于朴素全搜索 N·M 的加速倍数。窗口越窄加速越快,但最优路径偏离窗口的危险增加。

动态时间规整 (DTW) — 时间序列模式匹配

🙋
「动态时间规整」这个名字听起来很复杂,但本质上是做什么的呢?我听说是用来比较「同一波形但速度不同的 2 个时间序列」的…
🎓
你的理解基本正确。比如同一句话,一个人用 1 秒说完,另一个人用 1.3 秒慢慢说。如果纵向并排比较后相减,由于时间错位,距离就会爆炸。但 DTW 用动态规划搜索「伸缩其中一方后最匹配的对应关系(对齐)」。因此不同速度的同样模式会被判定为「相同」。这是 1978 年 NTT 的迫江(Sakoe)和千叶(Chiba)为语音识别提出的经典算法,历史悠久。
🙋
我在左边设置序列 1 长为 100,序列 2 长为 80。朴素 L2 距离是 101,但 DTW 距离只有 1.2。这是说「长度不同但基本相同的波形」被 DTW 理解为相同了,对吗?
🎓
完全正确。朴素 L2 是长度差 20 点加上 5 的惩罚,因此乘以 100 得出 100。但 DTW 会缩小时间轴,把序列 1 的 100 个点巧妙地对应到序列 2 的 80 个点,所以只有「波形本质区别」留下来。加上 10% 的位相偏移和 100%(即等倍)的振幅差,最终成本矩阵的 D(N,M) 就是 1.2。这就是为什么 DTW 到今天仍在心电图比较、步态分析、语音识别中活跃的原因。
🙋
右边的「约束单元数」和「内存降低 54%」是什么意思?窗口设 100% 时用 8000 个单元,20% 时只需 3680 个。
🎓
那就是 Sakoe-Chiba 窗口的效果。经典 DTW 需要填充所有 N·M = 100·80 = 8000 个单元。但现实中语音或心电图的对应关系不会太离开对角线。因此「只计算对角线周围宽度 w 以内的单元」就能大幅降低计算量和内存。窗口 20% 时 3680 个单元,内存降低 54%,加速比 8000/3680 = 2.17 倍。对于嵌入式设备或数千点长序列,这个差别就很显著了。
🙋
那窗口设 1% 这样极窄不更好吗?加速比能有 50 倍吧。
🎓
这是个陷阱。窗口太窄的话,真正的最优路径会被窗口挡在外面,距离反而会偏大。下面的 verdict 提示在窗口 5% 以下时会变 warn,就是这个原因。经验法则是语音识别用 5~10%,步态或心率用 10~20%,未知数据从 20~30% 开始。窗口宽度本质上是「能容许的最大速度变动范围」,之后用验证数据测误识别率逐步微调。
🙋
距离度量里有欧几里得、曼哈顿、余弦三种,是用来干什么的?
🎓
是用来改单元间距离 d(x,y) 的定义。标量时间序列(温度、股价、音压)用欧几里得是标准。如果数据噪声多、有离群值,曼哈顿(L1)更鲁棒,不容易被峰值拉偏。音声识别用的梅尔系数 MFCC 这种多维向量列,通常关心「方向」而非绝对值,所以用余弦距离。DTW 的动态规划骨架不变,只替换 d 的定义。同一个序列用不同度量 DTW 的路径和成本也会变化,建议切换来体验一下感觉。

常见问题

逐元素 L2 距离是将两个时间序列按相同索引纵向排列并取差,因此哪怕微小的速度差或位相偏移都会导致距离急剧增加。如果长度不同,甚至无法比较。DTW 使用动态规划填充成本矩阵 D,找到允许时间轴伸缩的最优路径。这样「以不同速度行走的同一步态的 2 个序列」距离会很小,不同长度的语音或心电图也可比较。本工具在默认 N=100、M=80 设置下,朴素 L2 距离为 101.0,而 DTW 距离为 1.2,显示出数量级的差异。
Sakoe-Chiba 窗口通过限制路径从对角线的最大偏离幅度 w,可大幅降低计算量和内存。窗口设为 100% 时,使用全部单元与无约束 DTW 相同;设为 0% 时,仅限对角线,接近朴素 L2 距离。实务中 5~20% 是常见做法,根据语音、步态等速度变动的容许范围凭经验决定。窗口过窄会导致最优路径偏离窗口外,造成误匹配,应通过验证数据观察误识别率后调整。
对于 1 维标量时间序列(温度、股价、音压),使用欧几里得或曼哈顿;要抑制离群值影响时,曼哈顿(L1)更加鲁棒。对于多维向量序列(如梅尔系数 MFCC 等特征),通常需要观察「方向」而非绝对大小,此时使用余弦距离。本工具仅替换点对点距离 d(x,y) 的定义,同一序列使用不同距离度量会改变最优路径和成本,可实际体验其效果。
经典 DTW 的时间复杂度为 O(N·M),当 N、M 数千时计算量和内存压力很大。FastDTW 通过在粗解析度下求得大致路径,再逐步精细化,实现 O(N) 复杂度。PrunedDTW 利用最小成本上界排除明显非最优单元。UCR-DTW 针对查询检索,彻底实施正规化和早期停止。N 为数千~数万时选用 FastDTW,数据库检索时用 UCR-DTW,嵌入式系统时采用 Sakoe-Chiba 窗口 + 直接编程为标准。

实际应用

语音识别・说话人确认:DTW 是其原始用途,在 DARPA 语音识别项目中成为标准算法。输入语音的 MFCC 序列与字典模板进行 DTW 照合,选择距离最小的单词。HMM 和深度学习出现后,儿童学习机、嵌入式语音命令等少词汇、低资源应用中 DTW 仍是主流。

心电图・脉波分析:患者心跳因呼吸和活动而速度波动,同一不正常心跳模式用朴素距离无法检测。将标准心拍与患者心拍用 DTW 照合,可高精度检测房颤、期前收缩(PVC)等异常。长时间 Holter 心电图记录中检索特定模式也是标准做法。

步态分析・动捕:同一人的步幅、速度日常变化,加速度传感器或 IMU 的时间序列直接比较很困难。DTW 吸收速度差后,可实现康复前后步态变化识别、跌倒预兆识别、特定运动模式识别。智能手表的跌倒检测也有应用。

股价・传感器异常检知:金融时间序列的图表模式识别(头肩式等)、制造设备振动诊断(电机噪音检测)、HVAC 能源消耗模式比较等,「同样模式以略微不同速度出现」的场景存在于各行各业。用 Numpy/Pandas + 轻量级 DTW 库实现简单,可无监督运行,优势明显。

常见误解与注意事项

最大的误解首先是「用 DTW 就能比较任何东西」。DTW 允许时间轴伸缩,但振幅差会直接加入成本。本工具中把「振幅倍数」改成 50% 或 200%,DTW 距离就会增加,就是这个原因。实务中必须在 DTW 之前进行 Z-score 正规化(平均值 0、标准差 1),否则同样模式的振幅不同会被错误判断为遥远。UCR-DTW 论文甚至称无正规化的 DTW 比较为「基准测试作弊」。

其次是「窗口越宽精度越高」的误解。虽然宽窗口可减少最优路径偏离窗外的风险,但同时也会容许噪声造成的「不自然伸缩」(路径大幅偏离对角线而形成假对应)。Ratanamahatana 等人的大规模实验表明,UCR 数据集中多数窗口 5~10% 最优,超过这范围精度停滞甚至下降。标准做法是从窄窗开始,逐步加宽,同时用验证数据观察误识别率。

最后是「DTW 距离是真正的距离(度量)」的误解。DTW 距离满足非负和对称性,但不满足三角不等式(可能 d(A,C) > d(A,B) + d(B,C))。因此无法使用基于距离不等式的高速化手段(度量树、VP-tree 等)。要加速最近邻搜索,标准做法是用 LB_Keogh 这类「下界」先筛选候选,再计算 DTW。本工具实现中也以 LB_Keogh 级前处理为前提。

使用指南

  1. 通过滑块或数值输入设置序列 1 长、序列 2 长(范围:10~500 样本)。
  2. 输入 Sakoe-Chiba 窗口宽度(%),定义对角线周边的约束区域(建议 0~50%)。
  3. 调整位相偏移(%)和振幅倍数,模拟时间序列的时间偏移和大小差异。
  4. 按「计算执行」按钮后,DTW 距离、单纯 L2 距离、对齐长度、约束单元数会实时显示。
  5. 通过内存降低率(%)和加速比,可确认窗口约束的计算效率提升。

具体计算示例

语音识别中,400 帧标准发话和 420 帧输入语音的比较场景。将 Sakoe-Chiba 窗口宽度设为 15%,约束单元数可降到约 5,200。与无约束 DTW(168,000 单元)的比较中,内存降低率约 97%,加速比 18~22 倍。加上 5% 位相偏移时,DTW 距离相对单纯 L2 距离(约 45.8)会得到 28~35 的最优路径,反映时间轴方向的动态调整。

实务中的注意点