拓端tecdat|R語言DTW(Dynamic Time Warping) 動態時間規整演算法分析序列資料和視覺化
原文連結:http://tecdat.cn/?p=22945
原文出處:拓端資料部落公眾號
動態時間規整(DTW,Dynamic time warping,動態時間歸整/規整/彎曲)是一種衡量兩個序列之間最佳排列的演算法。線性序列資料如時間序列、音訊、視訊都可以用這種方法進行分析。DTW通過區域性拉伸和壓縮,找出兩個數字序列資料的最佳匹配,同時也可以計算這些序列之間的距離。
DTW是幹什麼的?
動態時間規整演算法,故名思議,就是把兩個代表同一個型別的事物的不同長度序列進行時間上的“對齊”。比如DTW最常用的地方,語音識別中,同一個字母,由不同人發音,長短肯定不一樣,把聲音記錄下來以後,它的訊號肯定是很相似的,只是在時間上不太對整齊而已。所以我們需要用一個函式拉長或者縮短其中一個訊號,使得它們之間的誤差達到最小。
DTW怎麼計算?
因此,動態時間規整要解決的問題就是:找到一條最優的規整路徑W = {\varpi _1},{\varpi _2}...{\varpi _k}W=ϖ1,ϖ2...ϖk,其中{w_k} = (i,j)wk=(i,j),即認為時間序列1的第i個點和時間序列2的第j個點是類似的。全部類似點的距離之和做為規整路徑距離,用規整路徑距離來衡量兩個時間序列的類似性。規整路徑距離越小,類似度越高。
下面我們來總結一下DTW動態時間規整演算法的簡單的步驟:
1. 首先肯定是已知兩個或者多個序列,但是都是兩個兩個的比較,所以我們假設有兩個序列A={a1,a2,a3,...,am} B={b1,b2,b3,....,bn},維度m>n
2. 然後用歐式距離計算出每序列的每兩點之間的距離,D(ai,bj) 其中1≤i≤m,1≤j≤n
畫出下表:
3. 接下來就是根據上圖將最短路徑找出來。從D(a1,a2)沿著某條路徑到達D(am,bn)。找路徑滿足:假如當前節點是D(ai,bj),那麼下一個節點必須是在D(i+1,j),D(i,j+1),D(i+1,j+1)之間選擇,並且路徑必須是最短的。計算的時候是按照動態規劃的思想計算,也就是說在計算到達第(i,j)個節點的最短路徑時候,考慮的是左上角也即第(i-1,j)、(i-1,j-1)、(i,j-1)這三個點到(i,j)的最短距離。
4. 接下來從最終的最短距離往回找到那條最佳的輸出路徑, 從D(a1,b1)到D(am,bn)。他們的總和就是就是所需要的DTW距離
【注】如果不回溯路徑,直接在第3步的時候將左上角三個節點到下一個節點最短的點作為最優路徑節點,就是貪婪演算法了。DTW是先計算起點到終點的最小值,然後從這個最小值回溯回去看看這個最小值都經過了哪些節點。
R語言實現
在這篇文章中,我們將學習如何找到兩個數字序列資料的排列。
建立序列資料
首先,我們生成序列資料,並在一個圖中將其視覺化。
- plot(a, type = "l")
- lines(b, col = "blue")
計算規整方式
dtw()函式計算出一個最佳規整方式。
align(a, b)
返回以下專案。你可以參考str()函式來了解更多資訊。
現在,我們可以繪製組合。
用雙向的方法作圖
動態時間規整結果的繪圖:點比較
顯示查詢和參考時間序列以及它們的排列方式,進行視覺化檢查。
Plot(align)
用密度作圖
顯示疊加了規整路徑的累積成本密度。
該圖是基於累積成本矩陣的。它將最優路徑顯示為全域性成本密度圖中的 "山脊"。
PlotDensity(align)
小結
總而言之, DTW是一種非常有用的計算序列最小距離的方法, 不論是在語音序列匹配, 股市交易曲線匹配, 還是DNA鹼基序列匹配等等場景, 都有其大展身手的地方. 它的最大特點是在匹配時允許時間上的伸縮, 因此可以更好的在一堆序列集合中找到最佳匹配的序列.
- Eamonn Keogh, Chotirat Ann Ratanamahatana,Exact indexing of dynamic time warping,Knowledge and Information Systems, 2005.
最受歡迎的見解
1.在python中使用lstm和pytorch進行時間序列預測
2.python中利用長短期記憶模型lstm進行時間序列預測分析