DTW算法详解

article/2025/9/11 14:20:50

DTW算法详解

1.DTW

1.1 时序相似度

在时间序列数据中,一个常见的任务是比较两个序列的相似度,作为分类或聚类任务的基础。那么,时间序列的相似度应该如何计算呢?

“ 经典的时间序列相似性度量方法总体被分为两 类: 锁步度量(lock-step measures) 和弹性度量(elastic measures) . 锁步度量是时间序列进行 “一对一”的比 较; 弹性度量允许时间序列进行 “一对多”的比较.
——《时间序列数据挖掘的相似性度量综述》

最简单的相似度计算方法可能是计算两个时间序列的欧氏距离。欧氏距离属于锁步度量

假设有两个时间序列,Q和C,如果直接用欧氏距离计算相似度的话,如果存在时间步不对齐,序列长短不一等问题…
在这里插入图片描述
如上图1所示,如果序列长短不一,或时间步不对齐的时候,欧氏距离是无法有效计算两个时间序列的距离,特别是在峰值的时候。

图2则是DTW算法,首先将其中一个序列进行线性放缩进行某种“扭曲”操作,以达到更好的对齐效果,可以存在一对多mapping的情况,适用于复杂时间序列,属于弹性度量

1.2 DTW算法

动态时间规整在60年代由日本学者Itakura提出,用于衡量两个长度不同的时间序列的相似度。把未知量伸长或缩短(压扩),直到与参考模板的长度一致,在这一过程中,未知序列会产生扭曲或弯折,以便其特征量与标准模式对应

首先假设有两条序列 Q Q Q C C C,他们的长度分别是 n n n m m m
Q = q 1 , q 2 , . . . , q n Q=q_1,q_2,...,q_n Q=q1,q2,...,qn
C = q 1 , q 2 , . . . , q n C=q_1,q_2,...,q_n C=q1,q2,...,qn

用一个 m × n m\times n m×n 矩阵来对比两个序列,warping路径会穿越这个矩阵,warping路径的第 k k k 个元素表示为 w k = ( i , j ) k w_k=(i,j)_k wk=(i,j)k ,横纵代表的是两个序列对齐的点
在这里插入图片描述
约束条件

1)边界条件: w 1 = ( 1 , 1 ) w_1=(1,1) w1=(1,1) w k = ( m , n ) w_k=(m,n) wk=(m,n),表示两条序列首尾必须匹配,各部分的先后次序匹配。

2)连续性: 如果 w k = ( a , b ) w_k=(a,b) wk=(a,b) w k − 1 = ( a ′ , b ′ ) w_k-1=(a',b') wk1=(a,b),则必须满足 a − a ′ ≤ 1 a-a' \leq 1 aa1
b − b ′ ≤ 1 b-b' \leq 1 bb1这条约束表示在匹配过程中多对一和一对多的情况只能匹配周围一个时间步的的情况,也就是不可能跨过某个点去匹配,只能和自己相邻的点对齐。这样可以保证 Q Q Q C C C中的每个坐标都在wraping路径中出现。

3)单调性: 如果 w k − 1 = ( a ′ , b ′ ) w_k-1=(a',b') wk1=(a,b),且 w k = ( a , b ) w_k=(a,b) wk=(a,b),则必须满足 a − a ′ ≥ 0 a-a' \geq 0 aa0
b − b ′ ≥ 0 b-b' \geq 0 bb0,表示warping路径一定是随时间单调递增的。

满足以上约束条件的warping路径有很多,所以问题的本质是最优化问题——找出最优warping路径。

解法思路是通过动态规划算法,数学语言描述为:
在这里插入图片描述
【举例】
DTW最初用于识别语音的相似性。我们用数字表示音调高低,例如某个单词发音的音调为1-3-2-4。现在有两个人说这个单词,一个人在前半部分拖长,其发音为1-1-3-3-2-4;另一个人在后半部分拖长,其发音为1-3-2-2-4-4。
在这里插入图片描述

现在要计算1-1-3-3-2-4和1-3-2-2-4-4两个序列的距离(距离越小,相似度越高)。因为两个序列代表同一个单词,我们希望算出的距离越小越好,这样把两个序列识别为同一单词的概率就越大。

先用传统方法计算两个序列的欧几里得距离,即计算两个序列各个对应的点之间的距离之和。

距离之和
= |A(1)-B(1)| + |A(2)-B(2)| + |A(3)-B(3)| + |A(4)-B(4)| + |A(5)-B(5)| + |A(6)-B(6)|
= |1-1| + |1-3| + |3-2| + |3-2| + |2-4| + |4-4|
= 6

在这里插入图片描述
如果我们允许序列的点与另一序列的多个连续的点相对应(相当于把这个点所代表的音调的发音时间延长),然后再计算对应点之间的距离之和。如下图:B(1)与A(1)、A(2)相对应,B(2)与A(3)、A(4)相对应,A(5)与B(3)、B(4)相对应,A(6)与B(5)、B(6)相对应。

在这里插入图片描述
这样的话,

距离之和
= |A(1)-B(1)| + |A(2)-B(1)| + |A(3)-B(2)| + |A(4)-B(2)| + |A(5)-B(3)| + |A(5)-B(4)| + |A(6)-B(5)| + |A(6)-B(6)|
= |1-1| + |1-1| + |3-3| + |3-3| + |2-2| + |2-2| + |4-4| + |4-4|
= 0

我们把这种“可以把序列某个时刻的点跟另一时刻多个连续时刻的点相对应”的做法称为时间规整(Time Warping)。

现在我们用一个6*6矩阵M表示序列A(1-1-3-3-2-4)和序列B(1-3-2-2-4-4)各个点之间的距离, M ( i , j ) M(i, j) M(i,j) 等于A的第i个点和B的第j个点之间的距离,即
在这里插入图片描述
在这里插入图片描述
我们看到传统欧几里得距离里对应的点:

  • A(1)-B(1)
  • A(2)-B(2)
  • A(3)-B(3)
  • A(4)-B(4)
  • A(5)-B(5)
  • A(6)-B(6)

它们正好构成了对角线,对角线上元素和为6。

时间规整的方法里,对应的点为:

  • A(1)A(2)-B(1)
  • A(3)A(4)-B(2)
  • A(5)-B(3)B(4)
  • A(6)-B(5)B(6)

这些点构成了从左上角到右下角的另一条路径,路径上的元素和为0。

因此,DTW算法的步骤为:

  1. 计算两个序列各个点之间的距离矩阵。
  2. 寻找一条从矩阵左上角到右下角的路径,使得路径上的元素和最小。

我们称路径上的元素和为路径长度。那么如何寻找长度最小的路径呢?

矩阵从左上角到右下角的路径长度有以下性质:

  1. 当前路径长度 = 前一步的路径长度 + 当前元素的大小
  2. 路径上的某个元素(i, j),它的前一个元素只可能为以下三者之一:

a) 左边的相邻元素 (i, j-1)
b) 上面的相邻元素 (i-1, j)
c) 左上方的相邻元素 (i-1, j-1)

假设矩阵为M,从矩阵左上角(1,1)到任一点(i, j)的最短路径长度为Lmin(i, j)。那么可以用递归算法求最短路径长度:

起始条件:
在这里插入图片描述
递推规则:
在这里插入图片描述
递推规则这样写的原因是因为当前元素的最短路径必然是从前一个元素的最短路径的长度加上当前元素的值。前一个元素有三个可能,我们取三个可能之中路径最短的那个即可。

参考文献
https://www.bilibili.com/video/BV12r4y1A7mT?share_source=copy_web
https://zhuanlan.zhihu.com/p/43247215
https://it.wikipedia.org/wiki/Dynamic_time_warping
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

fastdtw 包计算

https://pypi.org/project/fastdtw/

from fastdtw import fastdtw
from scipy.spatial.distance import euclideanx = np.array([1, 2, 3, 3, 7])
y = np.array([1, 2, 2, 2, 2, 2, 2, 4])distance, path = fastdtw(x, y, dist=euclidean)print(distance)
print(path)# 5.0
# [(0, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 5), (3, 6), (4, 7)]

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

相关文章

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

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

LOIC网站压力测试工具

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

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

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

10大主流压力测试工具

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

jmeter压力测试

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

网站压力测试的几种方法

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

压力测试工具

目录 1 性能测试... 2 2 压力测试(Stress Test)... 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工具之前,我们需了解几个关于压力测试的概念 吞吐率(Requests per second) 概念&a…

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

两天,jnj在本站发布了《 如何在低速率网络中测试 Web 应用 》,那是测试网络不好的情况。而下面是十个免费的可以用来进行Web的负载/压力测试的工具,这样,你就可以知道你的服务器以及你的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 常用参数详解: …

Jmeter--压力测试工具

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

JMeter压力测试工具

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

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

简单好用的网站压力测试工具 下载: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,webbench,Apache-Jemeter 1、搭建测试网站2、Apache自带工具ab3、webbench4、Windows下安装Apache-Jmeter 1、搭建测试网站 编译LAMP网站部署:LAMP web1配置: yum方式搭建网站 初始化 cd /etc/yum.repos.…

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

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

Linux中Makefile详细教程

目录 Makefile Makefile的介绍 Makefile简单的编写 .PHONY 问题: 如果只执行make,它执行的是Makefile里哪一段语句呢? 怎么知道我的可执行程序是最新的呢? 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;下面我将会带…

VCS使用Makefile教程

在从事IC验证工作的过程中&#xff0c;其实最开始的一步不是写什么test plan或者说verification of structure&#xff0c;而是应该知道makefile怎么写&#xff0c;先写出一个通用&#xff0c;基础的编译仿真脚本&#xff0c;可能会让你编译仿真轻松一点。 这份Makefile使用教程…

Makefile教程(Makefile的结构)

文章目录 前言一、Makefile的结构二、深入案例三、Makefile中的一些技巧总结 前言 一、Makefile的结构 Makefile 通常由一系列规则组成&#xff0c;每条规则定义了如何从源文件生成目标文件。每个规则又由目标、依赖和命令三部分组成。 下面是 Makefile 规则的基本结构&…