算法笔记-DTW动态时间规整
动态时间规整/规划(Dynamic Time Warping, DTW)是一个比较老的算法,大概在1970年左右被提出来,最早用于处理语音方面识别分类的问题。
1.简介
简单来说,给定两个离散的序列(实际上不一定要与时间有关),DTW能够衡量这两个序列的相似程度,或者说两个序列的距离。同时DTW能够对两个序列的延展或者压缩能够有一定的适应性,举个例子,不同人对同一个词语的发音会有细微的差别,特别在时长上,有些人的发音会比标准的发音或长或短,DTW对这种序列的延展和压缩不敏感,所以给定标准语音库,DTW能够很好得识别单个字词,这也是为什么DTW一直被认为是语音处理方面的专门算法。实际上,DTW虽然老,但简单且灵活地实现模板匹配,能解决很多离散时间序列匹配的问题,视频动作识别,生物信息比对等等诸多领域都有应用。
例如下图,有两个呈现正弦规律序列,其中蓝色序列是稍微被拉长了。即使这两个序列,不重合,但是我们也可以有把握说这两个序列的相似程度很高(或者说这两个序列的距离很小)。
DTW能够计算这两个序列的相似程度,并且给出一个能最大程度降低两个序列距离的点到点的匹配。见下图,其中黑色与红色曲线中的虚线就是表示点点之间的一个对应关系。
也就是说,两个比对序列之间的特征是相似的,只是在时间上有不对齐的可能,这个算法名中的Time Warping,指的就是对时间序列进行的压缩或者延展以达到一个更好的匹对。
2.简单的例子
比如说,给定一个样本序列X和比对序列Y,Z:
X:3,5,6,7,7,1
Y:3,6,6,7,8,1,1
Z:2,5,7,7,7,7,2
请问是X和Y更相似还是X和Z更相似?
DTW首先会根据序列点之间的距离(欧氏距离),获得一个序列距离矩阵 M ,其中行对应X序列,列对应Y序列,矩阵元素为对应行列中X序列和Y序列点到点的欧氏距离:
X和Y的距离矩阵:
X/Y | 3 | 6 | 6 | 7 | 8 | 1 | 1 |
---|---|---|---|---|---|---|---|
3 | 0 | 3 | 3 | 4 | 5 | 2 | 2 |
5 | 2 | 1 | 1 | 2 | 3 | 4 | 4 |
6 | 3 | 0 | 0 | 1 | 2 | 5 | 5 |
7 | 4 | 1 | 1 | 0 | 1 | 6 | 6 |
7 | 4 | 1 | 1 | 0 | 1 | 6 | 6 |
1 | 2 | 5 | 5 | 6 | 7 | 0 | 0 |
然后根据距离矩阵生成1损失矩阵(Cost Matrix)或者叫累积距离矩阵
1. 第一行第一列元素为 M 的第一行第一列元素,在这里就是0;
2. 其他位置的元素 (
X/Y | 3 | 6 | 6 | 7 | 8 | 1 | 1 |
---|---|---|---|---|---|---|---|
3 | 0 | 3 | 6 | 10 | 15 | 17 | 19 |
5 | 2 | 1 | 2 | 4 | 7 | 11 | 15 |
6 | 5 | 1 | 1 | 2 | 4 | 9 | 14 |
7 | 9 | 2 | 2 | 1 | 2 | 8 | 14 |
7 | 13 | 3 | 3 | 1 | 2 | 8 | 14 |
1 | 15 | 8 | 8 | 7 | 8 | 2 | 2 |
最后,两个序列的距离,由损失矩阵最后一行最后一列给出,在这里也就是2。
同样的,计算X和Z的距离矩阵:
X/Z | 2 | 5 | 7 | 7 | 7 | 7 | 2 |
---|---|---|---|---|---|---|---|
3 | 1 | 2 | 4 | 4 | 4 | 4 | 1 |
5 | 3 | 0 | 2 | 2 | 2 | 2 | 3 |
6 | 4 | 1 | 1 | 1 | 1 | 1 | 4 |
7 | 5 | 2 | 0 | 0 | 0 | 0 | 5 |
7 | 5 | 2 | 0 | 0 | 0 | 0 | 5 |
1 | 1 | 4 | 6 | 6 | 6 | 6 | 1 |
和损失矩阵:
X/Z | 2 | 5 | 7 | 7 | 7 | 7 | 2 |
---|---|---|---|---|---|---|---|
3 | 1 | 3 | 7 | 11 | 15 | 19 | 20 |
5 | 4 | 1 | 3 | 5 | 7 | 9 | 12 |
6 | 8 | 2 | 2 | 3 | 4 | 5 | 9 |
7 | 13 | 4 | 2 | 2 | 2 | 2 | 7 |
7 | 18 | 6 | 2 | 2 | 2 | 2 | 7 |
1 | 19 | 10 | 8 | 8 | 8 | 8 | 3 |
所以,X和Y的距离为2,X和Z的距离为3,X和Y更相似。
3.定义
有一个具体例子作为帮助,我们再来定义DTW算法。
假设给定两个序列,样本序列 X=(x1