DTW(动态时间规整)学习笔记
从一个直观问题开始 在处理音频、语音或其他时间序列数据时,我们几乎一定会遇到这样一个问题:如果两段信号在“内容”上是相似的,但在时间推进的速度上并不一致,我们还能不能判断它们是相似的吗? 这个问题在真实场景中非常常见。例如,两个人唱的是同一段旋律,但一个人唱得偏快、另一个人唱得偏慢;学生在视唱时可能会因为犹豫而放慢速度,唱错后回拉重唱,或者在某些位置突然加速;同一句话,被不同的人用不同的语速、不同的停顿方式说出来。 在这些情况下,如果我们强行要求“第 1 帧对第 1 帧,第 2 帧对第 2 帧”,那么几乎所有真实样本都会被简单粗暴地判定为“不相似”。 DTW(Dynamic Time Warping,动态时间规整) 正是为了解决这一类“时间轴对不上,但内容本质相似”的问题而提出的。它关注的并不是时间点是否严格一致,而是:在允许时间发生伸缩的前提下,两段序列能不能以一种合理的方式对应起来。 DTW 的核心思想:允许时间被拉伸 从直觉上看,DTW 的思想并不复杂。它并不要求两段序列在时间上同步前进,而是允许一段序列在某些地方“走快一点”,在另一些地方“走慢一点”,只要整体趋势和形状尽可能一致即可。换句话说,DTW 关注的是“形状是否相似”,而不是“时间是否对齐”。 在数学上,我们通常将两段时间序列表示为: \[ X = (x_1, x_2, \dots, x_N), \quad Y = (y_1, y_2, \dots, y_M) \] 这里的 \(x_i\) 和 \(y_j\) 并不是原始音频采样点,而是在第 \(i\)、第 \(j\) 个时间位置提取到的特征帧。需要注意的是,序列长度 \(N\) 和 \(M\) 并不要求相等,这本身就已经体现了“时间不必同步”的思想。 接下来,DTW 会构造一个大小为 \(N \times M\) 的距离矩阵: \[ D(i, j) = \lVert x_i - y_j \rVert \] 你可以把这个矩阵理解为一个全面的对照表:它回答的问题是,“序列 X 在第 \(i\) 个时刻的状态,与序列 Y 在第 \(j\) 个时刻的状态,到底有多不像?”...