基于动态规划DTW算法加速衡量两个不同的时间序列的相似性
什么是DTW?
DTW算法采用了動(dòng)態(tài)規(guī)劃DP(dynamic programming)的方法來進(jìn)行時(shí)間規(guī)整的計(jì)算,可以說,動(dòng)態(tài)規(guī)劃方法在時(shí)間規(guī)整問題上的應(yīng)用就是DTW。
為什么需要DTW算法
當(dāng)兩個(gè)序列按照時(shí)間步t完全對齊的時(shí)候,我們可以直接使用ED算法(或者其它距離計(jì)算)來評估兩個(gè)算法的相似度。但是有些時(shí)候兩個(gè)序列并未完全對其,如果我們將某一序列進(jìn)行壓縮處理,此時(shí)會(huì)有信息損失。那么是否可以將兩個(gè)長度不一樣的序列進(jìn)行對齊,然后再進(jìn)行距離計(jì)算,DTW算法可以完成這個(gè)任務(wù)。
如圖所示,這兩個(gè)序列整體上波形很相似,但是在時(shí)間軸上確實(shí)對不齊的,所以這樣如果按照時(shí)間步t對應(yīng)來求距離顯然會(huì)出問題。
為了解決這個(gè)問題,我們需要進(jìn)行對齊操作:
如圖所示,就是應(yīng)用DTW算法之后的對齊之后的效果圖,那么此時(shí)我們對兩個(gè)序列的對應(yīng)點(diǎn)之間計(jì)算距離,此時(shí)才是這兩個(gè)序列的真實(shí)距離。
DTW的核心問題?
DTW核心是將兩個(gè)不同的序列按照最好的方式對齊,而如何才是最好對齊呢?對齊的方式有很多,最好的對齊方式就是兩個(gè)序列的距離最小,同時(shí)這個(gè)最小的距離就是這兩個(gè)序列的距離。
如圖所示,兩條完全不同的序列Q,C,如何才能對齊呢?
假設(shè)Q的序列長度為n,而C的序列長度為m,那么我們需要構(gòu)建一個(gè)n*m的矩陣,其中矩陣元素(i,j)表示Qi和Cj之間的距離。每個(gè)矩陣元素表示Qi和Cj對齊,那么從矩陣左下角到右上角可以找到很多路徑(為什么是從左下角到右上角,因?yàn)閮蓚€(gè)不同的序列無論長短,它們的起始點(diǎn)和終止點(diǎn)肯定是對應(yīng)的),這個(gè)矩陣包含了所有的對齊路徑,DP算法就是要找到一條最短的路徑。
路徑的性質(zhì)
首先這條路徑需要滿足一定的性質(zhì),它可以幫助算法對路徑進(jìn)行規(guī)范。
邊界條件:必須從矩陣的左上角到矩陣的右上角
連續(xù)性:路徑需要是連續(xù)的,不能跨越某點(diǎn)去匹配,(跨越其實(shí)也行,這樣會(huì)有信息損失)
單調(diào)性:路徑必須隨著時(shí)間單調(diào)進(jìn)行,這樣路徑不會(huì)出現(xiàn)相交的情況。
連續(xù)性和單調(diào)性決定了路徑中每一個(gè)格點(diǎn)只有三個(gè)方向,如果當(dāng)前格點(diǎn)為(i,j),那么下一個(gè)格點(diǎn)只能是下面的三種情況(i+1,j)、(i,j+1)、(i+1,j+1)
當(dāng)然如果連續(xù)性中考慮跨越的情況,那么可能來自五個(gè)方向,此時(shí)從(m-2,n-1)到(m,n)會(huì)有信息損失
本文中我們只考慮三種方向的情況。
動(dòng)態(tài)規(guī)劃關(guān)系表達(dá)式
現(xiàn)在我們已經(jīng)知道了路徑的規(guī)范條件了,那么這個(gè)問題的動(dòng)態(tài)規(guī)劃關(guān)系表達(dá)式為:
我們拿g(i,j)=g(i-1,j)+d(i,j)來舉例,g(i-1,j)我們可以認(rèn)為是起點(diǎn)到g(i-1,j)的最短距離,然后d(i,j)表示Qi與Cj之間的距離。
為什么有d還有2d呢?
這個(gè)可以理解為人為設(shè)定的,我們這里設(shè)定當(dāng)路徑橫著走還有豎著走的時(shí)候,就是d,當(dāng)路徑斜著走的時(shí)候就是2d,也就是此時(shí)我們設(shè)定斜著走的時(shí)候損失大一些,d可以認(rèn)為是損失。
現(xiàn)在有兩個(gè)序列R和T,現(xiàn)在我們構(gòu)建了一個(gè)矩陣,我們要找到從左下角到右上角的最短路徑,每個(gè)格子中數(shù)字表示Ri和Tj的距離,右上角表示總距離。我們來看一下B2是如何計(jì)算的:
如果只能從三個(gè)方向來走的話,B2可以認(rèn)為來自B1、A1、A2,通過上面的動(dòng)態(tài)規(guī)劃關(guān)系式可以算出來
A1+2B2=4+24=12
B1+B2=7+4=11
A2+B2=5+4=9
所以從起點(diǎn)到B2的最短距離就是9,我們可以通過這種方式計(jì)算出格子的所有的點(diǎn),那么最終我們可以算出從起點(diǎn)到F4的最短距離就是26,這就是動(dòng)態(tài)規(guī)劃,而動(dòng)態(tài)規(guī)劃在時(shí)間序列的應(yīng)用就是DTW算法。
但是這里就有一個(gè)問題了?以上僅僅比較兩條路徑就要計(jì)算這么多,如果多條路徑C與Q進(jìn)行匹配,那么這個(gè)計(jì)算量就太大了,也就是說時(shí)間復(fù)雜度太高了,需要進(jìn)行算法的改進(jìn)。所以人們在使用DTW算法的時(shí)候就會(huì)使用一些技巧,以次來提高計(jì)算速度。
一些技巧
去根號計(jì)算
當(dāng)使用DTW算法的時(shí)候,需要計(jì)算Q與C之間不同i,j之間的距離,那么往往需要較大的計(jì)算量
我們可以看到我們的目的是為了尋找最小的計(jì)算量,而去掉根號不影響其大小的比較,而根號的計(jì)算需要耗費(fèi)較多時(shí)間,所以一個(gè)技巧就是去掉根號。
Lower Bounding
如果正常的計(jì)算Q和C之間的DTW距離,這樣計(jì)算量很大,我們可以為Q設(shè)置上下界(U和L),然后使用U和L和C進(jìn)行距離計(jì)算(C和U、L之間直接通過對應(yīng)時(shí)間步計(jì)算,不用對齊),這個(gè)距離屬于估算,如果估算出來的這個(gè)距離大于設(shè)置閾值,我們就認(rèn)為Q和C之間的差距太大了,二者不匹配。Lower Bounding存在兩個(gè)算法變種:LB-kim和LB-koegh
LB-kim:
直接找到Q和C的四個(gè)對應(yīng)的點(diǎn),起始點(diǎn),終點(diǎn),最高點(diǎn),最低點(diǎn),計(jì)算這四個(gè)點(diǎn)的距離和,如果超過閾值,那么我們就認(rèn)為這個(gè)Q和C不匹配。
LB-koegh:
直接找到Q和C的兩個(gè)對應(yīng)的點(diǎn),最高點(diǎn)和最低點(diǎn),如果超過閾值我們就認(rèn)為這個(gè)Q和C不匹配。
我們可以看出來這兩種方式計(jì)算的點(diǎn)比較少,所以計(jì)算量極少,速度會(huì)很快,但是會(huì)有問題,就是不精確,僅僅通過幾個(gè)點(diǎn)就確定了序列的匹配程度,這樣會(huì)有誤差的。
Early Abandoning of ED and LB_Keogh
這個(gè)是將ED和LB進(jìn)行結(jié)合,因?yàn)镋D計(jì)算(DTW)比較精確,但是計(jì)算量大,而LB比較粗略,但計(jì)算量小,我們將二者結(jié)合,如圖所示,我們將k=11之前使用DTW計(jì)算,K=11之后我們使用LB來計(jì)算,此時(shí)我們將二者加起來,如果這個(gè)超過閾值,我們就可以認(rèn)為Q和C不匹配
一些新的技巧總結(jié)
Early Abandoning Z-Normalization
我們在使用DTW算法的時(shí)候,往往需要對數(shù)據(jù)進(jìn)行歸一化操作,這樣可以提高效率
歸一化操作
那么如果先進(jìn)行歸一化再進(jìn)行動(dòng)態(tài)規(guī)劃,這樣的問題就是一旦Q和C不匹配,那么就對C白白歸一化了,那么我們可以這樣的,每標(biāo)準(zhǔn)化一點(diǎn)就對這點(diǎn)進(jìn)行ED計(jì)算,如果計(jì)算過程中總距離一旦超過閾值,就立即停止計(jì)算,以后的也不用進(jìn)行歸一化了,這樣后面的點(diǎn)就不用歸一化了,這樣計(jì)算量就減少了。
Reordering Early Abandoning
DTW計(jì)算的時(shí)候,一般從序列匹配的起點(diǎn)開始計(jì)算,我們發(fā)現(xiàn)當(dāng)計(jì)算到第9個(gè)時(shí)間步的時(shí)候,那么就發(fā)現(xiàn)它超過了閾值,我們就認(rèn)為二者是不匹配的,就停止計(jì)算了
現(xiàn)在我們計(jì)算的時(shí)候不從起點(diǎn)開始計(jì)算,比如我們可以從中間的某個(gè)特殊的時(shí)間步(一般是Q中距離均值0比較遠(yuǎn)的序列段,用這段來和C進(jìn)行距離計(jì)算,這個(gè)序列段再標(biāo)準(zhǔn)化的過程中就可以找到)計(jì)算。論文中的reorder early abounding 這部分的做法是對Q序列進(jìn)行norm處理,然后對所有時(shí)間點(diǎn)元素值取絕對值,最后進(jìn)行降序排列,以此來找到異常點(diǎn)?
這樣,我們只計(jì)算(直接按照時(shí)間步計(jì)算距離,估算)了五個(gè)時(shí)間步就發(fā)現(xiàn),Q和C距離超過閾值,二者是不匹配的,這樣就直接停止計(jì)算。
以Q為基礎(chǔ)的LB和以C為基礎(chǔ)的LB
我們使用LB的方法都是對Q來使用的,然也可以對C來使用,這樣的好處是對Q使用可以過濾掉一部分不匹配的序列,對C使用又可以過濾掉一批不匹配的序列
多種LB方式綜合使用
我們可以看到橫軸表示時(shí)間復(fù)雜度,縱軸表示可靠性,我們可以認(rèn)為越靠近左上角的算法是越好的。
總結(jié)
我們需要找到與Q距離最短的C,當(dāng)序列很長和C數(shù)量很多的時(shí)候,一個(gè)很重要的問題就是過濾,也就是及時(shí)停止距離計(jì)算,上面的技巧就是在做這個(gè)工作,通過各種方式,只要發(fā)現(xiàn)Q和C的距離計(jì)算超過閾值就拋棄C,因?yàn)橛?jì)算Q和C之間的DTW真的很費(fèi)時(shí)間。
參考論文:Searching and Mining Trillions of Time Series Subsequences under Dynamic Time Warping
總結(jié)
以上是生活随笔為你收集整理的基于动态规划DTW算法加速衡量两个不同的时间序列的相似性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [css] 说说你对line-heig
- 下一篇: docker安装awvs13