DTW(动态时间归整)算法的前世今生
今天和大家分享一下我剛剛學習到的DTW算法。
主要從以下幾個方面進行介紹:
1. DTW算法的提出和應用場景。
2. DTW算法的基本原理和計算過程。
3. DTW算法的具體代碼實現。
一、DTW算法的提出和應用場景
Dynamic Time Warping(簡稱:DTW)算法誕生有一定的歷史了(日本學者Itakura提出),它出現的目的也比較單純,是一種衡量兩個長度不同的時間序列的相似度的方法。應用也比較廣,主要是在模板匹配中,比如說用在孤立詞語音識別(識別兩段語音是否表示同一個單詞),手勢識別,視頻動作識別,數據挖掘和信息檢索等中,曾經是語音識別的一種主流方法。
二、DTW算法的基本原理和計算過程
前言:
在時間序列中,需要比較相似性的兩段時間序列的長度可能并不相等。其中,在語音識別領域表現為不同人的語速不同。因為語音信號具有相當大的隨機性,即使同一個人 在不同時刻發同一個音,也不可能具有完全的時間長度。而且同一個單詞內的不同音素的發音速度也不同,比如有的人會把“A”這個音拖得很長,或者把“i”發的很短。在這些復雜情況下,使用傳統的歐幾里得距離無法直接有效地求出兩個時間序列之間的距離(或者相似性)。
反映在視頻動作識別上,我們就可以將許多時間長短不一的動作視頻片段和現有已知某個動作的視頻片段(即模板)進行相似度的計算,以此來判斷未知的動作視頻片段屬于哪個動作的可能性更大一些,并且在這個過程中我們還消除了兩個視頻片段之間的時間長短不一的問題。
如下圖表述不同序列之間的匹配:
【注:實線為模板序列,虛線為測試序列。】
下面陳述一下基本的原理問題:
無論在訓練和建立模型階段還是在識別階段,都先采用端點算法確定時間序列的起點和終點。以存入模板庫(訓練數據集)的各個時間序列稱為參考模板(訓練數據),一個參考模板可表示為R={R(1),R(2),……,R(m),……,R(M)},m為模板時間序列中的時序標號,m=1為起點序列,m=M為終點序列,因此M為該模板所包含的時間序列中序列總數,R(m)為模板時間序列中第m個序列的特征向量。所要識別的某個時間序列稱為測試模板(測試數據),可表示為T={T(1),T(2),……,T(n),……,T(N)},n為測試時間序列中的時序標號,n=1為起點序列,n=N為終點序列,因此N為該測試時間序列所包含的時間序列中序列總數,T(n)為測試時間序列中第m個序列的特征向量。
假設測試模板和參考模板分別用T和R表示,為了比較它們之間的相似度,可以計算它們之間的距離 D[T,R],距離越小則相似度越高。為了計算這一失真距離,應從T和R中各個對應序列之間的距離算起。則d[T(n),R(m)]表示這兩個序列的特征向量之間的距離。距離函數取決于實際采用的距離度量,在DTW算法中通常采用歐氏距離。
若N=M則可以直接計算,否則要考慮將T(n)和R(m)對齊。對齊可以采用線性擴張的方法,如果N<M可以將T線性映射為一個M個數量的序列,再計算它與{R(1),R(2),……,R(m),……,R(M)}之間的距離。但是這樣的計算沒有考慮到時間序列中各個段在不同情況下的持續時間會產生或長或短的變化(即:相同時間內表示同一個內容的時間長短不一。例如:人跑步,在相同的10s內,A跑100m用了3s,但是B跑100m用了10s。B比A在時間上多了7s的長度,但是是他們都是跑了100m的長度呀!),因此識別效果不可能最佳。因此更多的是采用動態規劃(DP)的方法。
若把測試模板的各個***n=1N在一個二維直角坐標系中的橫軸上標出,把參考模板的各***m=1M在縱軸上標出,通過這些表示***的整數坐標畫出一些縱橫線即可形成一個網絡(矩陣),網絡中的每一個交叉點(n,m)表示測試模式和參考模式中某一序列的交匯點。DP算法可以歸結為尋找一條通過此網絡中若干格點的路徑,路徑通過的格點即為測試模板和參考模板中進行計算某兩個序列相似度的序列標號,每個格點存放的就是兩個序列相似度。當然路徑不是隨意選擇的,首先任何一種時間序列的序列產生的快慢都有可能變化,但是其各部分的先后發生的順序不可能改變,因此所選的路徑必定是從左下角出發,在右上角結束。
路徑通過的所有格點的序列標號依次為{(1 ,1 ),(1 ,2 ),……,(i ,j ),……,(N ,M )}。如果路徑已經通過了格點(n ,m ),那么下一個通過的格點只可能是下列三種情況之一:
(n +1,m)
(n +1,m +1)
(n ,m+1 )
【注:以上三種情況分別表示測試模板中的當前序列比訓練模板中當前序列快,一樣快,慢。】謹記!!!
滿足上面條件的路徑可以有指數個,然后我們感興趣的是使得下面的規整代價最小的路徑,即:搜索從(1, 1)點出發到達(N, M)點時的總的積累距離,具有最小累積距離的即為最佳路徑。易于證明,限定范圍的任一格點(n, m)只可能有一條搜索路徑通過。對于(n, m),其可達到該格點的前一個格點只可能是(n-1, m)、(n-1, m -1)和(n, m-1),那么(n, m)一定選擇這3個距離之路徑延伸而通過(n, m),這時此路徑的積累距離為:
D[(n, m)]=d[T(n),R(m)]+min{D(n-1,m),D(n-1,m-1),D(n,m-1)}
則從(1, 1)點出發到達(N, M)點時的總的積累距離,只保留一條最佳路徑。如果有必要的話,通過逐點向前尋找就可以求得整條路徑。這套DP算法便是DTW算法。
舉一個例子吧:
這個例子中假設標準模板R為字母ABCDEF(6個),測試模板T為1234(4個)。R和T中各元素之間的距離已經給出(可以進行序列之間的歐式距離的計算)。
【注:其中的R,T就是相當于兩段動作的視頻片段,而ABCDEF和1234就如組成這兩段視頻的圖片,分別是6張和4張。現在就是比較這兩段視頻表示的動作之間的相似度問題。】
如下:
既然是模板匹配,所以各分量的先后匹配順序已經確定了,雖然不是一一對應的。現在題目的目的是要計算出測試模板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+22=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)+2d(2,2)=4+24=12.因為是斜著過去的。
綜上所述,取最小值為9. 所有g(2,2)=9.
當然在這之前要計算出g(1,1),g(2,1),g(1,2).因此計算g(I,j)也是有一定順序的。
其基本順序可以體現在如下:
計算了第一排,其中每一個紅色的箭頭表示最小值來源的那個方向。當計算了第二排后的結果如下:
最后都算完了的結果如下:
到此為止,我們已經得到了答案,即2個模板直接的距離為26. 我們還可以通過回溯找到最短距離的路徑,通過箭頭方向反推回去。如下所示:
三、DTW算法的具體代碼實現
1.MATLAB實現
2.Python實現
3.C++實現
總結
以上是生活随笔為你收集整理的DTW(动态时间归整)算法的前世今生的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [html] 你是如何区分HTML和H
- 下一篇: 前端学习(2981):Json格式转换