初识DTW(动态时间规整)算法及Python实现例

article/2025/9/12 11:56:04

目录 

1. 概要

2. 时序列相似度度量

3. DTW基本算法

4. Python实现

5. Next Action


1. 概要

       DTW( Dynamic Time Warping,动态时间规整)是基于动态规划(Dynamic Programming)策略对两个时序列通过非线性地进行时域对准(Timing alignment)调整以便于正确地计算两者之间相似度(similarity)的一种算法。

        本文简单介绍DTW算法所针对的问题背景、DTW基本算法流程,并给出简单的Python实现例。

        本文如标题“初识。。。”所示,面向像作者这样初次接触DTW的渣渣^-^。不过本文并不准备动态规划策略进行描述,所以本文要求读者对动态规划有基本的了解。

2. 时序列相似度度量

        考虑如下所示的几个时序列波形之间的“相似度”的比较。时序列波形之间的相似度的衡量的一种方法就是把时序列波形看作是一个向量,然后计算两个向量之间的欧几里得距离。除了欧几里得距离以外,其它的相似度度量还有比如说余弦相似度(cosine similarity)。

# -*- coding: utf-8 -*-
"""
Created on Sat Oct 30 10:50:53 2021@author: chenxy
"""import numpy as np
import matplotlib.pyplot as pltdef euclid_dist(t1,t2):return np.sqrt(np.sum((t1-t2)**2))t   = np.arange(100)
ts1 = 5*np.sin(2*np.pi*t*0.05) # 0.05Hz sin wave, 1Hz sampling rate, amplitude=5
ts2 = 3*np.sin(2*np.pi*t*0.02) # 0.02Hz sin wave, 1Hz sampling rate, amplitude=3
ts3 = 0.08*t-4fig,axs = plt.subplots(figsize=(12,8))
axs.plot(ts1)
axs.plot(ts2)
axs.plot(ts3)
axs.legend(['ts1: sin,0.05Hz, amplitude=5',\'ts2: sin,0.02Hz, amplitude=3',\'ts3: line with slope = 0.08'])euclidean_dist_12 = euclid_dist(ts1,ts2)
euclidean_dist_13 = euclid_dist(ts1,ts3)
euclidean_dist_23 = euclid_dist(ts2,ts3)
print('euclidean_dist_12 = {0:6.2f}'.format(euclidean_dist_12))
print('euclidean_dist_13 = {0:6.2f}'.format(euclidean_dist_13))
print('euclidean_dist_23 = {0:6.2f}'.format(euclidean_dist_23))

运行后得到:

 

 图1

        如果直接采用欧几里得距离作为相似性度量的话,如以上结果可得,ts2和ts3之间的距离最小,或者说相似度最高。但是,从人类的直觉来看的话,由于ts1和ts2都是正弦波,只不过频率和幅度不同而已,而ts3是一根直线,显然应该是ts1和ts2更相似才合理。

        进一步,考虑一个与ts1频率、幅度都相等,但是相位差180度的正弦波。

ts4 = 5*np.sin(2*np.pi*t*0.05+np.pi) # 0.05Hz sin wave, 1Hz sampling rate, amplitude=5    
fig,axs = plt.subplots(figsize=(12,8))
axs.plot(ts1)
axs.plot(ts4)
axs.plot(ts3)
axs.legend(['ts1: sin,0.05Hz, amplitude=5',\'ts4: sin,0.05Hz, amplitude=5, phase offset=pi',\'ts3: line with slope = 0.08'])euclidean_dist_14 = euclid_dist(ts1,ts4)
euclidean_dist_34 = euclid_dist(ts3,ts4)
print('euclidean_dist_14 = {0:6.2f}'.format(euclidean_dist_14))
print('euclidean_dist_34 = {0:6.2f}'.format(euclidean_dist_34))

        运行后得到: 

