DTW 笔记: Dynamic Time Warping 动态时间规整 (&DTW的python实现) 【DDTW,WDTW】

2023-11-04

0 总述

         DTW可以计算两个时间序列的相似度,尤其适用于不同长度、不同节奏的时间序列(比如不同的人读同一个词的音频序列)

        DTW将自动扭曲(warping)时间序列(即在时间轴上进行局部的缩放),使得两个序列的形态尽可能的一致,得到最大可能的相似度。

        DTW采用了动态规划的方法来进行时间规整的计算

1 欧几里得距离的局限性

        描述两个序列之间的相似性,欧氏距离是一种十分简单且直观的方法,但对于序列之间步调不统一的情况,计算欧氏距离得到的结果会比实际的最小距离大很多,比如下面两个几乎一样的序列:

        

·

        左边是欧氏距离的对应关系,在同一时刻上的点相互对应,计算总距离;右边是DTW的点对应关系。

        可以看到,下面序列某时刻的点可以对应上面序列非同一时刻的点;同时一个点可以对应多个点;多个点也可以对应一个点,也就是说每个点尽可能找离它距离最小的点,允许时间轴上的伸缩。

        显而易见的,这种情况下DTW计算的距离比欧氏距离更小。因此对于时间上有拉伸或压缩的序列,使用DTW计算的序列距离更加合理

        该算法在语音序列匹配中使用十分广泛。

2  DTW 算法

        假设我们有两个时间序列Q和C,他们的长度分别是n和m(n和m不一定相等),我们记为:

        

        现在我们需要将两个序列对齐,DTW采用动态规划的方法进行对齐。

        为了对齐这两个序列,我们需要构造一个n*m的矩阵网络,矩阵元素(i,j)表示q_ic_j两个点之间的距离d(q_i,c_j) 

        【不同的应用问题中,会有不同的d】

        【一般采用欧氏距离,d(q_i,c_j)=(q_i-c_j)^2

        【在有些问题中,这个距离又被称作失真度】

        DTW算法旨在寻找一条通过此网络中若干个点的一条路径,路径中的经过的点即为两个序列之间进行计算所需要的对齐的点

         但是,这条路径并不是随意选择的,它需要满足几个约束条件:

  • 边界条件【w_1=(1,1)w_k=(m,n)】,首尾需要对齐
  • 连续性+单调性【如果w_{k-1}=(a',b'),那么对于路径上的下一个点w_k=(a,b),需要满足0 \le (a-a') \le 10 \le b-b') \le 1】【也就是路径只能连接正上方、正右方、右上方三个相邻点钟的一个】【a' \le a \le a'+1 , b' \le b \le b'+1】——>保证两个要比较的序列Q和C中的每一个坐标都会在W中出现

         我们的目的是最小化路径上的值,即

        DTW(Q,C)=min(\frac{\sqrt{\sum_{k=1}^Kw_k}}{K}) 【有时候也没有这个K)

        分母中的K主要是用来对不同的长度的规整路径做补偿。因为不同的路径其长短不同,较长的路径有较多的“点对”,会有较多的距离累加上去,所以总距离除以K得到单位路径的距离。

3 DTW 举例

比如我们有两个序列

import matplotlib.pyplot as plt
import numpy as np

a=np.array([1,3,2,4,2])
b=np.array([0,3,4,2,2])

plt.plot(a)
plt.plot(b)

他们之间的欧氏距离为 

