算法笔记-DTW动态时间规整

2023-11-16

算法笔记-DTW动态时间规整

动态时间规整/规划(Dynamic Time Warping, DTW)是一个比较老的算法,大概在1970年左右被提出来,最早用于处理语音方面识别分类的问题。

1.简介

简单来说,给定两个离散的序列(实际上不一定要与时间有关),DTW能够衡量这两个序列的相似程度,或者说两个序列的距离。同时DTW能够对两个序列的延展或者压缩能够有一定的适应性,举个例子,不同人对同一个词语的发音会有细微的差别,特别在时长上,有些人的发音会比标准的发音或长或短,DTW对这种序列的延展和压缩不敏感,所以给定标准语音库,DTW能够很好得识别单个字词,这也是为什么DTW一直被认为是语音处理方面的专门算法。实际上,DTW虽然老,但简单且灵活地实现模板匹配,能解决很多离散时间序列匹配的问题,视频动作识别,生物信息比对等等诸多领域都有应用。

例如下图,有两个呈现正弦规律序列,其中蓝色序列是稍微被拉长了。即使这两个序列,不重合,但是我们也可以有把握说这两个序列的相似程度很高(或者说这两个序列的距离很小)。
Two Sine Waves

DTW能够计算这两个序列的相似程度,并且给出一个能最大程度降低两个序列距离的点到点的匹配。见下图,其中黑色与红色曲线中的虚线就是表示点点之间的一个对应关系。
Two Sine Waves DTW mapped

也就是说,两个比对序列之间的特征是相似的,只是在时间上有不对齐的可能,这个算法名中的Time Warping,指的就是对时间序列进行的压缩或者延展以达到一个更好的匹对。

2.简单的例子

比如说,给定一个样本序列X和比对序列Y,Z:

X:3,5,6,7,7,1

Y:3,6,6,7,8,1,1
Z:2,5,7,7,7,7,2

请问是X和Y更相似还是X和Z更相似?

DTW首先会根据序列点之间的距离(欧氏距离),获得一个序列距离矩阵 M ,其中行对应X序列,列对应Y序列,矩阵元素为对应行列中X序列和Y序列点到点的欧氏距离:

X和Y的距离矩阵:

X/Y 3 6 6 7 8 1 1
3 0 3 3 4 5 2 2
5 2 1 1 2 3 4 4
6 3 0 0 1 2 5 5
7 4 1 1 0 1 6 6
7 4 1 1 0 1 6 6
1 2 5 5 6 7 0 0

然后根据距离矩阵生成1损失矩阵(Cost Matrix)或者叫累积距离矩阵 Mc,其计算方法如下:
1. 第一行第一列元素为 M 的第一行第一列元素,在这里就是0;
2. 其他位置的元素 (Mc(i,j))的值则需要逐步计算,具体值的计算方法为 Mc(i,j)=Min(Mc(i1,j1),Mc(i1,j),Mc(i,j1))+M(i,j) ,得到的 Mc 如下:

X/Y 3 6 6 7 8 1 1
3 0 3 6 10 15 17 19
5 2 1 2 4 7 11 15
6 5 1 1 2 4 9 14
7 9 2 2 1 2 8 14
7 13 3 3 1 2 8 14
1 15 8 8 7 8 2 2

最后,两个序列的距离,由损失矩阵最后一行最后一列给出,在这里也就是2。

同样的,计算X和Z的距离矩阵:

X/Z 2 5 7 7 7 7 2
3 1 2 4 4 4 4 1
5 3 0 2 2 2 2 3
6 4 1 1 1 1 1 4
7 5 2 0 0 0 0 5
7 5 2 0 0 0 0 5
1 1 4 6 6 6 6 1

和损失矩阵:

X/Z 2 5 7 7 7 7 2
3 1 3 7 11 15 19 20
5 4 1 3 5 7 9 12
6 8 2 2 3 4 5 9
7 13 4 2 2 2 2 7
7 18 6 2 2 2 2 7
1 19 10 8 8 8 8 3

所以,X和Y的距离为2,X和Z的距离为3,X和Y更相似。

3.定义

有一个具体例子作为帮助,我们再来定义DTW算法。

假设给定两个序列,样本序列 X=(x1,...,xN) 和测试序列 Y=(y1,...,yN) ,同时给定一个序列中点到点的距离函数 d(i,j)=f(xi,yj)0 (一般为欧氏距离,实际上也可以是别的函数)。