图2 

        这一次结果更加明显地反直觉。Ts1与ts4仅仅只是反相而已,而它们之间的”距离”居然会远远大于ts3与ts4之间的距离! 

        造成以上反直觉的结果的原因在于:Ts1,ts2,ts4之间虽然基本波形其实是相似的,但是在时域存在没有对准(或者说不同步)的问题。Ts1和ts4之间相位相反也可以看作是时域未对准,因为可以把ts4看作是ts1延迟半个周期的波形。而ts2与ts1之间则不仅仅是相位偏差导致的时域未对准,还有因为他们的周期不同而导致相位的偏差是随时间变化的。

        以上的情况还只是最简单的情况。因为ts1和ts2和ts4同是正弦波,差异在于相位和频率,但是相位和频率差异是固定的。因此,通过对其中一个信号进行相位调整的扫描以及对时域波形扩张(对应于改变频率)的扫描,然后再进行信号处理中的相关运算是可以正确地识别出它们之间的相似度来的。

        在真实世界中,两个原本相似度很高的时序列之间可能时域上相对变形(distortion)程度不但是时变的,而且还是非线性变化的。将一段语音变速播放就会产生这种类似的效果。这种情况下要想正确识别出它们之间的相似度,就需要先对两者之间局部时域波形的相对变形进行纠正以后再计算欧几里得距离。“对两者之间局部时域波形的相对变形纠正”称为Time-Warping(时域规整)处理。经过Time-Warping(时域规整)处理后,两个序列中样点间不再保持一一对应关系,而是可能出现一些一对多或者多对一的关系,相当于局部范围内时域波形出现了相对压缩或者拉伸后再进行对应,如下图所示:

图3 

3. DTW基本算法

        DTW算法就是基于动态规划策略对两个时序列进行动态的时域规整处理后以搜索估计它们之间最小可能的距离(最大可能的相似度)。广泛地用于时序列分类和聚类等应用中。

        DTW算法基本工作原理如下所述:

        考虑两个时序列Q=(q_1,q_2,...,q_n)C=(c_1,c_2,...,c_m),长度分别为n和m(直接计算两个序列之间的欧氏距离要求两者长度相等。但是,基于DTW算法来估计相似度并不要求长度相等)。

        首先,构建一个n*m的矩阵D,其中D[i,j]表示Qi与Pj之间的欧氏距离(注意,为了描述方便,下标是从1开始计数(记为1-indexed)。但是在python或C代码实现中则是从0开始计数,称为0-indexed)。DTW的目标就是要找到一条从[1,1]到[n,m]的路径使得该条路径的累积欧氏距离最小。

如前所述,在Time Warping处理中,一个时序列上的一个点可以对应另一个时序列的一个或者多个点。对应地,在以上矩阵D中的路径(从左上角的[1,1]出发的)构造过程中,可以从一个格点到达其右边、下边以及右下的格点。理论上,也可以走向其它5个方向的格点,但是这样肯定会导致非最小化的距离,因此可以不用考虑。

考虑W=(w_1,w_2,...,w_K)表示一条从[1,1]到[n,m]的路径,其中Wk表示路径经过的某格点所保存的Q和C之间某两点(q_i, c_j)之间的欧氏距离的平方 (注意,这里用平方而不是绝对值,是因为两个时序列之间的距离是要先进行平方和运算再开方的)。如下图所示就是一条可能的路径。

图4 

        这样,以上最小累计距离搜索的优化问题可以表述为求解

         如上图所示,将从[1,1]到达[i,j]的累计距离记为

        很显然,经历最短累计距离到达[i,j]的前一个点必然是[i-1,j-1], [i,j-1], [i-1,j]三者之一。在已经计算出[i-1,j-1], [i,j-1], [i-1,j]各自所对应的最短累计距离的前提下,可以得到关于 的递推关系式如下: 

 

        基于这个递推关系式,可以从[1,1]开始逐行(或逐列也可以)计算并填充关于\gamma的表格,填充完整个表格后即可以得到两个序列之间的最短距离 ,这个距离通常也称为DTW距离。

         

        进一步,记录以上关于\gamma的创建过程中的路径选择历史的话,可以从[n,m]回溯得到最优路径所经历的所有格点。也就可以据此得到如以上图3那样的Time Warping映射图。

