DTW

其中1,2,3部分黑体及图片来自http://blog.youkuaiyun.com/zouxy09/article/details/9140207和http://www.cnblogs.com/tornadomeet/archive/2012/03/23/2413363.html

在大部分的学科中,时间序列是数据的一种常见表示形式。对于时间序列处理来说,一个普遍的任务就是比较两个序列的相似性。

       在时间序列中,需要比较相似性的两段时间序列的长度可能并不相等,在语音识别领域表现为不同人的语速不同。因为语音信号具有相当大的随机性,即使同一个人 在不同时刻发同一个音,也不可能具有完全的时间长度。而且同一个单词内的不同音素的发音速度也不同,比如有的人会把“A”这个音拖得很长,或者把“i”发的很短。在这些复杂情况下,使用传统的欧几里得距离无法有效地求的两个时间序列之间的距离(或者相似性)。

       例如图A所示,实线和虚线分别是同一个词“pen”的两个语音波形(在y轴上拉开了,以便观察)。可以看到他们整体上的波形形状很相似,但在时间轴上却是不对齐的。例如在第20个时间点的时候,实线波形的a点会对应于虚线波形的b’点,这样传统的通过比较距离来计算相似性很明显不靠谱。因为很明显,实线的a点对应虚线的b点才是正确的。而在图B中,DTW就可以通过找到这两个波形对齐的点,这样计算它们的距离才是正确的。

       也就是说,大部分情况下,两个序列整体上具有非常相似的形状,但是这些形状在x轴上并不是对齐的。所以我们在比较他们的相似度之前,需要将其中一个(或者两个)序列在时间轴下warping扭曲,以达到更好的对齐。而DTW就是实现这种warping扭曲的一种有效方法。DTW通过把时间序列进行延伸和缩短,来计算两个时间序列性之间的相似性。

       那如果才知道两个波形是对齐了呢?也就是说怎么样的warping才是正确的?直观上理解,当然是warping一个序列后可以与另一个序列重合recover。这个时候两个序列中所有对应点的距离之和是最小的。所以从直观上理解,warping的正确性一般指“feature to feature”的对齐。

注明:由B)图可以看出,模板序列中的一个点(这里的点可能是单个数值或是一个向量)可能对应测试序列中的好几个点(也有可能反过来,模板中的好几个点对应测试中的一个点),这正好反映了特征可能的延迟性。比如同一个音素,有的时候发得快,有的时候发的慢。这两种情况进行匹配时,你要把发得快的那个点完全匹配到发的慢的那几个点上。

2 原理

   动态时间规整DTW是一个典型的优化问题,它用满足一定条件的的时间规整函数W(n)描述测试模板和参考模板的时间对应关系,求解两模板匹配时累计距离最小所对应的规整函数。

      假设我们有两个时间序列QC,他们的长度分别是nm:(实际语音匹配运用中,一个序列为参考模板,一个序列为测试模板,序列中的每个点的值为语音序列中每一帧的特征值。例如语音序列Q共有n帧,第i帧的特征值(一个数或者一个向量)是qi。至于取什么特征,在这里不影响DTW的讨论。我们需要的是匹配这两个语音序列的相似性,以达到识别我们的测试语音是哪个词)

= q1, q2,…,qi,…, q;

= c1, c2,…, cj,…, c;

       如果n=m,那么就用不着折腾了,直接计算两个序列的距离就好了。但如果n不等于m我 们就需要对齐。最简单的对齐方式就是线性缩放了。把短的序列线性放大到和长序列一样的长度再比较,或者把长的线性缩短到和短序列一样的长度再比较。但是这 样的计算没有考虑到语音中各个段在不同情况下的持续时间会产生或长或短的变化,因此识别效果不可能最佳。因此更多的是采用动态规划(dynamic programming)的方法。

      为了对齐这两个序列,我们需要构造一个n x m的矩阵网格,矩阵元素(i, j)表示qicj两个点的距离d(qi, cj)(也就是序列Q的每一个点和C的每一个点之间的相似度,距离越小则相似度越高。这里先不管顺序),一般采用欧式距离,d(qi, cj)= (qi-cj)2(也可以理解为失真度)。每一个矩阵元素(i, j)表示点qicj的对齐。DP算法可以归结为寻找一条通过此网格中若干格点的路径,路径通过的格点即为两个序列进行计算的对齐的点。

       那么这条路径我们怎么找到呢?那条路径才是最好的呢?也就是刚才那个问题,怎么样的warping才是最好的。

