DTW算法详解
DTW算法詳解
1.DTW
1.1 時序相似度
在時間序列數(shù)據(jù)中,一個常見的任務(wù)是比較兩個序列的相似度,作為分類或聚類任務(wù)的基礎(chǔ)。那么,時間序列的相似度應(yīng)該如何計算呢?
“ 經(jīng)典的時間序列相似性度量方法總體被分為兩 類: 鎖步度量(lock-step measures) 和彈性度量(elastic measures) . 鎖步度量是時間序列進行 “一對一”的比 較; 彈性度量允許時間序列進行 “一對多”的比較.
——《時間序列數(shù)據(jù)挖掘的相似性度量綜述》
”
最簡單的相似度計算方法可能是計算兩個時間序列的歐氏距離。歐氏距離屬于鎖步度量
假設(shè)有兩個時間序列,Q和C,如果直接用歐氏距離計算相似度的話,如果存在時間步不對齊,序列長短不一等問題…
如上圖1所示,如果序列長短不一,或時間步不對齊的時候,歐氏距離是無法有效計算兩個時間序列的距離,特別是在峰值的時候。
圖2則是DTW算法,首先將其中一個序列進行線性放縮進行某種“扭曲”操作,以達到更好的對齊效果,可以存在一對多mapping的情況,適用于復(fù)雜時間序列,屬于彈性度量
1.2 DTW算法
動態(tài)時間規(guī)整在60年代由日本學者Itakura提出,用于衡量兩個長度不同的時間序列的相似度。把未知量伸長或縮短(壓擴),直到與參考模板的長度一致,在這一過程中,未知序列會產(chǎn)生扭曲或彎折,以便其特征量與標準模式對應(yīng)
首先假設(shè)有兩條序列 QQQ 和 CCC,他們的長度分別是 nnn 和 mmm
Q=q1,q2,...,qnQ=q_1,q_2,...,q_nQ=q1?,q2?,...,qn?
C=q1,q2,...,qnC=q_1,q_2,...,q_nC=q1?,q2?,...,qn?
用一個 m×nm\times nm×n 矩陣來對比兩個序列,warping路徑會穿越這個矩陣,warping路徑的第 kkk 個元素表示為wk=(i,j)kw_k=(i,j)_kwk?=(i,j)k? ,橫縱代表的是兩個序列對齊的點
約束條件
1)邊界條件:w1=(1,1)w_1=(1,1)w1?=(1,1) 和wk=(m,n)w_k=(m,n)wk?=(m,n),表示兩條序列首尾必須匹配,各部分的先后次序匹配。
2)連續(xù)性: 如果wk=(a,b)w_k=(a,b)wk?=(a,b)且wk?1=(a′,b′)w_k-1=(a',b')wk??1=(a′,b′),則必須滿足 a?a′≤1a-a' \leq 1a?a′≤1
且 b?b′≤1b-b' \leq 1b?b′≤1。這條約束表示在匹配過程中多對一和一對多的情況只能匹配周圍一個時間步的的情況,也就是不可能跨過某個點去匹配,只能和自己相鄰的點對齊。這樣可以保證QQQ和CCC中的每個坐標都在wraping路徑中出現(xiàn)。
3)單調(diào)性: 如果 wk?1=(a′,b′)w_k-1=(a',b')wk??1=(a′,b′),且wk=(a,b)w_k=(a,b)wk?=(a,b),則必須滿足a?a′≥0a-a' \geq 0a?a′≥0
且b?b′≥0b-b' \geq 0b?b′≥0,表示warping路徑一定是隨時間單調(diào)遞增的。
滿足以上約束條件的warping路徑有很多,所以問題的本質(zhì)是最優(yōu)化問題——找出最優(yōu)warping路徑。
解法思路是通過動態(tài)規(guī)劃算法,數(shù)學語言描述為:
【舉例】
DTW最初用于識別語音的相似性。我們用數(shù)字表示音調(diào)高低,例如某個單詞發(fā)音的音調(diào)為1-3-2-4。現(xiàn)在有兩個人說這個單詞,一個人在前半部分拖長,其發(fā)音為1-1-3-3-2-4;另一個人在后半部分拖長,其發(fā)音為1-3-2-2-4-4。
現(xiàn)在要計算1-1-3-3-2-4和1-3-2-2-4-4兩個序列的距離(距離越小,相似度越高)。因為兩個序列代表同一個單詞,我們希望算出的距離越小越好,這樣把兩個序列識別為同一單詞的概率就越大。
先用傳統(tǒng)方法計算兩個序列的歐幾里得距離,即計算兩個序列各個對應(yīng)的點之間的距離之和。
距離之和
= |A(1)-B(1)| + |A(2)-B(2)| + |A(3)-B(3)| + |A(4)-B(4)| + |A(5)-B(5)| + |A(6)-B(6)|
= |1-1| + |1-3| + |3-2| + |3-2| + |2-4| + |4-4|
= 6
如果我們允許序列的點與另一序列的多個連續(xù)的點相對應(yīng)(相當于把這個點所代表的音調(diào)的發(fā)音時間延長),然后再計算對應(yīng)點之間的距離之和。如下圖:B(1)與A(1)、A(2)相對應(yīng),B(2)與A(3)、A(4)相對應(yīng),A(5)與B(3)、B(4)相對應(yīng),A(6)與B(5)、B(6)相對應(yīng)。
這樣的話,
距離之和
= |A(1)-B(1)| + |A(2)-B(1)| + |A(3)-B(2)| + |A(4)-B(2)| + |A(5)-B(3)| + |A(5)-B(4)| + |A(6)-B(5)| + |A(6)-B(6)|
= |1-1| + |1-1| + |3-3| + |3-3| + |2-2| + |2-2| + |4-4| + |4-4|
= 0
我們把這種“可以把序列某個時刻的點跟另一時刻多個連續(xù)時刻的點相對應(yīng)”的做法稱為時間規(guī)整(Time Warping)。
現(xiàn)在我們用一個6*6矩陣M表示序列A(1-1-3-3-2-4)和序列B(1-3-2-2-4-4)各個點之間的距離,M(i,j)M(i, j)M(i,j) 等于A的第i個點和B的第j個點之間的距離,即
我們看到傳統(tǒng)歐幾里得距離里對應(yīng)的點:
- A(1)-B(1)
- A(2)-B(2)
- A(3)-B(3)
- A(4)-B(4)
- A(5)-B(5)
- A(6)-B(6)
它們正好構(gòu)成了對角線,對角線上元素和為6。
時間規(guī)整的方法里,對應(yīng)的點為:
- A(1)A(2)-B(1)
- A(3)A(4)-B(2)
- A(5)-B(3)B(4)
- A(6)-B(5)B(6)
這些點構(gòu)成了從左上角到右下角的另一條路徑,路徑上的元素和為0。
因此,DTW算法的步驟為:
我們稱路徑上的元素和為路徑長度。那么如何尋找長度最小的路徑呢?
矩陣從左上角到右下角的路徑長度有以下性質(zhì):
a) 左邊的相鄰元素 (i, j-1)
b) 上面的相鄰元素 (i-1, j)
c) 左上方的相鄰元素 (i-1, j-1)
假設(shè)矩陣為M,從矩陣左上角(1,1)到任一點(i, j)的最短路徑長度為Lmin(i, j)。那么可以用遞歸算法求最短路徑長度:
起始條件:
遞推規(guī)則:
遞推規(guī)則這樣寫的原因是因為當前元素的最短路徑必然是從前一個元素的最短路徑的長度加上當前元素的值。前一個元素有三個可能,我們?nèi)∪齻€可能之中路徑最短的那個即可。
參考文獻
https://www.bilibili.com/video/BV12r4y1A7mT?share_source=copy_web
https://zhuanlan.zhihu.com/p/43247215
https://it.wikipedia.org/wiki/Dynamic_time_warping
fastdtw 包計算
https://pypi.org/project/fastdtw/
from fastdtw import fastdtw from scipy.spatial.distance import euclideanx = np.array([1, 2, 3, 3, 7]) y = np.array([1, 2, 2, 2, 2, 2, 2, 4])distance, path = fastdtw(x, y, dist=euclidean)print(distance) print(path)# 5.0 # [(0, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 5), (3, 6), (4, 7)]總結(jié)
- 上一篇: [html] 写一个布局,当页面滚动一
- 下一篇: 前端学习(3061):vue+eleme