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

article/2025/9/12 12:54:09

今天和大家分享一下我刚刚学习到的DTW算法。
主要从以下几个方面进行介绍:

1. DTW算法的提出和应用场景。
2. DTW算法的基本原理和计算过程。
3. DTW算法的具体代码实现。

一、DTW算法的提出和应用场景

Dynamic Time Warping(简称:DTW)算法诞生有一定的历史了(日本学者Itakura提出),它出现的目的也比较单纯,是一种衡量两个长度不同的时间序列的相似度的方法。应用也比较广,主要是在模板匹配中,比如说用在孤立词语音识别(识别两段语音是否表示同一个单词),手势识别,视频动作识别,数据挖掘和信息检索等中,曾经是语音识别的一种主流方法。

二、DTW算法的基本原理和计算过程

前言:

在时间序列中,需要比较相似性的两段时间序列的长度可能并不相等。其中,在语音识别领域表现为不同人的语速不同。因为语音信号具有相当大的随机性,即使同一个人 在不同时刻发同一个音,也不可能具有完全的时间长度。而且同一个单词内的不同音素的发音速度也不同,比如有的人会把“A”这个音拖得很长,或者把“i”发的很短。在这些复杂情况下,使用传统的欧几里得距离无法直接有效地求出两个时间序列之间的距离(或者相似性)。
反映在视频动作识别上,我们就可以将许多时间长短不一的动作视频片段和现有已知某个动作的视频片段(即模板)进行相似度的计算,以此来判断未知的动作视频片段属于哪个动作的可能性更大一些,并且在这个过程中我们还消除了两个视频片段之间的时间长短不一的问题。
如下图表述不同序列之间的匹配:

在这里插入图片描述


【注:实线为模板序列,虚线为测试序列。】

下面陈述一下基本的原理问题:

无论在训练和建立模型阶段还是在识别阶段,都先采用端点算法确定时间序列的起点和终点。以存入模板库(训练数据集)的各个时间序列称为参考模板(训练数据),一个参考模板可表示为R={R(1),R(2),……,R(m),……,R(M)},m为模板时间序列中的时序标号,m=1为起点序列,m=M为终点序列,因此M为该模板所包含的时间序列中序列总数,R(m)为模板时间序列中第m个序列的特征向量。所要识别的某个时间序列称为测试模板(测试数据),可表示为T={T(1),T(2),……,T(n),……,T(N)},n为测试时间序列中的时序标号,n=1为起点序列,n=N为终点序列,因此N为该测试时间序列所包含的时间序列中序列总数,T(n)为测试时间序列中第m个序列的特征向量。

假设测试模板和参考模板分别用T和R表示,为了比较它们之间的相似度,可以计算它们之间的距离 D[T,R],距离越小则相似度越高。为了计算这一失真距离,应从T和R中各个对应序列之间的距离算起。则d[T(n),R(m)]表示这两个序列的特征向量之间的距离。距离函数取决于实际采用的距离度量,在DTW算法中通常采用欧氏距离。

若N=M则可以直接计算,否则要考虑将T(n)和R(m)对齐。对齐可以采用线性扩张的方法,如果N<M可以将T线性映射为一个M个数量的序列,再计算它与{R(1),R(2),……,R(m),……,R(M)}之间的距离。但是这样的计算没有考虑到时间序列中各个段在不同情况下的持续时间会产生或长或短的变化(即:相同时间内表示同一个内容的时间长短不一。例如:人跑步,在相同的10s内,A跑100m用了3s,但是B跑100m用了10s。B比A在时间上多了7s的长度,但是是他们都是跑了100m的长度呀!),因此识别效果不可能最佳。因此更多的是采用动态规划(DP)的方法。

若把测试模板的各个***n=1N在一个二维直角坐标系中的横轴上标出,把参考模板的各***m=1M在纵轴上标出,通过这些表示***的整数坐标画出一些纵横线即可形成一个网络(矩阵),网络中的每一个交叉点(n,m)表示测试模式和参考模式中某一序列的交汇点。DP算法可以归结为寻找一条通过此网络中若干格点的路径,路径通过的格点即为测试模板和参考模板中进行计算某两个序列相似度的序列标号,每个格点存放的就是两个序列相似度。当然路径不是随意选择的,首先任何一种时间序列的序列产生的快慢都有可能变化,但是其各部分的先后发生的顺序不可能改变,因此所选的路径必定是从左下角出发,在右上角结束。

路径通过的所有格点的序列标号依次为{(1 ,1 ),(1 ,2 ),……,(i ,j ),……,(N ,M )}。如果路径已经通过了格点(n ,m ),那么下一个通过的格点只可能是下列三种情况之一:
(n +1,m)
(n +1,m +1)
(n ,m+1 )

【注:以上三种情况分别表示测试模板中的当前序列比训练模板中当前序列快,一样快,慢。】谨记!!!

满足上面条件的路径可以有指数个,然后我们感兴趣的是使得下面的规整代价最小的路径,即:搜索从(1, 1)点出发到达(N, M)点时的总的积累距离,具有最小累积距离的即为最佳路径。易于证明,限定范围的任一格点(n, m)只可能有一条搜索路径通过。对于(n, m),其可达到该格点的前一个格点只可能是(n-1, m)、(n-1, m -1)和(n, m-1),那么(n, m)一定选择这3个距离之路径延伸而通过(n, m),这时此路径的积累距离为:

D[(n, m)]=d[T(n),R(m)]+min{D(n-1,m),D(n-1,m-1),D(n,m-1)}

则从(1, 1)点出发到达(N, M)点时的总的积累距离,只保留一条最佳路径。如果有必要的话,通过逐点向前寻找就可以求得整条路径。这套DP算法便是DTW算法。

举一个例子吧:

这个例子中假设标准模板R为字母ABCDEF(6个),测试模板T为1234(4个)。R和T中各元素之间的距离已经给出(可以进行序列之间的欧式距离的计算)。
【注:其中的R,T就是相当于两段动作的视频片段,而ABCDEF和1234就如组成这两段视频的图片,分别是6张和4张。现在就是比较这两段视频表示的动作之间的相似度问题。】
如下:

在这里插入图片描述


既然是模板匹配,所以各分量的先后匹配顺序已经确定了,虽然不是一一对应的。现在题目的目的是要计算出测试模板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+22=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)+2d(2,2)=4+24=12.因为是斜着过去的。
综上所述,取最小值为9. 所有g(2,2)=9.
当然在这之前要计算出g(1,1),g(2,1),g(1,2).因此计算g(I,j)也是有一定顺序的。
其基本顺序可以体现在如下:

在这里插入图片描述


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

在这里插入图片描述


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

在这里插入图片描述


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

在这里插入图片描述


三、DTW算法的具体代码实现
1.MATLAB实现
2.Python实现
3.C++实现


http://chatgpt.dhexx.cn/article/pyO6NyeT.shtml

相关文章

时间序列匹配之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

网站压测工具Apache-ab,webbench,Apache-Jemeter

网站压测工具Apache-ab&#xff0c;webbench&#xff0c;Apache-Jemeter 1、搭建测试网站2、Apache自带工具ab3、webbench4、Windows下安装Apache-Jmeter 1、搭建测试网站 编译LAMP网站部署&#xff1a;LAMP web1配置&#xff1a; yum方式搭建网站 初始化 cd /etc/yum.repos.…

10大主流压力测试工具推荐

在移动应用和Web服务正式发布之前&#xff0c;除了进行必要的功能测试和安全测试&#xff0c;为了保证互联网产品的服务交付质量&#xff0c;往往还需要做压力/负载/性能测试。然而很多传统企业在试水互联网的过程中&#xff0c;往往由于资源或产品迭代速度等原因忽视了这一块工…

Linux中Makefile详细教程

目录 Makefile Makefile的介绍 Makefile简单的编写 .PHONY 问题&#xff1a; 如果只执行make&#xff0c;它执行的是Makefile里哪一段语句呢&#xff1f; 怎么知道我的可执行程序是最新的呢&#xff1f; Makefile编译多个文件 进度条小程序 Makefile Makefile的介绍 …

Makefile入门教程

转载&#xff1a; https://www.linuxidc.com/Linux/2014-08/105304.htm Makefile入门教程 回顾 首先&#xff0c;我把需要的文件全部写出来&#xff08;在《GCC学习笔记》处&#xff09;。 main.c文件 #include <stdio.h> #include "math.h" int main() { int…

Makefile教程(入门介绍)

文章目录 前言一、Makefile介绍二、make和Makefile的关系三、学习makefile的意义四、编写一个简单的Makefile总结 前言 本篇文章将带大家学习Makefile&#xff0c;Makefile在文件的编译中起到重要作用&#xff0c;在Linux中我们也是经常使用到Makefile&#xff0c;下面我将会带…