注明:两个序列长度不同,不能使用欧氏距离进行匹配。使用dtw时,上图方格中的每个连续的点(开头(1,1)和结尾(m,n)还是要保证的)构成的曲线都有可能,这是就要找出代价最小的那条曲线,如图中标出的黑色曲线。

我们把这条路径定义为warping path规整路径,并用W来表示, W的第k个元素定义为wk=(i,j)k,定义了序列QC的映射。这样我们有:

     首先,这条路径不是随意选择的,需要满足以下几个约束:

1)边界条件:w1=(1, 1)wK=(m, n)。任何一种语音的发音快慢都有可能变化,但是其各部分的先后次序不可能改变,因此所选的路径必定是从左下角出发,在右上角结束。

2)连续性:如果wk-1= (a’, b’),那么对于路径的下一个点wk=(a, b)需要满足 (a-a’) <=1 (b-b’) <=1。也就是不可能跨过某个点去匹配,只能和自己相邻的点对齐。这样可以保证QC中的每个坐标都在W中出现。

3)单调性:如果wk-1= (a’, b’),那么对于路径的下一个点wk=(a, b)需要满足0<=(a-a’)0<= (b-b’)。这限制W上面的点必须是随着时间单调进行的。以保证图B中的虚线不会相交。

         结合连续性和单调性约束,每一个格点的路径就只有三个方向了。例如如果路径已经通过了格点(i, j),那么下一个通过的格点只可能是下列三种情况之一:(i+1, j)(i, j+1)或者(i+1, j+1)

      满足上面这些约束条件的路径可以有指数个,然后我们感兴趣的是使得下面的规整代价最小的路径:

      分母中的K主要是用来对不同的长度的规整路径做补偿。我们的目的是什么?或者说DTW的思想是什么?是把两个时间序列进行延伸和缩短,来得到两个时间序列性距离最短也就是最相似的那一个warping,这个最短的距离也就是这两个时间序列的最后的距离度量。在这里,我们要做的就是选择一个路径,使得最后得到的总的距离最小。

      这里我们定义一个累加距离cumulative distances。从(0, 0)点开始匹配这两个序列QC,每到一个点,之前所有的点计算的距离都会累加。到达终点(n, m)后,这个累积距离就是我们上面说的最后的总的距离,也就是序列QC的相似度。

      累积距离γ(i,j)可以按下面的方式表示,累积距离γ(i,j)为当前格点距离d(i,j),也就是点qicj的欧式距离(相似性)与可以到达该点的最小的邻近元素的累积距离之和:

注明:先把模板序列和测试序列的每个点相对应的距离算出来,构成一个m xn的矩阵。然后根据每个元素的代价计算一条最短路径。这里的计算要符合以上三个约束。即,一个点的代价=这个点的值+来自min{下、左、斜下这三个方向的值}。下、左、斜下这三个方向的值可以依次递归求得,直到(1,1)点

3 例子

这个例子中假设标准模板R为字母ABCDEF(6个),测试模板T为1234(4个)。R和T中各元素之间的距离已经给出。如下:

     既然是模板匹配,所以各分量的先后匹配顺序已经确定了,虽然不是一一对应的。现在题目的目的是要计算出测试模板T和标准模板R之间的距离。因为2个模板的 长度不同,所以其对应匹配的关系有很多种,我们需要找出其中距离最短的那条匹配路径。现假设题目满足如下的约束:当从一个方格((i-1,j-1)或者 (i-1,j)或者(i,j-1))中到下一个方格(i,j),如果是横着或者竖着的话其距离为d(i,j),如果是斜着对角线过来的则是 2d(i,j).其约束条件如下图像所示:

     其中g(i,j)表示2个模板都从起始分量逐次匹配,已经到了M中的i分量和T中的j分量,并且匹配到此步是2个模板之间的距离。并且都是在前一次匹配的结果上加d(i,j)或者2d(i,j),然后取最小值。

     所以我们将所有的匹配步骤标注后如下:

     怎么得来的呢?比如说g(1,1)=4, 当然前提都假设是g(0,0)=0,就是说g(1,1)=g(0,0)+2d(1,1)=0+2*2=4.

     g(2,2)=9是一样的道理。首先如果从g(1,2)来算的话是g(2,2)=g(1,2)+d(2,2)=5+4=9,因为是竖着上去的。

     如果从g(2,1)来算的话是g(2,2)=g(2,1)+d(2,2)=7+4=11,因为是横着往右走的。

     如果从g(1,1)来算的话,g(2,2)=g(1,1)+2*d(2,2)=4+2*4=12.因为是斜着过去的。

     综上所述,取最小值为9. 所有g(2,2)=9.

     当然在这之前要计算出g(1,1),g(2,1),g(1,2).因此计算g(I,j)也是有一定顺序的。

