目录

1 DTW(动态时间调整)

2 算法的实现

3 例子

4 python实现

​​​​​​​5 DTW的加速算法FastDTW

5.1 标准DTW算法

5.2 DTW常用加速手段

5.3 FastDTW​​​​​​​


DTW(动态时间调整)

动态时间调整算法是大多用于检测两条语音的相似程度,由于、每次发言,每个字母发音的长短不同,会导致两条语音不会完全的吻合,动态时间调整算法,会对语音进行拉伸或者压缩,使得它们尽可能的对齐。

如上图红圈标注的位置,可以发现下面那条线中有许多的点与之对应,如果换成一个个离散的点表示的话,实际上是对上一条曲线该点进行了拉伸处理,使得它们最大化对齐。

2 算法的实现

最近在研究时间序列的问题,时间序列类似这个。假如想计算两条天气的时间序列是否相似,由于时间序列有的时候会出现延迟的现象,导致两条时间序列吻合的不好,可以通过这样的方法来准确的计算。

这个算法的实现和动态规划十分相似。

为了对齐这两个序列,我们需要构造一个 n x m 的矩阵网格,矩阵元素 (i, j) 表示 qi 和 cj 两个点的距离 d(qi, cj)(也就是序列Q的每一个点和C的每一个点之间的相似度,距离越小则相似度越高。这里先不管顺序),一般采用欧式距离,(也可以理解为失真度)。每一个矩阵元素 (i, j) 表示点 qicj 的对齐。DP算法可以归结为寻找一条通过此网格中若干格点的路径,路径通过的格点即为两个序列进行计算的对齐的点。

那么这条路径我们怎么找到呢?那条路径才是最好的呢?也就是刚才那个问题,怎么样的warping才是最好的。

注明:两个序列长度不同,不能使用欧氏距离进行匹配。使用 dtw 时,上图方格中的每个连续的点(开头(1,1)和结尾(m,n)还是要保证的)构成的曲线都有可能,这是就要找出代价最小的那条曲线,如图中标出的黑色曲线。

我们把这条路径定义为warping path规整路径,并用W来表示, W的第k个元素定义为 ,定义了序列Q和C的映射。这样我们有:

首先,这条路径不是随意选择的,需要满足以下几个约束:

1)边界条件:。任何一种语音的发音快慢都有可能变化,但是其各部分的先后次序不可能改变,因此所选的路径必定是从左下角出发,在右上角结束。

2)连续性:如果,那么对于路径的下一个点  需要满足 (a-a’) <=1 和 (b-b’) <=1。也就是不可能跨过某个点去匹配,只能和自己相邻的点对齐。这样可以保证Q和C中的每个坐标都在W中出现。

3)单调性:如果,那么对于路径的下一个点  需要满足 0<=(a-a’)0<= (b-b’)。这限制W上面的点必须是随着时间单调进行的。以保证图B中的虚线不会相交。

结合连续性和单调性约束,每一个格点的路径就只有三个方向了。例如如果路径已经通过了格点(i, j),那么下一个通过的格点只可能是下列三种情况之一:(i+1, j),(i, j+1)或者(i+1, j+1)。

满足上面这些约束条件的路径可以有指数个,然后我们感兴趣的是使得下面的规整代价最小的路径:

分母中的 K 主要是用来对不同的长度的规整路径做补偿。我们的目的是什么?或者说 DTW 的思想是什么?

是把两个时间序列进行延伸和缩短,来得到两个时间序列性距离最短也就是最相似的那一个warping,这个最短的距离也就是这两个时间序列的最后的距离度量。在这里,我们要做的就是选择一个路径,使得最后得到的总的距离最小。

这里我们定义一个累加距离cumulative distances。从(0, 0)点开始匹配这两个序列Q和C,每到一个点,之前所有的点计算的距离都会累加。到达终点(n, m)后,这个累积距离就是我们上面说的最后的总的距离,也就是序列Q和C的相似度

累积距离 γ(i,j) 可以按下面的方式表示,累积距离 γ(i,j) 为当前格点距离 d(i,j),也就是点qi和cj的欧式距离(相似性)与可以到达该点的最小的邻近元素的累积距离之和:

注明:先把模板序列和测试序列的每个点相对应的距离算出来,构成一个 m x n 的矩阵。然后根据每个元素的代价计算一条最短路径。这里的计算要符合以上三个约束。即,一个点的代价=这个点的值+来自min{下、左、斜下这三个方向的值}。下、左、斜下这三个方向的值可以依次递归求得,直到(1,1)点。

3 例子

这个例子中假设标准模板R为字母ABCDEF(6个),测试模板T1234(4个)。R和T中各元素之间的距离已经给出。如下:

既然是模板匹配,所以各分量的先后匹配顺序已经确定了,虽然不是一一对应的。现在题目的目的是要计算出测试模板T和标准模板R之间的距离。因为2个模板的长度不同,所以其对应匹配的关系有很多种,我们需要找出其中距离最短的那条匹配路径。现假设题目满足如下的约束:当从一个方格((i-1,j-1)或者 (i-1,j)或者(i,j-1))中到下一个方格(i,j),如果是横着或者竖着的话其距离为d(i,j),如果是斜着对角线过来的则是 2d(i,j).其约束条件如下图像所示:

其中g(i,j)表示2个模板都从起始分量逐次匹配,已经到了M中的i分量和T中的j分量,并且匹配到此步是2个模板之间的距离。并且都是在前一次匹配的结果上加d(i,j)或者2d(i,j),然后取最小值。

所以我们将所有的匹配步骤标注后如下:

怎么得来的呢?比如说g(1,1)=4, 当然前提都假设是 g(0,0)=0,就是说 g(1,1)=g(0,0)+2d(1,1)=0+2*2=4.

g(2,2)=9是一样的道理。首先如果从g(1,2)来算的话是g(2,2)=g(1,2)+d(2,2)=5+4=9,因为是竖着上去的。

如果从g(2,1)来算的话是g(2,2)=g(2,1)+d(2,2)=7+4=11,因为是横着往右走的。

如果从g(1,1)来算的话,g(2,2)=g(1,1)+2*d(2,2)=4+2*4=12.因为是斜着过去的。

综上所述,取最小值为9. 所有g(2,2)=9.

当然在这之前要计算出g(1,1),g(2,1),g(1,2).因此计算g(I,j)也是有一定顺序的。

其基本顺序可以体现在如下:

计算了第一排,其中每一个红色的箭头表示最小值来源的那个方向。当计算了第二排后的结果如下:

最后都算完了的结果如下:

到此为止,我们已经得到了答案,即2个模板直接的距离为26. 我们还可以通过回溯找到最短距离的路径,通过箭头方向反推回去。如下所示:

算法:

注明:不管哪个方向,我都只加上了其本身的数值,即d(i j),没有x2.得出的路径是一样的。

4 python实现

import numpy as np# We define two sequences x, y as numpy array
# where y is actually a sub-sequence from x
x = np.array([2, 0, 1, 1, 2, 4, 2, 1, 2, 0]).reshape(-1, 1)
y = np.array([1, 1, 2, 4, 2, 1, 2, 0]).reshape(-1, 1)from dtw import dtweuclidean_norm = lambda x, y: np.abs(x - y)d, cost_matrix, acc_cost_matrix, path = dtw(x, y, dist=euclidean_norm)print(d)
>>> 0.1111111111111111 # Only the cost for the insertions is kept# You can also visualise the accumulated cost and the shortest path
import matplotlib.pyplot as pltplt.imshow(acc_cost_matrix.T, origin='lower', cmap='gray', interpolation='nearest')
plt.plot(path[0], path[1], 'w')
plt.show()

​​​​​​​5 DTW的加速算法FastDTW

DTW采用动态规划来计算两个时间序列之间的相似性,算法复杂度为O(N2)。当两个时间序列都比较长时,DTW算法效率比较慢,不能满足需求,为此,有许多对DTW进行加速的算法:FastDTW,SparseDTW,LB_Keogh,LB_Improved等。在这里我们介绍FastDTW。

5.1 标准DTW算法

在DTW中,我们要寻找的是一个归整路径,如下图所示:

最终我们想要得到的是:这条路径经过的所有点的坐标(i,j)对应的X和Y两个时间序列的点Xi和Yj的距离(比如欧几里得距离)之和,亦即我们需要求得代价矩阵最右上角的元素D(i,j)。而根据动态规划的思想:

要求得D(i,j)必须要知道D(i-1,j), D(i-1,j-1), D(i,j-1)等,以此类推,我们需要求得整个D矩阵,才能得到最终的D(i,j),亦即算法的时间复杂度为O(N2)。

5.2 DTW常用加速手段

常用的DTW加速手段有:

(1)限制。亦即减少D的搜索空间,下图中阴影部分为实际的探索空间,空白的部分不进行探索。

(2)数据抽象。亦即把之前长度为N的时间序列规约成长度为M(M<N)表述方式:

(3)索引。索引是在进行分类和聚类时减少需要运行的DTW的次数的方法,并不能加速一次的DTW计算。

5.3 FastDTW

FastDTW综合使用限制数据抽象两种方法来加速DTW的计算,主要分为三个步骤:

(1)粗粒度化。亦即首先对原始的时间序列进行数据抽象,数据抽象可以迭代执行多次1/1->1/2->1/4->1/16,粗粒度数据点是其对应的多个细粒度数据点的平均值。

(2)投影。在较粗粒度上对时间序列运行DTW算法。

(3)细粒度化。将在较粗粒度上得到的归整路径经过的方格进一步细粒度化到较细粒度的时间序列上。除了进行细粒度化之外,我们还额外的在较细粒度的空间内额外向外(横向,竖向,斜向)扩展K个粒度,K为半径参数,一般取为1或者2.

FastDTW算法的具体执行流程如下图所示:

第一个图表示在较粗粒度空间(1/8)内执行DTW算法。第二个图表示将较粗粒度空间(1/8)内求得的归整路径经过的方格细粒度化,并且向外(横向,竖向,斜向)扩展一个(由半径参数确定)细粒度单位后,再执行DTW得到的归整路径。第三个图和第四个图也是这样。

由于采取了减少搜索空间的策略,FastDTW并不一定能够求得准确的DTW距离,但是FastDTW算法的时间复杂度比较低,为O(N)

DTW和DBA:DTW和DBA - 我要记下来! - 博客园

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

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

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

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

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

  3. dynamic time warping matlab,Dynamic Time Warping 动态时间规整算法

    Dynamic Time Warping(DTW)是一种衡量两个时间序列之间的相似度的方法,主要应用在语音识别领域来识别两段语音是否表示同一个单词. 1. DTW方法原理 在时间序列中,需要比较相似性 ...

  4. Python dtw(dynamic time warping)模块

    dtw是一个用于计算动态时间扭曲距离的python模块.它可以作为时间序列之间的相似性度量. dtw模块官方文档:https://www.cnpython.com/pypi/dtw DTW(dynam ...

  5. [系统安全] 二十三.逆向分析之OllyDbg动态调试复习及TraceMe案例分析

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  6. 机器学习算法(十三):word2vec

    目录 1 单词表达 1.1 Word embedding 1.2 独热(One hot representation) 1.2.1 独热编码介绍 1.2.2 优缺点分析 1.3 Dristribute ...

  7. 机器学习(二十三)——Beam Search, NLP机器翻译常用评价度量, 模型驱动 vs 数据驱动

    https://antkillerfarm.github.io/ Beam Search Beam Search(集束搜索)是一种启发式图搜索算法,通常用在图的解空间比较大的情况下,为了减少搜索所占用 ...

  8. 机器学习知识点(二十三)黎曼流形认知

    对于流形,我在机器学习中的认识就是局部欧式距离的应用,当然其背后强大的数学逻辑也不是一时可以窥全貌,只好先看看一些基础概念. 1.基本概念 流形,是局部具有欧几里得空间性质的空间,是欧几里得空间中的曲 ...

  9. 吴恩达机器学习(二十三)支持向量机、大间距分类器

    文章目录 1.支持向量机 2.大间距分类器 1.支持向量机 2.大间距分类器   对于支持向量机的代价函数,如果C非常非常大,那么当最小化优化目标的时候,我们希望找到一项使得第一项为0: 我们可以这样 ...

最新文章

  1. Python + Selenium 自动发布文章(二):简书
  2. JavaScript新鲜事·第6期
  3. apache 服务发布多个项目,只需要更改配置文件(需要设定虚拟主机)
  4. labview的介绍,安装和卸载
  5. 虚拟资源拳王公社:做什么副业能最快赚到钱?虚拟副业是怎么赚钱的
  6. Oracle数据库经典50题(附答案),写完不理解的来打我
  7. win7修复office图标显示不正确
  8. Java无法加载主类
  9. steam社区打不开,解决mac无法打开steam社区的方法
  10. 响应式H5图片网盘外链系统源码 自适应PC手机端
  11. 废旧闲置的笔记本除了电脑回收,这两招也很实用!
  12. 个人角度谈IE10浏览器
  13. CentOS 7 minimal安装完成之后安装图形界面
  14. 你开车都有什么小技巧?
  15. 20162316刘诚昊 队列课下作业
  16. 51单片机的步进电机控制系统(仿真+程序+报告+原理图)
  17. 大数据技术 学习笔记
  18. CCRC信息安全服务资质认证涨价了?最新规定已发布,重点已经给你们划好了~
  19. OpenGL入门之纹理的使用
  20. 材料力学 2.拉伸、压缩与剪切

热门文章

  1. VIPKID -- 一面+二面
  2. 面对企业校招,你的背景够格吗?(限学生阅读)
  3. ACS606驱动器源代码,成熟量产低压无刷伺服驱动 源码
  4. html5 表单for,HTML5 for(网页表单制作)(姬岚洋).doc
  5. 关于翻书插件turn.js的运用
  6. 华为交换机忘记super密码
  7. c语言strtof函数用法,c语言工具函数
  8. OpenCV实现动态人脸识别(第一讲)
  9. css中盒子模型图片,CSS 盒子模型
  10. A guide to the RSA system / c++ archieve