那么DTW的核心在于求解扭曲曲线(Warping Curve)或者说扭曲路径,也就是点点之间的对应关系。我们表示为 ϕ(k)=(ϕx(k),ϕy(k)) ,其中 ϕx(k) 的可能值为1,2…N, ϕy(k) 的可能值为1,2…M,k=1…T。也就是说,求出T个从X序列中点到Y序列中点的对应关系,例如若 ϕ(k)=(1,1) , 那么就是说X曲线的第一个点与Y曲线的第一个点是一个对应。

给定了 ϕ(k) ,我们可以求解两个序列的累积距离(Accumulated Distortion):

dϕ(X,Y)=k=1Td((ϕx(k),ϕy(k))

DTW的最后输出,就是要找到一个最合适的 ϕ(k) 扭曲曲线,使得累积距离最小,也就是损失矩阵的最后一行最后一列的值:

DTW(X,Y)=minϕdϕ(X,Y)

换句话说,就是给定了距离矩阵,如何找到一条从左上角到右下角的路径,使得路径经过的元素值之和最小。这个问题可以由动态规划(Dynamic Programming)解决(时间复杂度O(N+M)),也就是上面例子中,计算损失矩阵的过程,实际上不需要把整个矩阵都求解出来,大致将对角线上的元素求解出来即可。

4.讨论

实际上,虽然这个算法简单,但是有很多值得讨论的细节。

约束条件

首先,路径的寻找不是任意的,一般来说有三个约束条件:

  1. 单调性: ϕx(k+1)ϕx(k) ϕy(k+1)ϕy(k) ,也就是说扭曲曲线不能往左或者往上后退,否则会出现无意义的循环;
  2. 连续性: ϕx(k+1)ϕx(k)1 , 即扭曲曲线不能跳跃,必须是连续的,保证两个序列里的所有点都被匹配到,但这个条件可以一定程度上被放松;
  3. 边界条件确定性: ϕx(1)=ϕy(1)=1 ϕx(T)=N ϕy(T)=M ,即路径一定从左上开始,结束于右下,这个条件也可以被放松,以实现局部匹配。

除此之外,我们还可以增加别的约束:

  1. 全局路径窗口(Warping Window): |ϕx(s)ϕy(s)|r ,比较好的匹配路径往往在对角线附近,所以我们可以只考虑在对角线附近的一个区域寻找合适路径(r就是这个区域的宽度);
  2. 斜率约束(Slope Constrain): ϕx(m)ϕx(n)ϕy(m)ϕy(n)p ϕy(m)ϕy(n)ϕx(m)ϕx(n)q , 这个可以看做是局部的Warping Window,用于避免路径太过平缓或陡峭,导致短的序列匹配到太长的序列或者太长的序列匹配到太短的序列。

步模式

实际上,这些步模式(Step Pattern)一定程度上涵盖了不同的约束,步模式指的是生成损失矩阵时的具体算法,例如在例子中使用的是 Mc(i,j)=Min(Mc(i1,j1),Mc(i1,j),Mc(i,j1))+M(i,j) 准对称步模式。实际上还有很多其他步模式,不同的步模式会影响最终匹配的结果。关于不同的步模式,可以参见[2]第四章。常用的有对称,准对称和非对称三种。

标准化

序列的累积距离,可以被标准化,因为长的测试序列累积距离很容易比短的测试序列累积距离更大,但这不一定说明后者比前者与样本序列更相似,可以通过标准化累积距离再进行比较。不同的步模式会需要的不同的标准化参数。

点与点的距离函数

除了测试序列以外,DTW唯一需要的输入,就是距离函数 d (除了欧氏距离,也可以选择Mahalanobis距离等),所以不需要考虑输入的具体形式(一维或多维,离散或连续),只要能够给定合适的距离函数,就可以DTW比对。前面说到,DTW是对时间上的压缩和延展不敏感,但是对值的大小是敏感的,可以通过合理选取距离函数来让DTW适应值大小的差异。

5.具体应用场景

这里讨论两个具体应用DTW的可能场景:

分类

气象指数在旱季和雨季的样本序列分别为X1 X2 ,现有一段新的气象指数 Y ,要判断该气象指数测得时,是雨季还旱季?

算出DTW(X1, Y )和DTW(X2, Y ),小者即为与新测得气象指数更贴近,根据此作判断。

DTW就是一个很好的差异比较的工具,给出的距离(或标准化距离)能够进一步输入到KNN等分类器里(KNN就是要找最近的邻居,DTW能够用于衡量“近”与否),进行进一步分类,比对。

点到点匹配

给定标准语句的录音X,现有一段新的不标准的语句录音 Y <script type="math/tex" id="MathJax-Element-37">Y</script>,其中可能缺少或者掺入了别的字词。如何确定哪些是缺少的或者哪些是掺入别的?

通过DTW的扭曲路径,我们可以大致得到结论:

这里写图片描述

DTW的输出是很丰富的,除了距离外,还提供了扭曲路径,可用于点到点的匹配,这个信息是非常丰富的,能够看到序列的比对,发现异常的序列。


References
1.Giorgino, Toni. “Computing and visualizing dynamic time warping alignments in R: the dtw package.” Journal of statistical Software 31.7 (2009): 1-24.
2.Rabiner, Lawrence R., and Biing-Hwang Juang. Fundamentals of speech recognition. Vol. 14. Englewood Cliffs: PTR Prentice Hall, 1993.


  1. 这里用的是Quasi-symmetric准对称步模式(Step pattern)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法笔记-DTW动态时间规整 的相关文章

  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 如何确定算法函数的复杂度?

    您如何知道算法函数对于特定操作是否需要线性 常数 对数时间 它取决于CPU周期吗 您可以通过三种方式 至少 做到这一点 在网上查找算法 看看它是如何描述其时间复杂度的 根据输入大小 自己检查算法 查看嵌套循环和递归条件等内容 以及每个循环运
  • 最慢的计算复杂度(Big-O)

    在这些算法中 我知道 Alg1 是最快的 因为它是 n 平方的 接下来是 Alg4 因为它是 n 的立方 然后 Alg2 可能是最慢的 因为它是 2 n 这应该具有非常差的性能 然而Alg3和Alg5在我的阅读速度方面还没有遇到过 这两种算
  • 由周期表元素形成的最大单词的算法

    我想为以下问题场景编写一个算法 根据元素周期表元素的名称 找到可以组成的最大单词 符号如Na Ne等应被视为单个元素 这是在一家知名公司的求职面试中被问到的 有人可以帮我解决这个问题吗 我认为更好的方法是检查字典中的每个单词 看看是否可以从
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想
  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • 找到一条穿过任意节点序列的最短路径?

    In 这个先前的问题 https stackoverflow com questions 7314333 find shortest path from vertex u to v passing through a vertex wOP询
  • 从一种数字系统转换为另一种数字系统后会有多少位数字

    主要问题 有多少位数字 让我解释 我有一个二进制数 11000000 十进制数是192 转换为十进制后 它有多少位 以十进制表示 在我的示例中 它是 3 位数字 但是 这不是问题 我在互联网上搜索并找到了一种用于整数部分的算法和一种用于小数
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 在java中使用BUBBLE SORT对二维字符串数组进行排序

    类似的问题已经被问过 但从来没有关于二维字符串数组 因此在尝试了很长时间之后我找不到我想要的 我正在尝试使用 BubbleSort 对 java 中的 2D 字符串数组进行排序 作为输入 我收到一个二维字符串数组 一个表 以及您应该排序的
  • 以 O(1) 计算汉明权重 [重复]

    这个问题在这里已经有答案了 在二进制表示中 汉明权重是 1 的数量 我偶然发现了网络并找到了一个 O 1 的答案 v v v gt gt 1 0x55555555 v v 0x33333333 v gt gt 2 0x33333333 in
  • n 或 nlog(n) 比常数时间或对数时间更好吗?

    在 Coursera 上的普林斯顿教程中 讲师解释了遇到的常见增长顺序函数 他说 线性和线性算术运行时间是 我们努力的目标 他的推理是 随着输入大小的增加 运行时间也会增加 我认为这是他犯了错误的地方 因为我之前听过他提到线性增长顺序对于高
  • 每个术语出现的次数

    我得到了一个数组a n 2 where n can be 10 5最大时有n个科目和n个学生 全部编号为 1 2 n a i 0 and a i 1 1 lt i lt n 表示在第 i 个科目中 所有来自a i 0 to a i 1 通过
  • 照片马赛克算法。如何在给定基本图像和瓷砖列表的情况下创建马赛克照片?

    Hy 我要做的是创建一个程序 使用 C 或 C 它将 24 位 像素位图和图像集合作为输入 我必须创建一个马赛克图像 类似于使用库的输入图像给定的图像 创建与输入类似的马赛克照片 到目前为止 我可以访问输入的图像像素及其颜色 但我有点卡住了
  • 有没有时间复杂度为O(N)的排序算法?

    大多数排序算法的复杂度为 O NN 或 O NlogN 来实现结果 但是 对于特定的输入集 有些算法的复杂度为 O N 我想知道是否有一种排序算法在所有情况下都具有 O N 的复杂度 如果您只能比较 检查两个项目是否为 正在排序的值 那么您
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出

随机推荐