DTW算法——Matlab实现

article/2025/9/12 11:55:44

概述

DTW (Dynamic time warping)算法是可以度量两个独立时间序列的相似度的一种方法。曾被广泛应用在单词音频的匹配上。该方法主要用来解决在两段序列的时长不同的情况下,进行相似度的判断
例子1
上图中,左侧时长相等,可以逐一进行欧式距离的计算,右侧则是时长不等,经过DTW之后得到的结果,可以看出来两个序列并不是一一对应的。
例子2
再比如上面左图,要得到蓝色序列与红色序列的相似度,因为可以看出来两个序列有经过平移的迹象,直接用一一匹配的方法显然是不合理的。要得到左图的对应效果,就需要用DTW方法。

算法原理与步骤

① 计算两个特征点之间的欧氏距离。构成一个 n*m 矩阵,距离矩阵。
在这里插入图片描述
②计算累计距离 得到DP矩阵
在这里插入图片描述
计算后的的值,放到DP矩阵中,为了更加直观的理解,把这两个序列绘图如下:
在这里插入图片描述
其实在计算过程中,计算的顺序其实是有方向的。网上有很多的博客说的也非常清楚,博主在这里不再赘述。为了更好的理解计算过程,列举一个非常非常非常非常简单的例子来帮助理解,如下图: A B为带有两个特征值的序列,右边是其对应的DP矩阵的求解步骤。
在这里插入图片描述
③ 当计算完整个DP矩阵 后,右上角的值(不一定是右上角,就是最终的得到的那个矩阵角上的值)即为两个序列的累计距离。

④从右上角往左下角回溯,找到累计距离最短的路径,根据路径可以得到各个点之间的对应关系。

算法的实现

博主是利用matlab实现的这个算法,只是因为利用matlab可以很方便的查看矩阵和画图,检查算法的正确性,但是没有调用matlab中成形的函数,所以利用这个思路,用C/C++也是可以实现的,便于移植。

首先要写好两个函数。
一个是Get Min();用来得到三个值中的最小值,在计算 DP矩阵 时用得到。

function min = GetMin(a,b,c)
if(a <= b && a <= c)min = a;
elseif(b <= a && b <= c)min = b;
elseif(c <= b && c <= a)min = c;
end
end

另一个是GetMinIndex();这是用来在得到 DTW 结果之后,方便显示特征点匹配的结果,返回两个序列对应特征点的索引。

function [index_i,index_j] = GetMinIndex(a,b,c,i,j)
%a 是相邻左上角,b 是相邻正上方,c说相邻正左方 
%i 是当前的x坐标  j 是当前 y坐标
if(a <= b && a <= c)index_i = i-1;index_j = j-1;
elseif(b <= a && b <= c)index_i = i-1;index_j = j;
elseif(c <= b && c <= a)index_i = i;index_j = j-1;
end
end

接下来就是主函数了

%生成两个有明显平移性质的时间序列
x = zeros(1,50);
for i = 1:50x(i) = sin(i*2*pi/50)+2;
end
y = zeros(1,50);
for i = 1:50y(i) = sin(i*2*pi/50 + pi/6)+2;
end
x_len = length(x);
y_len = length(y);
plot(1:x_len,x);hold on
plot(1:y_len,y);hold on
%计算两序列每个特征点的距离矩阵
distance = zeros(x_len,y_len);
for i = 1:x_lenfor j=1:y_lendistance(i,j) = (x(i)-y(j)).^2;end
end
%计算两个序列
DP = zeros(x_len,y_len);
DP(1,1) = distance(1,1);
for i=2:x_lenDP(i,1) = distance(i,1)+DP(i-1,1);
end
for j=2:y_lenDP(1,j) = distance(1,j)+DP(1,j-1);
end
for i=2:x_lenfor j=2:y_lenDP(i,j) = distance(i,j) + GetMin(DP(i-1,j),DP(i,j-1),DP(i-1,j-1));end
end
%回溯,找到各个特征点之间的匹配关系
i = x_len;
j = y_len;
while(~((i == 1)&&(j==1)))plot([i,j],[x(i),y(j)],'b');hold on %画出匹配之后的特征点之间的匹配关系if(i==1)index_i = 1index_j = j-1elseif(j==1)index_i = i-1index_j = 1else[index_i,index_j] = GetMinIndex(DP(i-1,j-1),DP(i-1,j),DP(i,j-1),i,j)endi = index_i;j = index_j;  
end 

最终效果如下图,可以看出来是考虑了平移之后的匹配。
效果图

总结

DTW算法的计算复杂度是比较高的,如果数据量较大,使用DTW的matlab函数将会十分耗时,因为matlab的循环十分耗时。因此可以考虑用matlab调用DTW的C或C++函数,计算时间大大减少。例如我之前用过的一个数据,用DTW的matlab函数需要计算几十个小时,而调用DTW的C函数,只需要几十秒就能完成。我这里有之前已经配置好的C函数,效率很快。但是如果数据量较小,使用DTW的matlab函数也比较快。


http://chatgpt.dhexx.cn/article/1TyKlsvU.shtml

相关文章

DTW简介

dtw算法主要针对序列匹配提出的&#xff0c;尤其是当序列出现一定的飘移&#xff0c;欧氏距离度量就会失效。dtw常用在语音匹配当中&#xff0c;在图像处理里面也有一定的应用。 现在有两个序列X,Y. X[2,3,4,7,9,2,1,2,1],Y[1,1,1,1,2,3,3,4,7,8,9,1,1,1,1] 绘制在坐标轴上如…

DTW算法

dtw算法主要针对序列匹配提出的&#xff0c;尤其是当序列出现一定的飘移&#xff0c;欧氏距离度量就会失效。dtw常用在语音匹配当中&#xff0c;在图像处理里面也有一定的应用。 现在有两个序列X,Y. X[2,3,4,7,9,2,1,2,1],Y[1,1,1,1,2,3,3,4,7,8,9,1,1,1,1] 绘制在坐标轴上如…

HMM学习笔记_1(从一个实例中学习DTW算法)

DTW为(Dynamic Time Warping,动态时间归准)的简称。应用很广&#xff0c;主要是在模板匹配中&#xff0c;比如说用在孤立词语音识别&#xff0c;计算机视觉中的行为识别&#xff0c;信息检索等中。可能大家学过这些类似的课程都看到过这个算法&#xff0c;公式也有几个&#xf…

DTW(Dynamic Time Warping)动态时间规整——简单易懂

DTW可以用来干什么呢&#xff1f; DWT可以计算两个时间序列的相似度&#xff0c;尤其适用于不同长度、不同节奏的时间序列&#xff08;比如不同的人读同一个词的音频序列&#xff09;。距离越近&#xff0c;相似度越高。 DTW在语音中的运用&#xff1a; 在实际应用中&#xff…

DTW(动态时间归整)算法的前世今生

今天和大家分享一下我刚刚学习到的DTW算法。 主要从以下几个方面进行介绍&#xff1a; 1. DTW算法的提出和应用场景。 2. DTW算法的基本原理和计算过程。 3. DTW算法的具体代码实现。 一、DTW算法的提出和应用场景 Dynamic Time Warping&#xff08;简称&#xff1a;DTW&…

时间序列匹配之dtw的python实现(二)

简介 在上一篇文章里我们介绍了dtw库的使用&#xff0c;但其限制太多&#xff0c;不够灵活&#xff0c;且作图不够方便&#xff0c;因此我们来介绍一个更加复杂的库----dtw-python。它是R语言中dtw实现的python版本&#xff0c;基本的API是对应的&#xff0c;它的优势在于能够…

DTW算法详解

DTW算法详解 1.DTW 1.1 时序相似度 在时间序列数据中&#xff0c;一个常见的任务是比较两个序列的相似度&#xff0c;作为分类或聚类任务的基础。那么&#xff0c;时间序列的相似度应该如何计算呢&#xff1f; “ 经典的时间序列相似性度量方法总体被分为两 类: 锁步度量(lo…

动态时间规整算法(DTW)原理及代码实现

Dynamic Time Warping&#xff08;DTW&#xff09;动态时间规整算法 Dynamic Time Warping&#xff08;DTW&#xff09;是一种衡量两个时间序列之间的相似度的方法&#xff0c;主要应用在语音识别领域来识别两段语音是否表示同一个单词。 1. DTW方法原理 在时间序列中&#…

LOIC网站压力测试工具