np.sqrt(np.sum((a-b)*(a-b))
#3

使用DTW的话,先要计算两个序列之间的欧氏距离

a-b 0 3 4 2 2
1 1 2 3 1 1
3 3 0 1 1 1
2 2 1 2 0 0
4 4 1 0 2 2
2 2 1 2 0 0

使用动态规划的话,就需要有这样的状态转移方程: 

其中d(i,j)就是第(i,j)个条目里面的内容,也就是ai和bj之间的欧几里得距离

a-b 0 3 4 2 2
1

1

dp(0,0)

=d(0,0)

=1

2

dp(0,1)

=dp(0,0)+d(0,1)

=1+2=3

3

dp(0,2)

=dp(0,1)+d(0,2)

=3+3=6

1

dp(0,3)

=dp(0,2)+d(0,3)

=6+1=7

1

dp(0,4)

=dp(0,3)+d(0,4)

=7+1=8

3

3

dp(1,0)

=dp(0,0)+d(1,0)

=1+3=4

0

dp(1,1)

=min(dp(0,0)

        ,dp(1,0)

        ,dp(0,1))

  +d(1,1)

=1+0=1

1

dp(1,2)

=min(dp(0,1)

        ,dp(1,1)

        ,dp(0,2))

  +d(1,2)

=1+1=2

1

dp(1,3)

=min(dp(0,2)

        ,dp(1,2)

        ,dp(0,3))

  +d(1,3)

=2+1=3

1

dp(1,4)

=min(dp(0,3)

        ,dp(1,3)

        ,dp(0,4))

  +d(1,4)

=3+1=4

2

2

dp(2,0)

=dp(1,0)+d(2,0)

=4+2=6

1

dp(2,1)

=min(dp(1,0)

        ,dp(2,0)

        ,dp(1,1))

  +d(2,1)

=1+1=2

2

dp(2,2)

=min(dp(1,1)

        ,dp(2,1)

        ,dp(1,2))

  +d(2,2)

=1+2=3

0

dp(2,3)

=min(dp(1,2)

        ,dp(2,2)

        ,dp(1,3))

  +d(2,3)

=2+0=2

0

dp(2,4)

=min(dp(1,3)

        ,dp(2,3)

        ,dp(1,4))

  +d(2,4)

=2+0=2

4

4

dp(3,0)

=dp(2,0)+d(3,0)

=6+4=10

1

dp(3,1)

=min(dp(2,0)

        ,dp(3,0)

        ,dp(2,1))

  +d(3,1)

=2+1=3

0

dp(3,2)

=min(dp(2,1)

        ,dp(3,1)

        ,dp(2,2))

  +d(3,2)

=2+0=2

2

dp(3,3)

=min(dp(2,2)

        ,dp(3,2)

        ,dp(2,3))

  +d(3,3)

=2+2=4

2

dp(3,4)

=min(dp(2,3)

        ,dp(3,3)

        ,dp(2,4))

  +d(3,4)

=2+2=4

2

2

dp(4,0)

=dp(3,0)+d(4,0)

=10+2=12

1

dp(4,1)

=min(dp(3,0)

        ,dp(4,0)

        ,dp(3,1))

   +d(4,1)

=3+1=4

2

dp(4,2)

=min(dp(3,1)

        ,dp(4,1)

        ,dp(3,2))

  +d(4,2)

=2+2=4

0

dp(4,3)

=min(dp(3,2)

        ,dp(4,2)

        ,dp(3,3))

  +d(4,3)

=2+0=2

0

dp(4,4)

=min(dp(3,3)

        ,dp(4,3)

        ,dp(3,4))

  +d(4,4)

=2+0=2

计算出所有的dp值之后,就可以得到它的DTW值,也即2

也就是这样的一个对应关系

4 python 实现

dtw_lst=[[-1 for _ in range(len(b))] for _ in range(len(a))]
#DTW矩阵,也就是上例中的dp(i,j)

def dist(i,j):
    return(math.fabs(a[i]-b[j]))
#两个点之间的欧几里得距离

dtw_lst[0][0]=dist(0,0)

def DTW(i,j):
    if(dtw_lst[i][j]!=-1):
        return(dtw_lst[i][j])
        #表示之前已经计算过这一对(i,j)的dtw了
    else:
        dtw_prev=np.inf
        if(i!=0):
            dtw_prev=min(dtw_prev,DTW(i-1,j))
        if(j!=0):
            dtw_prev=min(dtw_prev,DTW(i,j-1))
        if(i!=0 and j!=0):
            dtw_prev=min(dtw_prev,DTW(i-1,j-1))
        #由于不知道有没有左上,左,和上的点,所以需要讨论
        dtw_lst[i][j]=dtw_prev+dist(i,j)
        return(dtw_lst[i][j])

DTW(len(a)-1,len(b)-1)
#2.0

和手推的结果是一样的

5 DTW不是一个有效的距离

DTW满足以下性质:


然而,DTW不满足三角不等式,因而它不是一个有效的距离 

6 DTW的问题

6.1 singularity(奇点)问题

  • 有时 DTW 会在对齐时产生不自然的扭曲/翘曲
    • A 中实线、虚线所展示的是两条合成信号(均值、方差都相同)
    • B 中展示的是自然的“feature to feature”的对应
    •  C 中展示的则是 DTW 的结果。
    • 不难发现,DTW 没能自然地将图形中的波峰与波峰相对应,反而产生了一个序列中的一个点对应另外一个序列中的多个点的情况,这种情况被称为“Singularities”(奇点)
      • 出现这种情况的原因是 DTW 算法试图通过扭曲 X 轴来解释 Y 轴上的变化。

     

6.2 解决奇点问题的方法

6.2.1 windowing

  • 奇点问题的出现是因为两个时间序列上相隔很远的点仅因为值相同/相近,而易被 warping 到一起
  • ——>可以限制 DTW 在 warping 过程中的能选择的范围来解决奇点问题
    • 具体可以通过设置一个 warping window 来实现
    • |i-\frac{n}{m}j|<R
      • n和m分别是i和j对应的时间序列的长度
      • R是warping window 的大小
    • 第2节“Figure 3”中的两条虚线所夹范围就是经过warping window限制之后的范围,DTW的warping path只能在这个区域内

6.2.2 slope weighting

之前的DTW是:

现在对它进行一定的调整:

dp(i,j)=min(dp(i-1,j-1),Xdp(i-1,j),Xdp(i,j-1))+d(i,j)

  • 调整的地方是在min函数的后两项中加入了一个正实数X
    • 对X进行调整可以使得warping path的方向(即slope)有一定的偏好和调整
      • 比如X值较大时,warping path会更多地选择对角线朝向

6.2.3 step pattern

 之前的DTW是:

 

 

现在改成

dp(i,j)=min(dp(i-1,j-1),dp(i-1,j-2),dp(i-2,j-1))+d(i,j)

 

 6.3 上述解决奇点问题方法的局限性

  • 6.2中的几种解决方案在一定程度上对解决奇点问题有一定帮助,然而,它们仍然存在以下缺点:
    • 有可能错过正确的 warping path
      • 上述解决方法都是人为地对 warping path 进行限制和调整,来减少翘曲
      • ——>这很有可能会错过真正正确的 warping path
    • 参数的选择没有明确的指导,需要人为调参

7 DDTW(derivative DTW)

  • DTW之所以会造成奇点问题,本质原因是DTW算法只考虑每一时刻单个数值的值(两个时间序列的两个点qi和cj之间的距离)
    • 但是,如果两个数值相同的数据点,一个位于时间序列的上升趋势部分,一个位于时间序列的下降趋势部分,对于DTW来说,因为他们数值一样,很容易被匹配到一起。这便导致了奇点问题
  • DDTW每个时刻考虑的不是数值的取值,而是时间序列数据的形状,即该时刻对应的一阶导数
    • 两个时间序列,在两个时刻的一阶导数差值的平方(D_x[q]_i-D_x[c]_j)^2
    • DDTW中使用如下方式估计一阶导数

       

      • 在qi点处一阶导数的估计——>通过qi和q_{i-1}这两个点的斜率、通过q_{i-1},q_{i+1}这两个点的斜率 的平均值
      • ——>这种估计方式对outliner更稳定
    • 第一个和最后一个点用上述公式是没法估计的,DDTW用如下方式近似:

     

8 WDTW

  • 在计算两个序列上的两个点之间欧氏距离时加上一个 weight,而这个 weight 与两个点之间的 X 轴上的距离有关系
      • p=2——>计算两个点ai和bj的欧氏距离
      • w_{|i-j|}——>两个点在X轴上的距离相关的weight权重
        • 当|i-j|的值较大(两个点在X轴上距离比较远)时,w_{|i-j|}较大,此时ai和bj距离就会被放大,被WDTW匹配在一起的概率被减小
        • w_{|i-j|}是一个常数的时候,此时WDTW对任何(i,j)对的惩罚时相同的,此时WDTW退化为DTW
        • w_{|i-j|}的数值很大时,此时WDTW对任何(i,j)对的惩罚都很大【甚至第i个点和第i+1个点的匹配也不行】。此时WDTW退化为欧几里得距离

         

         

     

参考资料

IT技术 - 简书 (jianshu.com)

理解dynamic time warping(DTW)的基本思想 - 知乎 (zhihu.com)

衡量时间序列相似度的方法:从欧氏距离到DTW及其变种 (qq.com)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DTW 笔记: Dynamic Time Warping 动态时间规整 (&DTW的python实现) 【DDTW,WDTW】 的相关文章

随机推荐

  • 线程池以及UDP、socket通信

    目录 线程池 UDP通信 本地socket通信 线程池 什么是线程池 是一个抽象的概念 若干个线程组合到一起 形成线程池 为什么需要线程池 多线程版服务器一个客户端就需要创建一个线程 若客户端太多 显然不太合适 什么时候需要创建线程池呢 简
  • QT (C++)安装5.14

    QT 5 14 安装 介绍 C 版本 据说 这个版本是最后一个提供离线安装包的QT5 例如 qt opensource windows x86 5 14 2 exe 2 4G 最后一个可能是5 14 2 下载方式 1 在https down
  • unity开发VR的项目01——环境配置(unity2020.3)

    使用unity创建一个steam VR项目 首先要进行环境的配置 一 Steam VR插件导入 创建一个unity 3 项目 在 商店 window asset store 中搜索SteamVR Plugin 找到并导入到unity资源 也
  • STL:map

    首先包含头文件 include
  • 适合小白的详细虚拟机网络配置方法(附图)

    首先VMware的版本号需要16 0或者16 0以上版本 我用都版本应该是16 0的 有点悠久忘记了版本号 图标长这样 接下来右击镜像 点击设置 将网络适配器设置为NAT 点击编辑 再点击虚拟网络适配器 选择VMnet8 点击NAT设置 记
  • matlab矩阵处理

    2 1特殊矩阵 通用特殊矩阵 zeros函数 零矩阵 A zeros 2 3 A 0 0 0 0 0 0 zeros size reshape A 3 2 ans 0 0 0 0 0 0 ones函数 全一矩阵 eye函数 单位矩阵 ran
  • 三进制计算机_三进制会取代二进制计算机吗?

    三进制计算机 是以三进制数字系统为基础而发展的计算机 三进制计算机跟二进制计算机比 优势在哪里 三进制逻辑电路比二进制逻辑电路速度更快 可靠性更高 而且需要的设备和电能也更少 三进制代码的一个特点是对称 即相反数的一致性 因此它和二进制代码
  • express文件上传中间件Multer最新使用说明

    原文地址 http cnodejs org topic 564f32631986c7df7e92b0db 说明 multer是express官方推荐的文件上传中间件 它是在busboy的基础上开发的 目前multer的最新版本为 1 1 0
  • spring boot2 (40)- JWT token

    本篇介绍JWT token的生成和解析的基本方法 pom xml
  • JavaScript代码是怎么执行的?

    前言 众所周知 JavaScript是单线程语言 所以JavaScript是按顺序执行的 先编译再执行 变量提升 请看下面的例子 console log cat catName Chloe var cat Chloe function ca
  • 高级程序员解决问题的思维模式和普通程序员的区别在哪里?

    作者主页 士别三日wyx 先给你出一道题 看你会如何思考 假设你是一个程序员 常年保持自学和超长工作时长的状态 承受着不为人知的压力和痛苦 面对同行程序员的攀比和压力 在公司title 年薪 房子之间深陷 35岁大限越来越近 头顶日愈清凉
  • 2022年同济大学计算机考研复试分数线

    同济大学属于34所自划线院校之一 考研复试分数线分国家线和院校自划线 院校自划线公布时间一般早于国家线 报考同济大学计算机研究生的考生 复试分数线请以院校官网公布的分数线为准 2021年同济大学计算机考研复试分数线公布日期在3月13日 预计
  • ubuntu 22 安装elasticsearch

    安装说明 在 Ubuntu 上安装 Elasticsearch DEB 文件的过程与上面提到的大致相同 你可以按照以下步骤进行操作 1 首先 打开终端 并进入包含 Elasticsearch DEB 文件的目录 cd home userna
  • Unity Color Space

    这一周都在看Unity的Color Space相关的内容 看明白了 写下来给自己和他们参考 有不对的地方欢迎指正 显示器所能显示的颜色很有限 于是业界出了sRGB颜色空间 Photo Shop默认的颜色空间就是这个 照相机不用这个 用别的
  • MySQL索引常见面试题(2022版)

    目录 为什么要建立索引 哪些情况适合建立索引 哪些情况下不适合建索引 为什么索引是使用B 树 重点 索引分为那几类 什么是聚簇索引 重点 使用聚簇索引的优缺点 知道 为什么推荐使用自增主键作为索引 知道 什么叫回表 重点 什么叫索引覆盖 重
  • ElasticSearch6.x 之映射参数

    本文转载至https blog csdn net chengyuqiang article details 79059958 映射参数概述 ElasticSearch提供了丰富的映射参数 官网地址 https www elastic co
  • CP340/CP341基于ASCII驱动协议的多站点轮询

    西门子SIMATIC S7系列串行通信模块 包括CP340 CP341 CP440 1 CP441 1 2 CPU313C 314C 2PtP以及ET200S的1SI 3964 ASCII等 都支持ASCII驱动协议的通信 可以广泛地用于与
  • Windows 10 如何添加开机启动项

    1 按下win R调出运行窗口 并输入 shell startup 即可进入开机启动文件夹 2 开机启动文件夹如图所示 此时文件夹中内容为空 3 如果想要添加启动项 可以将软件快捷方式移入开机启动文件夹中 4 我们可以在任务管理器中查看是否
  • Ubuntu 设置开机直接进入桌面

    使用autologin user 在 usr share lightdm lightdm conf d 60 lightdm gtk greeter conf 文件中添加一行指定您的用户名 例如 SeatDefaults greeter s
  • DTW 笔记: Dynamic Time Warping 动态时间规整 (&DTW的python实现) 【DDTW,WDTW】

    0 总述 DTW可以计算两个时间序列的相似度 尤其适用于不同长度 不同节奏的时间序列 比如不同的人读同一个词的音频序列 DTW将自动扭曲 warping 时间序列 即在时间轴上进行局部的缩放 使得两个序列的形态尽可能的一致 得到最大可能的相