其基本顺序可以体现在如下:

     计算了第一排,其中每一个红色的箭头表示最小值来源的那个方向。当计算了第二排后的结果如下:

     最后都算完了的结果如下:

     到此为止,我们已经得到了答案,即2个模板直接的距离为26. 我们还可以通过回溯找到最短距离的路径,通过箭头方向反推回去。如下所示:

注明:不管哪个方向,我都只加上了其本身的数值,即d(i j),没有x2.得出的路径是一样的。

t=xlsread('D:\program files\matlab\重心欧式距离识别2.xls','dtw','C2:C35');
r=xlsread('D:\program files\matlab\重心欧式距离识别2.xls','dtw','H2:H35');
%计算序列帧数
n = size(t,1);
m = size(r,1);
% 帧匹配距离矩阵
d = zeros(n,m);
for i = 1:n
for j = 1:m
d(i,j) = sum((t(i,:)-r(j,:)).^2);
end
end
 % 累积距离矩阵
 D = ones(n,m) *realmax;
 D(1,1) = d(1,1);
 % 动态规划
 for i = 2:n
 for j = 1:m
 D1 = D(i-1,j);
 if j>1
 D2 = D(i-1,j-1);
 else
 D2 =realmax;
 end
 if j>2
 D3 = D(i-1,j-2);
 else
 D3 =realmax;
 end
 D(i,j) = d(i,j) + min([D1,D2,D3]);
 end
 end
 dist = D(n,m);
