1. DTW作用
动态时间规整算法,能够将两个代表同一个类型的事物的不同长度序列进行时间上的“对齐”。
比如在语音识别中,同一个字母,由不同人发音,时间长短不一,但信号相似。故需要用一个函数拉长或者缩短其中一个信号,使得它们之间的误差达到最小。
如图所示,实线和虚线分别是同一个词的两个语音波形。可以看到他们整体上的波形形状很相似,但在时间轴上却是不对齐的。
例如在第20个时间点的时候,实线波形的a点会对应于虚线波形的b’点,这样传统的通过比较距离来计算相似性很明显不靠谱。而实际上实线的a点对应虚线的b点才是正确的。
2. DTW实现步骤
- 假设有两个序列A={a1,a2,a3,…,am} ,B={b1,b2,b3,…,bn},维度m > n
- 用欧式距离计算出这两个序列间每两点之间的距离得到 D(ai, bj),其中1 ≤ i ≤m,1 ≤ j ≤ n,得到下表:
D(a1,b1) | D(a1,b2) | … | D(a1,bn) |
---|---|---|---|
D(a2,b1) | D(a2,b2) | … | D(a2,bn) |
… | … | … | … |
D(an,b1) | D(an,b2) | … | D(an,bn) |
- 计算从D(a1,b1)到D(am,bn)的最短路径。过程需满足:假如当前节点是D(ai, bj),那么下一个节点必须是在D(i+1, j),D(i, j+1),D(i+1, j+1)之间选择
- 最终再次从起点到终点,计算最短累计距离
例:
已知: 两个列向量a=[8 9 1]‘,b=[ 2 5 4 6]’
(其中’代表转置,也就是把行向量转换为列向量了)
求: 两个向量利用动态时间规整以后的最短距离
第一步: 计算对应点的欧式距离矩阵 d 得:
6 3 4 2
7 4 5 3
1 4 3 5
其中6是8到2的距离,3是8到5的距离,7是9到2的距离
第二步: 计算累加距离D(从起点6出发到达终点5的累加距离)
6 9 13 15
13 10 14 16
14 14 13 18
计算方法如下:
D(1,1) = D(1,1) = 6
D(1,2) = D(1,1) + D(1,2) = 9
…
D(2,2) = min(D(1,2),D(1,1),D(2,1)) + d(2,2) = 6 + 4 = 10
…
D(m,n) = min(D(m-1,n),D(m-1,n-1),D(m,n-1)) + D(m,n)
在这里插入图片描述
即每个元素位置的累积距离数值为它左边,上边以及左上边的三个数值中的最小值加上元素本身的数值。
3. Mtalab代码实现
% 输入两段离散序列,输出两段序列的总欧式距离
function dist = dtw(t,r)
n = size(t,1);
m = size(r,1);
d = zeros(n,m);
for i = 1:n
for j = 1:m
d(i,j) = (t(i,:)-r(j,:)).^2;
end
end
D = ones(n,m) * realmax;
D(1,1) = d(1,1);
for i = 1:n
for j = 1:m
if i==1&&j==1
continue;
end
if i>1
D1 = D(i-1,j);
else
D1 = realmax;
end
if j>1&&i>1
D2 = D(i-1,j-1);
else D2 = realmax;
end
if j>1
D3 = D(i,j-1);
else
D3 = realmax;
end
D(i,j) = d(i,j) + min([D1,D2,D3]);
end
end
dist = D(n,m);
4. 参考资料
【重大修改】动态时间规整(Dynamic Time Warping)
DTW算法
离散序列的一致性度量方法:动态时间规整(DTW)
DTW(Dynamic Time Warping)动态时间规整——简单易懂