DTW学习笔记1.0

article/2025/9/12 11:17:13

 目录

DTW算法的目的:

DTW算法实现:

以下图两段序列为例:

DTW代码实现:

Dynamic programming function

示例:

单变量示例:

 比较序列相似性示例:

缺点:


DTW算法的目的:

1.计算两段序列的相似度

例如通过计算序列距离来判断右边三段序列哪段与左侧序列相似度最大

2.对两段序列实现点对点匹配(如下图所示)

DTW算法实现:

1.输入两段序列的长度:x:N and y:M

2.创建累计距离矩阵:D\epsilon R^{(N+1)\times(M+1)}

3.初始化累计矩阵:

       for i = 1 to N:   D_{i,0}=\infty

       for j = 1 to M:  D_{0,j}=\infty

4.计算累计矩阵:

for i = 1 to N:

        for j = 1 to M:

                D_{i,j}=d(x_i,y_j)+min\left\{\begin{matrix} D_{i-1,j-1}\\ D_{i-1,j}\\ D_{i,j-1} \end{matrix}\right.           

( 其中d(x_i,y_j)d(x_i,y_j)为距离函数,可采用欧式距离、余弦距离等等)

5.匹配路径:Trace back from D_{N,M} to D_{0,0}

以下图两段序列为例:

x = np.array([0, 2, 0, 1, 0, 0])
y = np.array([0, 0, 0.5, 2, 0, 1, 0])

 1. x序列长度N=6,y序列长度M=7

2. 创建累计距离矩阵D_{(6+1)\times(7+1)}并初始化(其中纵轴代表x序列,横轴代表y序列):

累计矩阵D
0

3. 填充累计距离矩阵:

设距离函数d(x_i,y_j)=\left | x_i-y_j \right |

根据公式D_{i,j}=d(x_i,y_j)+min\left\{\begin{matrix} D_{i-1,j-1}\\ D_{i-1,j}\\ D_{i,j-1} \end{matrix}\right.依次填充上方累计距离矩阵,

333.551.52.50.5
3334.51.51.50.5
332.531.50.51.5
2222.50.51.51.5
221.50.52.53.55.5
000.52.52.53.53.5
0

序列距离=D(6,7)=0.5

4.匹配路径

从右上角D(6,7)开始回溯,选择其(左方,下方,左下方)最小值的位置,直至到左下方D(0,0)

DTW代码实现:

Preliminaries

from matplotlib.patches import ConnectionPatch
import matplotlib.pyplot as plt
import numpy as np
import scipy.spatial.distance as dist

Dynamic programming function

def dp(dist_mat):N, M = dist_mat.shape# 初始化累计距离矩阵cost_matcost_mat = np.zeros((N + 1, M + 1))for i in range(1, N + 1):cost_mat[i, 0] = np.inffor i in range(1, M + 1):cost_mat[0, i] = np.inf# 填充累计距离矩阵cosy_mat并记录匹配路径信息traceback_mattraceback_mat = np.zeros((N, M))for i in range(N):for j in range(M):penalty = [cost_mat[i, j],      # match (0)cost_mat[i, j + 1],  # insertion (1)cost_mat[i + 1, j]]  # deletion (2)i_penalty = np.argmin(penalty)   #记录矩阵中每项周围最小值的位置cost_mat[i + 1, j + 1] = dist_mat[i, j] + penalty[i_penalty]traceback_mat[i, j] = i_penalty# 从矩阵右上方开始回溯i = N - 1j = M - 1path = [(i, j)]while i > 0 or j > 0:tb_type = traceback_mat[i, j]if tb_type == 0:# Matchi = i - 1j = j - 1elif tb_type == 1:# Insertioni = i - 1elif tb_type == 2:# Deletionj = j - 1path.append((i, j))# 返回前去除累计距离矩阵的初始化边沿cost_mat = cost_mat[1:, 1:]return (path[::-1], cost_mat)

示例:

单变量示例:

x = np.array([0, 0, 1, 1, 0, 0, -1, 0, 0, 0, 0])
y = np.array([0, 0, 0, 0, 1, 1, 0, 0, 0, -1, -0.5, 0, 0])# 创建距离矩阵
N = x.shape[0]
M = y.shape[0]
dist_mat = np.zeros((N, M))
for i in range(N):for j in range(M):dist_mat[i, j] = abs(x[i] - y[j])# 使用上面DTW函数
path, cost_mat = dp(dist_mat)
print("x、y两条序列距离: {:.4f}".format(cost_mat[N - 1, M - 1]))
print(f"匹配路径:{path}")

输出结果:

x、y两条序列距离: 0.5000
匹配路径:[(0, 0), (0, 1), (0, 2), (1, 3), (2, 4), (3, 5), (4, 6), (4, 7), (5, 8), (6, 9), (7, 10), (8, 11), (9, 11), (10, 12)]

根据匹配路径,我们可以将xy两条序列各点对齐

 比较序列相似性示例:

a = np.array([0, 0, 1, 1, 0, 0, -1, 0, 0, 0, 0])
b = np.array([0, 0, 0, -1, -1, 0, 0, 0, 0.5, 0, 0, 0, 0])
c = np.array([0, 0, 0.25, 1, 0, 0.5, 0])
d = np.array([0, 0, 0, 0, 1, 1, 0, 0, 0, -1, -0.5, 0, 0])for cur_b in [b, c, d]:# 距离矩阵N = a.shape[0]M = cur_b.shape[0]dist_mat = np.zeros((N, M))for i in range(N):for j in range(M):dist_mat[i, j] = abs(a[i] - cur_b[j])# DTWpath, cost_mat = dp(dist_mat)print("Alignment cost: {:.4f}".format(cost_mat[N - 1, M - 1]))

输出结果:

Alignment cost: 2.5000
Alignment cost: 1.7500
Alignment cost: 0.5000

显然,序列d与序列a之间的距离最小,故认为序列d与序列a最相似

缺点:

DTW算法存在“病态对齐”现象

例如,对于上述相似性比较示例中,添加一条新序列e

e = np.array([0, 1, 0, -1, 0])

 计算序列a、e之间的距离结果:

Alignment cost: 0.0000

此时对于序列d,序列e反而与序列a最为相似,甚至序列距离为0

这是因为序列a、e对齐过程中出现多处“多对一”或者“一对多”情况,导致匹配路径path过长

             

 因此,为了防止这种“bug”出现,我们需要对匹配路径长度进行限制,也就是对DTW算法进行优化

这就引出了LDTW和FDTW算法(具体参考DTW学习笔记2.0)

参考文章:

lecture_dtw_notebook/dtw.ipynb at main · kamperh/lecture_dtw_notebook · GitHub


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

相关文章

动态时间规整—DTW算法

简述 Dynamic Time Warping(DTW)诞生有一定的历史了(日本学者Itakura提出),它出现的目的也比较单纯,是一种衡量两个长度不同的时间序列的相似度的方法。应用也比较广,主要是在模板匹配中&#…

语音信号处理之(一)动态时间规整(DTW)

语音信号处理之(一)动态时间规整(DTW) zouxy09qq.com http://blog.csdn.net/zouxy09 这学期有《语音信号处理》这门课,快考试了,所以也要了解了解相关的知识点。呵呵,平时没怎么听课&#xff…

【机器学习】【DTW】

转自:https://blog.csdn.net/zouxy09/article/details/9140207 一、概述 在大部分的学科中,时间序列是数据的一种常见表示形式。对于时间序列处理来说,一个普遍的任务就是比较两个序列的相似性。 在时间序列中,我们通常需要比较…

动态时间规整算法: 从DTW到FastDTW

目录 动态时间规整算法: 从DTW到FastDTW总结:简介[^1]DTW[^1]FastDTW:使用多级粗化的方法[^1]结果 动态时间规整算法: 从DTW到FastDTW 总结: FastDTW作者对DTW的改进点很巧妙!先通过举例说明在一些情况下目前现有的方法对DTW改进…

机器学习算法(二十三):DTW(Dynamic Time Warping,动态时间调整)

目录 1 DTW(动态时间调整) 2 算法的实现 3 例子 4 python实现 ​​​​​​​5 DTW的加速算法FastDTW 5.1 标准DTW算法 5.2 DTW常用加速手段 5.3 FastDTW​​​​​​​ 1 DTW(动态时间调整) 动态时间调整算法是大多用于检…

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

目录 1. 概要 2. 时序列相似度度量 3. DTW基本算法 4. Python实现 5. Next Action 1. 概要 DTW( Dynamic Time Warping,动态时间规整)是基于动态规划(Dynamic Programming)策略对两个时序列通过非线性地进行时域对…

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…