DTW动态规划调整

DTW是一种衡量两个时间序列之间的相似度的方法,主要应用在语音识别领域来识别两段语音是否表示同一个单词。

1 DTW方法原理

时间序列中,需要比较相似性的两段时间序列的长度可能并不相等,在语音识别领域表现为不同人的语速不同。而且同一个单词内的不同音素的发音速度也不同,比如有的人会把‘A’这个音拖得很长,或者把‘i’发的很短。另外,不同时间序列可能仅仅存在时间轴上的位移,亦即在还原位移的情况下,两个时间序列是一致的。在这些复杂情况下,使用传统的欧几里得距离无法有效地求的两个时间序列之间的距离(或者相似性)。

DTW通过把时间序列进行延伸和缩短,来计算两个时间序列性之间的相似性:

动态时间归整原理及python实现(Dynamic Time Warping, DTW),by 5lulu.com

如上图所示,上下两条实线代表两个时间序列时间序列之间的虚线代表两个时间序列之间的相似的点。DTW使用所有这些相似点之间的距离的和,称之为归整路径距离(Warp Path Distance)来衡量两个时间序列之间的相似性。

2 DTW计算方法

令要计算相似度的两个时间序列为X和Y,长度分别为|X|和|Y|。

3 归整路径(Warp Path)

归整路径的形式为W=w1,w2,…,wK,其中Max(|X|,|Y|)<=K<=|X|+|Y|。

wk的形式为(i,j),其中i表示的是X中的i坐标,j表示的是Y中的j坐标。

归整路径W必须从w1=(1,1)开始,到wK=(|X|,|Y|)结尾,以保证X和Y中的每个坐标都在W中出现。

另外,W中w(i,j)的i和j必须是单调增加的,以保证图1中的虚线不会相交,所谓单调增加是指:

动态时间归整原理及python实现(Dynamic Time Warping, DTW),by 5lulu.com

我们最后要得到的归整路径是距离最短的一个归整路径:

动态时间归整原理及python实现(Dynamic Time Warping, DTW),by 5lulu.com

其中Dist(wki,wkj)为任意经典的距离计算方法,比如欧几里得距离。wki是指X的第i个数据点,wkj是指Y的第j个数据点。

4 DTW实现

在实现DTW时,我们采用动态规划的思想,其中D(i,j)表示长度为i和j的两个时间序列之间的归整路径距离:动态时间归整原理及python实现(Dynamic Time Warping, DTW),by 5lulu.com

我们最后求得的归整路径距离为D(|X|,|Y|),使用动态规划来进行求解:

动态时间归整原理及python实现(Dynamic Time Warping, DTW),by 5lulu.com

上图为代价矩阵(Cost Matrix) D,D(i,j)表示长度为i和j的两个时间序列之间的归整路径距离。


DTW实现的伪代码

 
 
  1. int DTWDistance(s: array [1..n], t: array [1..m]) {
  2. DTW := array [0..n, 0..m]
  3.  
  4. for i := 1 to n
  5. DTW[i, 0] := infinity
  6. for i := 1 to m
  7. DTW[0, i] := infinity
  8. DTW[0, 0] := 0
  9.  
  10. for i := 1 to n
  11. for j := 1 to m
  12. cost:= d(s[i], t[j])
  13. DTW[i, j] := cost + minimum(DTW[i-1, j ], // insertion
  14. DTW[i , j-1], // deletion
  15. DTW[i-1, j-1]) // match
  16.  
  17. return DTW[n, m]
  18. }



DTW实现的Python代码

 
 
  1. def dtw(X,Y):
  2. X=[1,2,3,4]
  3. Y=[1,2,7,4,5]
  4. M=[[distance(X[i],Y[i]) for i in range(len(X))] for j in range(len(Y))]
  5. l1=len(X)
  6. l2=len(Y)
  7. D=[[0 for i in range(l1+1)] for i in range(l2+1)]
  8. D[0][0]=0
  9. for i in range(1,l1+1):
  10. D[0][i]=sys.maxint
  11. for j in range(1,l2+1):
  12. D[j][0]=sys.maxint
  13. for j in range(1,l2+1):
  14. for i in range(1,l1+1):
  15. D[j][i]=M[j-1][i-1]+Min(D[j-1][i],D[j][i-1],D[j-1][i-1]+M[j-1][i-1])


5加速

DTW虽然使用线性规划可以快速的求解,但是在面对比较长的时间序列是,O(N2)的时间复杂度还是很大。已经有很多改进的快速DTW算法,比如FastDTW,SparseDTW,LB_Keogh,LB_Improved等等。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在日常的生活中我们最经常使用的距离毫无疑问应该是欧式距离,但是对于一些特殊情况,欧氏距离存在着其很明显的缺陷,比如说时间序列,举个比较简单的例子,序列A:1,1,1,10,2,3,序列B:1,1,1,2,10,3,如果用欧氏距离,也就是distance[i][j]=(b[j]-a[i])*(b[j]-a[i])来计算的话,总的距离和应该是128,应该说这个距离是非常大的,而实际上这个序列的图像是十分相似的,这种情况下就有人开始考虑寻找新的时间序列距离的计算方法,然后提出了DTW算法,这种方法在语音识别,机器学习方便有着很重要的作用。 这个算法是基于动态规划(DP)的思想,解决了发音长短不一的模板匹配问题,简单来说,就是通过构建一个邻接矩阵,寻找最短路径和。 还以上面的2个序列作为例子,A中的10和B中的2对应以及A中的2和B中的10对应的时候,distance[3]以及distance[4]肯定是非常大的,这就直接导致了最后距离和的膨胀,这种时候,我们需要来调整时间序列,如果我们让A中的10和B中的10 对应 ,A中的1和B中的2对应,那么最后的距离和就将大大缩短,这种方式可以看做是一种时间扭曲,看到这里的时候,我相信应该会有人提出来,为什么不能使用A中的2与B中的2对应的问题,那样的话距离和肯定是0了啊,距离应该是最小的吧,但这种情况是不允许的,因为A中的10是发生在2的前面,而B中的2则发生在10的前面,如果对应方式交叉的话会导致时间上的混乱,不符合因果关系。 接下来,以output[6][6](所有的记录下标从1开始,开始的时候全部置0)记录A,B之间的DTW距离,简单的介绍一下具体的算法,这个算法其实就是一个简单的DP,状态转移公式是output[i] [j]=Min(Min(output[i-1][j],output[i][j-1]),output[i-1][j-1])+distance[i] [j];最后得到的output[5][5]就是我们所需要的DTW距离.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值