<think>我们正在讨论使用动态时间规整(DTW)进行时间序列聚类的方法及实现。根据提供的引用,我们可以总结如下: 1. DTW用于度量两个时间序列之间的相似性,尤其适用于不同长度、不同相位或速度的时间序列。 2. 在聚类中,DTW距离可以替代欧氏距离,用于K-means等聚类算法中。 3. 实现步骤通常包括:计算所有时间序列两两之间的DTW距离矩阵,然后使用聚类算法(如K-means)进行聚类。 引用[2][3][4]都提到了基于DTW的K-means时间序列聚类算法,并且有Matlab实现。引用[1][5]则提到了一种基于DTW的符号化时间序列聚类算法,但该算法对初始聚类中心敏感且容易陷入局部最优。 因此,我们可以介绍两种主要的DTW聚类方法: 1. 基于DTW距离的K-means聚类(常用且实现简单) 2. 基于DTW距离的层次聚类 另外,引用[4]还提到了一种组合模型:DTW-Kmeans-Transformer,用于时序聚类和状态识别。 下面,我将详细介绍基于DTW的K-means聚类方法及实现步骤,并给出Matlab代码示例(根据引用[2][3][4]的描述)。 ### 1. DTW距离简介 动态时间规整(DTW)是一种衡量两个时间序列之间相似度的方法,它通过扭曲时间轴来对齐序列,然后计算它们之间的最小距离。对于两个长度可能不同的时间序列$X=(x_1, x_2, \dots, x_n)$和$Y=(y_1, y_2, \dots, y_m)$,DTW距离的计算公式为: $$DTW(X, Y) = \min_{\pi} \sqrt{\sum_{(i,j) \in \pi} (x_i - y_j)^2}$$ 其中,$\pi$是路径集合,表示两个序列之间的对齐方式。 ### 2. 基于DTW的K-means聚类步骤 步骤1:计算距离矩阵 - 对于给定的$N$个时间序列,计算每两个序列之间的DTW距离,得到一个$N \times N$的距离矩阵$D$,其中$D_{ij}=DTW(TS_i, TS_j)$。 步骤2:确定聚类数目$K$ - 可以使用肘部法则(Elbow Method)或轮廓系数(Silhouette Coefficient)来确定最佳的聚类数目$K$。 步骤3:初始化聚类中心 - 由于DTW距离不满足欧氏空间的性质,我们不能直接计算均值作为中心。因此,通常采用以下方法: a) 随机选择$K$个时间序列作为初始中心。 b) 或者使用基于距离的方法(如k-means++)选择初始中心。 步骤4:分配样本到最近的聚类中心 - 对于每个时间序列,计算它与所有聚类中心的DTW距离,将其分配到距离最近的聚类中心所在的簇。 步骤5:更新聚类中心 - 由于DTW距离不能直接求平均,更新中心点通常使用DBA(DTW Barycenter Averaging)算法,即寻找一个序列,使得该序列到簇内所有序列的DTW距离之和最小。这是一个迭代优化过程。 步骤6:重复步骤4和步骤5,直到聚类中心不再变化或达到最大迭代次数。 ### 3. Matlab实现示例 根据引用[2][3][4],我们提供以下Matlab代码框架(注意:需要安装Signal Processing Toolbox,因为其中包含`dtw`函数): ```matlab % 步骤1:准备数据,假设时间序列存储在cell数组data中,每个元素是一个向量 data = { ... }; % 这里填入你的时间序列数据 % 步骤2:计算DTW距离矩阵 N = length(data); D = zeros(N, N); for i = 1:N for j = i+1:N D(i,j) = dtw(data{i}, data{j}); D(j,i) = D(i,j); % 对称矩阵 end end % 步骤3:确定聚类数目K(这里假设K已知,实际中需要选择) K = 3; % 步骤4:初始化聚类中心(随机选择K个样本作为初始中心) centroid_idx = randperm(N, K); centroids = data(centroid_idx); % 初始聚类中心(时间序列) % 步骤5:进行K-means聚类 max_iter = 100; cluster_labels = zeros(1, N); % 存储每个样本的簇标签 for iter = 1:max_iter % 分配样本到最近的聚类中心 for i = 1:N dists = zeros(1, K); for k = 1:K dists(k) = dtw(data{i}, centroids{k}); end [~, cluster_labels(i)] = min(dists); end % 更新聚类中心(使用DBA算法) new_centroids = cell(1, K); for k = 1:K cluster_data = data(cluster_labels == k); % 当前簇的所有时间序列 % 使用DBA算法计算新的中心 new_centroids{k} = dba(cluster_data); end % 检查中心是否变化(这里简化处理:直接比较中心序列是否相同,实际中可能比较距离) if isequal(centroids, new_centroids) break; else centroids = new_centroids; end end % 输出聚类结果 disp(cluster_labels); % 注意:DBA函数需要自己实现(下面提供DBA的简单实现) function avg_series = dba(series) % series: 一个cell数组,包含多个时间序列 % 使用迭代方法计算DTW重心平均序列 % 初始化:选择一个序列作为初始平均序列(例如第一个序列) avg_series = series{1}; max_iter = 10; for iter = 1:max_iter sum_series = zeros(size(avg_series)); % 用于累加对齐后的序列 count = zeros(size(avg_series)); % 每个位置被累加的次数 for i = 1:length(series) % 计算当前序列与平均序列的DTW路径 [~, ix, iy] = dtw(avg_series, series{i}); % 根据路径将当前序列的值累加到对应位置 temp = zeros(size(avg_series)); for j = 1:length(ix) temp(ix(j)) = temp(ix(j)) + series{i}(iy(j)); count(ix(j)) = count(ix(j)) + 1; end sum_series = sum_series + temp; end % 更新平均序列 new_avg_series = sum_series ./ count; % 检查收敛(这里简化) if norm(new_avg_series - avg_series) < 1e-5 break; end avg_series = new_avg_series; end end ``` 注意:上述DBA实现是一个简化版本,实际中可能更复杂。另外,Matlab的`dtw`函数返回的是距离和路径索引,我们利用路径索引来对齐序列。 ### 4. 算法优化与注意事项 - 计算效率:DTW距离计算复杂度较高,对于长时间序列,可以考虑使用下采样或FastDTW等加速方法。 - 初始中心:使用k-means++初始化可以改善聚类效果。 - 聚类数目:通过肘部法则或轮廓系数确定最佳K值。 - 避免局部最优:可以多次运行算法,选择最优结果。 引用[4]提到了一种组合模型:DTW-Kmeans-Transformer,其中Transformer可能用于特征提取,但引用中并未详细说明。在时间序列聚类中,也可以先使用Transformer等深度学习方法提取特征,然后再进行DTW聚类,但这超出了本文范围。 ### 5. 其他聚类方法 除了K-means,还可以使用层次聚类(Hierarchical Clustering): - 使用距离矩阵$D$,通过层次聚类算法(如UPGMA)构建树状图,然后根据设定的阈值或聚类数目进行切割。 ### 6. 总结 基于DTW的聚类方法能够有效处理时间序列在时间轴上的变形,适用于不同长度和相位的时间序列。但计算复杂度高是其主要缺点,因此在大规模数据集上需要优化。 §§相关问题§§ 1. DTW距离计算有哪些加速方法? 2. 如何评估时间序列聚类的效果? 3. 除了K-means,还有哪些聚类算法可以结合DTW距离? 4. DBA算法具体是如何工作的?有没有更高效的重心计算方法? 5. 在时间序列聚类中,如何处理高维时间序列?</think>### DTW聚类方法及实现 动态时间规整(DTW)是一种用于度量时间序列相似性的算法,尤其适用于长度不同或存在时间偏移的序列。结合聚类分析,可有效识别时间序列的模式。以下是基于DTW的聚类方法及实现步骤: --- ### **1. DTW聚类核心步骤** #### **步骤1:计算DTW距离矩阵** - **输入**:$N$ 个时间序列数据 $\{T_1, T_2, \dots, T_N\}$。 - **操作**:计算所有序列两两之间的DTW距离,得到对称距离矩阵 $D_{N \times N}$,其中: $$D_{ij} = \text{DTW}(T_i, T_j)$$ DTW距离通过动态规划对齐序列,最小化累积距离(公式见引用[^4])。 - **输出**:距离矩阵 $D$ 作为聚类输入。 #### **步骤2:选择聚类算法** 常见方法包括: - **K-means聚类**: - 将距离矩阵 $D$ 输入K-means算法。 - 需预先设定聚类数 $K$(通过肘部法则或轮廓系数确定[^4])。 - 更新聚类中心时,使用DTW重心平均(DBA)算法计算簇中心(见引用[^4])。 - **层次聚类**: - 基于距离矩阵 $D$ 构建树状图(如UPGMA方法)。 - 按预设阈值或聚类数切割树结构。 #### **步骤3:聚类结果评估** - **指标**:轮廓系数(衡量簇内紧密度和簇间分离度)、戴维森堡丁指数(DBI)。 - **可视化**:通过多维缩放(MDS)或t-SNE将高维距离矩阵降维展示。 --- ### **2. 实现方法(Matlab示例)** 根据引用[^2][^3][^4],实现流程如下: ```matlab % 步骤1:计算DTW距离矩阵 function D = compute_dtw_matrix(data) N = length(data); D = zeros(N, N); for i = 1:N for j = i+1:N D(i,j) = dtw(data{i}, data{j}); % 调用DTW算法 D(j,i) = D(i,j); % 对称矩阵 end end end % 步骤2:K-means聚类(基于DTW距离) function [labels, centers] = dtw_kmeans(data, K, max_iter) % 初始化:随机选择K个序列作为初始中心 centers = data(randperm(length(data), K)); labels = zeros(1, length(data)); for iter = 1:max_iter % 分配样本到最近中心 for i = 1:length(data) dists = arrayfun(@(k) dtw(data{i}, centers{k}), 1:K); [~, labels(i)] = min(dists); end % 更新中心:使用DBA算法(DTW Barycenter Averaging) for k = 1:K cluster_data = data(labels == k); centers{k} = dba(cluster_data); % DBA计算簇中心 end end end % DBA算法实现(简化版) function avg_series = dba(series) % 初始化:取第一个序列为初始平均序列 avg_series = series{1}; for iter = 1:10 % 迭代10次 aligned = cell(1, length(series)); for i = 1:length(series) [~, path] = dtw(avg_series, series{i}); aligned{i} = series{i}(path(:,2)); % 根据DTW路径对齐序列 end avg_series = mean(cell2mat(aligned), 1); % 计算均值序列 end end ``` --- ### **3. 优化与注意事项** 1. **初始中心敏感性问题**(引用[^1][^5]): - 使用 **K-means++** 初始化中心点,避免局部最优解。 - 多次运行算法取最佳结果。 2. **计算效率优化**: - 采用 **FastDTW** 近似算法(时间复杂度 $O(n)$)。 - 并行计算距离矩阵(尤其适合大规模数据)。 3. **符号化序列处理**(引用[^1][^5]): - 对时间序列提取关键点(如极值点),转化为符号序列(如SAX表示法)。 - 在符号序列上计算DTW距离,减少计算量。 --- ### **4. 应用场景** - **工业设备状态监测**:聚类振动传感器时序数据,识别异常模式[^4]。 - **金融行为分析**:对股票价格序列聚类,发现相似波动模式。 - **医疗诊断**:对心电图(ECG)序列分组,辅助疾病分类[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值