4. Python实现

         DTW算法实现如以下函数DTWDistance()所示。基于这一函数我们来重新评估以上4个序列之间的DTW距离。

"""
DTWDistance(s1, s2) is copied from:
http://alexminnaar.com/2014/04/16/Time-Series-Classification-and-Clustering-with-Python.html
"""def DTWDistance(s1, s2):DTW={}for i in range(len(s1)):DTW[(i, -1)] = float('inf')for i in range(len(s2)):DTW[(-1, i)] = float('inf')DTW[(-1, -1)] = 0for i in range(len(s1)):for j in range(len(s2)):dist= (s1[i]-s2[j])**2DTW[(i, j)] = dist + min(DTW[(i-1, j)],DTW[(i, j-1)], DTW[(i-1, j-1)])return np.sqrt(DTW[len(s1)-1, len(s2)-1])dtw_dist_12 = DTWDistance(ts1,ts2)
dtw_dist_13 = DTWDistance(ts1,ts3)
dtw_dist_14 = DTWDistance(ts1,ts4)
dtw_dist_23 = DTWDistance(ts2,ts3)
dtw_dist_24 = DTWDistance(ts2,ts4)
dtw_dist_34 = DTWDistance(ts3,ts4)
print('dtw_dist_12 = {0:6.2f}'.format(dtw_dist_12))
print('dtw_dist_14 = {0:6.2f}'.format(dtw_dist_14))
print('dtw_dist_24 = {0:6.2f}'.format(dtw_dist_24))
print('dtw_dist_23 = {0:6.2f}'.format(dtw_dist_23))
print('dtw_dist_13 = {0:6.2f}'.format(dtw_dist_13))
print('dtw_dist_34 = {0:6.2f}'.format(dtw_dist_34))

 运行结果如下: 

由此可以看出ts3(直线)与其它三者之间的DTW距离都比其它三者之间的相互的DTW距离要大,也就是说ts1,2,4相互之间的相似度是要大于ts3与ts1,2,4之间的相似度的。

5. Next Action

  1. DTW算法的运算复杂度优化
  2. 以上提到过的\gamma表格建立中的路径选择历史的记录以及最优路径回复,以及Time Warping可视化
  3. 基于DTW与KNN结合的时序列分类(classification)和聚类(clustering)的应用示例

Reference:

[1]http://alexminnaar.com/2014/04/16/Time-Series-Classification-and-Clustering-with-Python.html


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

相关文章

DTW基本原理

设时间归正函数为:,式中,N为路径长度,c(n)(i(n),j(n))表示第n个匹配点对是由参考模板的第i个特征矢量与待测模板的第j个特征矢量构成的匹配点对。两者之间的距离称为局部匹配距离。DTW算法就是通过局部优化的方法实现加权距离总和…

DTW算法——Matlab实现

概述 DTW (Dynamic time warping)算法是可以度量两个独立时间序列的相似度的一种方法。曾被广泛应用在单词音频的匹配上。该方法主要用来解决在两段序列的时长不同的情况下,进行相似度的判断。 上图中,左侧时长相等,…

DTW简介

dtw算法主要针对序列匹配提出的,尤其是当序列出现一定的飘移,欧氏距离度量就会失效。dtw常用在语音匹配当中,在图像处理里面也有一定的应用。 现在有两个序列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算法主要针对序列匹配提出的,尤其是当序列出现一定的飘移,欧氏距离度量就会失效。dtw常用在语音匹配当中,在图像处理里面也有一定的应用。 现在有两个序列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,动态时间归准)的简称。应用很广,主要是在模板匹配中,比如说用在孤立词语音识别,计算机视觉中的行为识别,信息检索等中。可能大家学过这些类似的课程都看到过这个算法,公式也有几个&#xf…

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

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

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

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

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

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

DTW算法详解

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

动态时间规整算法(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…