时间序列挖掘-动态时间归整原理及实现(Dynamic Time Warping, DTW)

  本文地址为:http://www.cnblogs.com/kemaswill/,作者联系方式为kemaswill@163.com,转载请注明出处。  

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

  1. DTW方法原理

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

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

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

  2. DTW计算方法:

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

    2.1归整路径(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中的虚线不会相交,所谓单调增加是指:

  

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

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

  3. DTW实现

  在实现DTW时,我们采用动态规划的思想,其中D(i,j)表示长度为i和j的两个时间序列之间的归整路径距离:

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

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

    3.1 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 }

    3.2 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])

  4. DTW加速

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

  参考文献:

  [1]. FastDTW: Toward Accurate Dynamic Time Warping in Linear Time and Space. Stan Salvador, Philip Chan. 

  [2]. Wikipedia: Dynamic Time Warping

  [3]. Speech Recognition: 11.2 Dynamic Time Warping

posted on 2013-04-18 15:30  潘的博客  阅读(19725)  评论(2编辑  收藏  举报

导航