iT邦幫忙

2021 iThome 鐵人賽

DAY 1
0
AI & Data

Python 機器學習實驗室 ʘ ͜ʖ ʘ系列 第 1

Dynamic Time Warping (DTW)

DTW 是什麼

當要計算時間序列資料的相似程度時,我們可以使用不同的距離計算方式。DTW就是其中一種距離方式計算,他的優勢在於:

  1. 可以比較長度不同的資料:在實際生活裡,通常我們想比較的資料長度都是不固定的
  2. delay也不怕:比如可以計算出A序列的第一個資料點(ta1)對應到B序列的第五個資料點(tb5),強大的應用包括語音辨識(比較同一個人的說“hello”的方式,第一種正常說,第二種像樹懶一樣說出“Heeeeeelllooooo”,DTW還是能偵測出你們是同一個人)

python:

我們先創造出三個相同長度的資料ts1, ts2, ts3,從圖裡我們可以很明顯地看出ts1和ts2比較相似,第一種方法先透過最簡單的euclidean distance計算相似度,跑出的結果卻是ts1與ts3比較相近,因為euclidean distance僅考慮同個時間點下的兩的序列直線距離,無法捕捉到趨勢上的相似程度。

https://ithelp.ithome.com.tw/upload/images/20210915/20142004JPiAzJ6ExE.png

def euclid_dist(t1,t2):
    return sqrt(sum((t1-t2)**2))

print('ts1 vs. ts2:',euclid_dist(ts1,ts2))
print('ts1 vs. ts3:',euclid_dist(ts1,ts3))

https://ithelp.ithome.com.tw/upload/images/20210915/20142004g0u6GeAxum.png

接下來,我們來用用dtw,這個為了簡潔方便我們就使用fastdtw package來計算:

from fastdtw import fastdtw
from scipy.spatial.distance import euclidean

distance, path = fastdtw(ts1, ts2)
print('ts1 vs. ts2:',distance)

distance2, path2 = fastdtw(ts1, ts3)
print('ts1 vs. ts3:',distance2)

https://ithelp.ithome.com.tw/upload/images/20210915/20142004YfalhVdF6U.png

我們可以發現dtw的計算結果正確地告訴我們ts1與ts3較為相近!以上只是dtw的簡單小介紹,如果對背後的數學邏輯有興趣也歡迎一起討論~

dtw原理影片:
https://www.youtube.com/watch?v=9GdbMc4CEhE&t=551s

reference:
https://towardsdatascience.com/dynamic-time-warping-3933f25fcdd
https://pypi.org/project/fastdtw/
https://nbviewer.jupyter.org/github/alexminnaar/time-series-classification-and-clustering/blob/master/Time%20Series%20Classification%20and%20Clustering.ipynb


下一篇
樹選手1號:decision tree
系列文
Python 機器學習實驗室 ʘ ͜ʖ ʘ30

尚未有邦友留言

立即登入留言