动态时间规整DWT(Dynamic Time Warping)

1. DTW作用

动态时间规整算法,能够将两个代表同一个类型的事物的不同长度序列进行时间上的“对齐”。
比如在语音识别中,同一个字母,由不同人发音,时间长短不一,但信号相似。故需要用一个函数拉长或者缩短其中一个信号,使得它们之间的误差达到最小。
在这里插入图片描述
如图所示,实线和虚线分别是同一个词的两个语音波形。可以看到他们整体上的波形形状很相似,但在时间轴上却是不对齐的。
例如在第20个时间点的时候,实线波形的a点会对应于虚线波形的b’点,这样传统的通过比较距离来计算相似性很明显不靠谱。而实际上实线的a点对应虚线的b点才是正确的。

2. DTW实现步骤

  1. 假设有两个序列A={a1,a2,a3,…,am} ,B={b1,b2,b3,…,bn},维度m > n
  2. 用欧式距离计算出这两个序列间每两点之间的距离得到 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)
  1. 计算从D(a1,b1)到D(am,bn)的最短路径。过程需满足:假如当前节点是D(ai, bj),那么下一个节点必须是在D(i+1, j),D(i, j+1),D(i+1, j+1)之间选择
  2. 最终再次从起点到终点,计算最短累计距离

例:

已知: 两个列向量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)动态时间规整——简单易懂

猜你喜欢

转载自blog.csdn.net/m0_51487301/article/details/124635015