官网下载&#xff1a;https://sourceforge.net/projects/loic/ 百度云&#xff1a;https://pan.baidu.com/s/1VVUjLqtq1mMAD-TJIAnhnQ 1.软件解压后运行&#xff0c;界面如图 2.然后可以在url处输入想要测试的网站网址&#xff0c;也可以输入ip地址&#xff0c;输入完之后要…

十大抢手的网站压力测试工具

两天&#xff0c;jnj在本站发布了《如何在低速率网络中测试 Web 应用》&#xff0c;那是测试网络不好的情况。而下面是十个免费的可以用来进行Web的负载/压力测试的工具&#xff0c;这样&#xff0c;你就可以知道你的服务器以及你的WEB应用能够顶得住多少的并发量&#xff0c;以…

10大主流压力测试工具

市面上流行的压力/负载/性能测试工具多是来自国外&#xff0c;近年来国内的性能测试工具也如雨后春笋崛起。同时由于开发的目的和侧重点不同&#xff0c;其功能也有很大差异&#xff0c;下面就为您简单介绍10款目前最常见的测试产品。 1、kylinTOP测试与监控平台&#xff08;商…

jmeter压力测试

一、Jmeter数据库压力测试 1.1.先配置jdbc&#xff08;数据库连接&#xff09;驱动 1、启动jmeter&#xff0c;打开界面工具&#xff0c;添加一个线程组 2、添加一个JDBC Connection Configuration&#xff0c;连接池配置文件。右键线程组【添加】--【配置元件】- -【JDBC Co…

网站压力测试的几种方法

百度TcpCopy&#xff0c;得到的结果是&#xff1a;TCPCopy是一种请求复制&#xff08;所有基于tcp的packets&#xff09;工具&#xff0c;可以把在线流量导入到测试系统中去。曾经应用于网易的广告投放系统&#xff0c;urs系统&#xff0c;nginx hmux协议等系统&#xff0c;避免…

压力测试工具

目录 1 性能测试... 2 2 压力测试&#xff08;Stress Test&#xff09;... 2 2.1 网站测试... 2 2.2 系统测试要求... 3 3 测试工具... 3 3.1 Webbench. 4 3.1.1 Ubuntu 下载安装... 5 3.1.2 w…

开发工具-压力测试工具 ab

开发工具-压力测试工具 ab 写在前面ab工具简介下载 ab使用 ab测试结果报告信息解读 关于 post 请求的压力测试关于需要登录的测试关于报错 写在前面 在学习ab工具之前&#xff0c;我们需了解几个关于压力测试的概念 吞吐率&#xff08;Requests per second&#xff09; 概念&a…

【转】十大抢手的网站压力测试工具

两天&#xff0c;jnj在本站发布了《 如何在低速率网络中测试 Web 应用 》&#xff0c;那是测试网络不好的情况。而下面是十个免费的可以用来进行Web的负载/压力测试的工具&#xff0c;这样&#xff0c;你就可以知道你的服务器以及你的WEB应用能够顶得住多少的并发量&#xff…

windows环境压力测试工具Apache ab安装及使用(apache benchmark)

1.首先下载并解压安装包,下载地址Apache Haus Downloads 2.解压到C盘,并进入bin目录,复制路径,并配置环境变量,保存后就OK了 3.可以开始使用了,测试一下吧 ab -n 2000 -c 10 -k http://localhost:6868/dataScreenLibrary/findPublicShareByPk?id4 常用参数详解&#xff1a; …

Jmeter--压力测试工具

前言&#xff1a;Jmeter是一款抗压测试工具&#xff0c;具体是干嘛用的相信在来到这的小伙伴都对它有了一些基本的了解&#xff0c;这里就不做过多的赘述了&#xff0c;本文主要是记录一下Jmeter的下载使用过程是怎么样的~ 一、下载 官网地址&#xff1a;Apache JMeter - Dow…

JMeter压力测试工具

1 简介 JMeter是开源软件Apache基金会下的一个性能测试工具&#xff0c;用来测试部署在服务器端的应用程序的性能。 2 下载安装和启动 JMeter可以在JMeter的官方网站下载(https://jmeter.apache.org/) 官网找到Download 下载zip压缩包后, 解压到本地就行 进入/bin目录, 运…

简单好用的网站压力测试工具

简单好用的网站压力测试工具 下载&#xff1a;https://files.cnblogs.com/files/wordblog/%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7.rar