动态时间规整(Dynamic Time Warping,DTW)用于比较具有不同长度的两个阵列或时间序列之间的相似性或距离。
DTW (Dynamic time warping)算法是可以度量两个独立时间序列的相似度的一种方法。曾被广泛应用在单词音频的匹配上。该方法主要用来解决在两段序列的时长不同的情况下,进行相似度的判断。
① 计算两个特征点之间的欧氏距离。构成一个 n*m 矩阵,距离矩阵。
②计算累计距离 得到DP矩阵。
③ 当计算完整个DP矩阵 后,右上角的值(不一定是右上角,就是最终的得到的那个矩阵角上的值)即为两个序列的累计距离。
④从右上角往左下角回溯,找到累计距离最短的路径,根据路径可以得到各个点之间的对应关系。
DTW 是一种计算两个给定序列(例如时间序列)之间的最佳匹配的方法:
- 第一个序列中的每个索引必须与另一个序列中的一个或多个索引匹配,反之亦然
- 第一个序列的第一个索引必须与另一个序列的第一个索引匹配(但它不必是唯一匹配)
- 第一个序列的最后一个索引必须与另一个序列的最后一个索引匹配(但不一定是唯一匹配)
- 第一个序列的索引到另一个序列的索引的映射必须是单调递增的,并且反之亦然,即如果 j > i 是来自第一个序列的索引,则在另一个序列中不能有两个索引 l > k,这样索引 i 与索引 l 匹配,索引 j 与索引 k 匹配,反之亦然
最佳匹配由满足所有其余部分的匹配表示 rictions 和 rules 并且具有最小代价,其中代价计算为每个匹配的索引对在它们的值之间的绝对差的总和。
总而言之,head 和 tail 必须在位置上匹配,没有交叉匹配,也没有被遗漏。
动态时间规整(DTW)可以在一定的限制下找到两个给定(时间相关)序列之间的最佳对齐(图 4.1)。直观地说,序列以非线性方式规整以相互匹配。最初,DTW 已被用于比较自动语音识别中的不同语音模式,参见 [170]。在数据挖掘和信息检索等领域,DTW 已成功应用于自动处理与时间相关时变和不同速度的数据。
算法:
clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
rng('default')
load('zuerich-monthly-sunspot-numbers-.mat')
a = Zuerichmonthlysunspotnumbers1(1:600);
b = Zuerichmonthlysunspotnumbers1(1000:1600);
figure() % 创建一个新的图形窗口
subplot(4,1,1) % 在4x1的子图中选择第1个位置作为当前绘图区域
plot(a) % 绘制a的数据
subplot(4,1,2) % 选择第2个位置作为当前绘图区域
plot(b) % 绘制b的数据
a= dwt(a,'haar'); % 对a进行第一次'haar'小波变换
a= dwt(a,'haar'); % 对a进行第二次'haar'小波变换
b= dwt(b,'haar'); % 对b进行第一次'haar'小波变换
b= dwt(b,'haar'); % 对b进行第二次'haar'小波变换
subplot(4,1,3) % 选择第3个位置作为当前绘图区域
plot(a, 'blue') % 以蓝色绘制经过两次小波变换后的a的数据
subplot(4,1,4) % 选择第4个位置作为当前绘图区域
plot(b, 'blue') % 以蓝色绘制经过两次小波变换后的b的数据
% 调用test_dtwm函数,将处理后的a、b及三个参数传入。函数的具体作用需要查看test_dtwm的定义来确定。
[D, L, R, P, OP] = test_dtwm(a, b, 0.3, 30/4, 100/4);