时序分析:DTW算法(基于模板)
??????? 對(duì)時(shí)序?qū)ο筮M(jìn)行分析,使用KMP算法可以分析速率不變的模式,參考時(shí)序分析:歐式空間軌跡模式識(shí)別。使用基于模板匹配的方法,對(duì)于速率發(fā)生變化的模式,需要用新的對(duì)速率要求松散的方法,DTW方法為一種廣泛使用的方法。
?????? 此外,基于模板的方法也有MEI方法(Measured Equation of invariance)、MHI方法(OpenCV使用了-Forward-Backward MHI (before and after the historical figure to the movement)即前向后向歷史運(yùn)動(dòng)圖。
????? 參考:行為分析算法綜述(圖像圖形學(xué)學(xué)報(bào))-古老的DTW方法(Dynamic Time Wrapper)
一、 序列的對(duì)齊問(wèn)題
??????? 援引兩張圖:http://blog.csdn.net/zouxy09/article/details/9140207
??????? 參考鏈接:http://blog.csdn.net/vanezuo/article/details/5586727
??????? 參考鏈接:DTW用于語(yǔ)音識(shí)別
情況一:
?????? 如圖A所示,實(shí)線(xiàn)和虛線(xiàn)分別是同一個(gè)詞“pen”的兩個(gè)語(yǔ)音波形(在y軸上拉開(kāi)了,以便觀(guān)察)。可以看到他們整體上的波形形狀很相似,但在時(shí)間軸上卻是不對(duì)齊的。例如在第20個(gè)時(shí)間點(diǎn)的時(shí)候,實(shí)線(xiàn)波形的a點(diǎn)會(huì)對(duì)應(yīng)于虛線(xiàn)波形的b’點(diǎn),這樣傳統(tǒng)的通過(guò)比較距離來(lái)計(jì)算相似性很明顯不靠譜。因?yàn)楹苊黠@,實(shí)線(xiàn)的a點(diǎn)對(duì)應(yīng)虛線(xiàn)的b點(diǎn)才是正確的。而在圖B中,DTW就可以通過(guò)找到這兩個(gè)波形對(duì)齊的點(diǎn),這樣計(jì)算它們的距離才是正確的。
???????
????
????? 也就是說(shuō),大部分情況下,兩個(gè)序列整體上具有非常相似的形狀,但是這些形狀在x軸上并不是對(duì)齊的。所以我們?cè)诒容^他們的相似度之前,需要將其中一個(gè)(或者兩個(gè))序列在時(shí)間軸下warping扭曲,以達(dá)到更好的對(duì)齊。而DTW就是實(shí)現(xiàn)這種warping扭曲的一種有效方法。DTW通過(guò)把時(shí)間序列進(jìn)行延伸和縮短,來(lái)計(jì)算兩個(gè)時(shí)間序列性之間的相似性。
?????? 那如果才知道兩個(gè)波形是對(duì)齊了呢?也就是說(shuō)怎么樣的warping才是正確的?直觀(guān)上理解,當(dāng)然是warping一個(gè)序列后可以與另一個(gè)序列重合recover。這個(gè)時(shí)候兩個(gè)序列中所有對(duì)應(yīng)點(diǎn)的距離之和是最小的。所以從直觀(guān)上理解,warping的正確性一般指“feature to feature”的對(duì)齊。
二、DTW算法
??????? 動(dòng)態(tài)時(shí)間規(guī)整DTW是一個(gè)典型的優(yōu)化問(wèn)題,它用滿(mǎn)足一定條件的的時(shí)間規(guī)整函數(shù)W(n)描述測(cè)試模板和參考模板的時(shí)間對(duì)應(yīng)關(guān)系,求解兩模板匹配時(shí)累計(jì)距離最小所對(duì)應(yīng)的規(guī)整函數(shù)。
????? 假設(shè)我們有兩個(gè)時(shí)間序列Q和C,他們的長(zhǎng)度分別是n和m:(實(shí)際語(yǔ)音匹配運(yùn)用中,一個(gè)序列為參考模板,一個(gè)序列為測(cè)試模板,序列中的每個(gè)點(diǎn)的值為語(yǔ)音序列中每一幀的特征值。例如語(yǔ)音序列Q共有n幀,第i幀的特征值(一個(gè)數(shù)或者一個(gè)向量)是qi。至于取什么特征,在這里不影響DTW的討論。我們需要的是匹配這兩個(gè)語(yǔ)音序列的相似性,以達(dá)到識(shí)別我們的測(cè)試語(yǔ)音是哪個(gè)詞)
????? Q= q1, q2,…,qi,…, qn?;
?? ?? C= c1, c2,…, cj,…, cm?;
?????? 如果 n = m,那么就用不著折騰了,直接計(jì)算兩個(gè)序列的距離就好了。但如果n不等于m 我們就需要對(duì)齊。最簡(jiǎn)單的對(duì)齊方式就是線(xiàn)性縮放了。把短的序列線(xiàn)性放大到和長(zhǎng)序列一樣的長(zhǎng)度再比較,或者把長(zhǎng)的線(xiàn)性縮短到和短序列一樣的長(zhǎng)度再比較。但是這樣的計(jì)算沒(méi)有考慮到語(yǔ)音中各個(gè)段在不同情況下的持續(xù)時(shí)間會(huì)產(chǎn)生或長(zhǎng)或短的變化,因此識(shí)別效果不可能最佳。因此更多的是采用動(dòng)態(tài)規(guī)劃(dynamic programming)的方法。
????? 為了對(duì)齊這兩個(gè)序列,我們需要構(gòu)造一個(gè)n x m的矩陣網(wǎng)格,矩陣元素(i, j)表示qi和cj兩個(gè)點(diǎn)的距離d(qi, cj)(也就是序列Q的每一個(gè)點(diǎn)和C的每一個(gè)點(diǎn)之間的相似度,距離越小則相似度越高。這里先不管順序),一般采用歐式距離,d(qi, cj)= (qi-cj)2(也可以理解為失真度)。每一個(gè)矩陣元素(i, j)表示點(diǎn)qi和cj的對(duì)齊。DP算法可以歸結(jié)為尋找一條通過(guò)此網(wǎng)格中若干格點(diǎn)的路徑,路徑通過(guò)的格點(diǎn)即為兩個(gè)序列進(jìn)行計(jì)算的對(duì)齊的點(diǎn)。
????????????? 那么這條路徑我們?cè)趺凑业侥?#xff1f;那條路徑才是最好的呢?也就是剛才那個(gè)問(wèn)題,怎么樣的warping才是最好的。
??????? 我們把這條路徑定義為warping path規(guī)整路徑,并用W來(lái)表示, W的第k個(gè)元素定義為wk=(i,j)k,定義了序列Q和C的映射。這樣我們有:
???????
?????? 首先,這條路徑不是隨意選擇的,需要滿(mǎn)足以下幾個(gè)約束:
1)邊界條件:w1=(1, 1)和wK=(m, n)。任何一種語(yǔ)音的發(fā)音快慢都有可能變化,但是其各部分的先后次序不可能改變,因此所選的路徑必定是從左下角出發(fā),在右上角結(jié)束。
2)連續(xù)性:如果wk-1= (a’, b’),那么對(duì)于路徑的下一個(gè)點(diǎn)wk=(a, b)需要滿(mǎn)足 (a-a’) <=1和 (b-b’) <=1。也就是不可能跨過(guò)某個(gè)點(diǎn)去匹配,只能和自己相鄰的點(diǎn)對(duì)齊。這樣可以保證Q和C中的每個(gè)坐標(biāo)都在W中出現(xiàn)。
3)單調(diào)性:如果wk-1= (a’, b’),那么對(duì)于路徑的下一個(gè)點(diǎn)wk=(a, b)需要滿(mǎn)足0<=(a-a’)和0<= (b-b’)。這限制W上面的點(diǎn)必須是隨著時(shí)間單調(diào)進(jìn)行的。以保證圖B中的虛線(xiàn)不會(huì)相交。
???????? 結(jié)合連續(xù)性和單調(diào)性約束,每一個(gè)格點(diǎn)的路徑就只有三個(gè)方向了。例如如果路徑已經(jīng)通過(guò)了格點(diǎn)(i, j),那么下一個(gè)通過(guò)的格點(diǎn)只可能是下列三種情況之一:(i+1, j),(i, j+1)或者(i+1, j+1)。
????
滿(mǎn)足上面這些約束條件的路徑可以有指數(shù)個(gè),然后我們感興趣的是使得下面的規(guī)整代價(jià)最小的路徑:
????
?????? 分母中的K主要是用來(lái)對(duì)不同的長(zhǎng)度的規(guī)整路徑做補(bǔ)償。我們的目的是什么?或者說(shuō)DTW的思想是什么?是把兩個(gè)時(shí)間序列進(jìn)行延伸和縮短,來(lái)得到兩個(gè)時(shí)間序列性距離最短也就是最相似的那一個(gè)warping,這個(gè)最短的距離也就是這兩個(gè)時(shí)間序列的最后的距離度量。在這里,我們要做的就是選擇一個(gè)路徑,使得最后得到的總的距離最小。
???? ? 這里我們定義一個(gè)累加距離cumulative distances。從(0, 0)點(diǎn)開(kāi)始匹配這兩個(gè)序列Q和C,每到一個(gè)點(diǎn),之前所有的點(diǎn)計(jì)算的距離都會(huì)累加。到達(dá)終點(diǎn)(n, m)后,這個(gè)累積距離就是我們上面說(shuō)的最后的總的距離,也就是序列Q和C的相似度 。
????? 累積距離γ(i,j)可以按下面的方式表示,累積距離γ(i,j)為當(dāng)前格點(diǎn)距離d(i,j),也就是點(diǎn)qi和cj的歐式距離(相似性)與可以到達(dá)該點(diǎn)的最小的鄰近元素的累積距離之和:
?????????? 最佳路徑是使得沿路徑的積累距離達(dá)到最小值這條路徑。這條路徑可以通過(guò)動(dòng)態(tài)規(guī)劃(dynamic programming)算法得到。
????? 具體搜索或者求解過(guò)程的直觀(guān)例子解釋可以參考:http://www.cnblogs.com/tornadomeet/archive/2012/03/23/2413363.html
三、DTW代碼:
代碼
四、一些問(wèn)題
動(dòng)態(tài)規(guī)劃算法總體思想: ?????? 動(dòng)態(tài)規(guī)劃算法基本思想是將待求解問(wèn)題分解成若干個(gè)子問(wèn)題 ?????? 但是經(jīng)分解得到的子問(wèn)題往往不是互相獨(dú)立的。不同子問(wèn)題的數(shù)目常常只有多項(xiàng)式量級(jí)。求解時(shí),有些子問(wèn)題被重復(fù)計(jì)算了許多次。 ?????? 如果能夠保存已解決的子問(wèn)題的答案,而在需要時(shí)再找出已求得的答案,就可以避免大量重復(fù)計(jì)算,從而得到多項(xiàng)式時(shí)間算法。
動(dòng)態(tài)規(guī)劃基本步驟: ?????? v找出最優(yōu)解的性質(zhì),并刻劃其結(jié)構(gòu)特征。 ?????? v遞歸地定義最優(yōu)值。 ?????? v以自底向上的方式計(jì)算出最優(yōu)值。 ?????? v根據(jù)計(jì)算最優(yōu)值時(shí)得到的信息,構(gòu)造最優(yōu)解
總結(jié)
以上是生活随笔為你收集整理的时序分析:DTW算法(基于模板)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 宝可梦剑盾可以联机吗
- 下一篇: 时序分析:Kalman滤波(状态空间)