時間序列挖掘-動態時間歸整原理及實現(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM