Suppose that we need to compare 2 time series (quite look-alike),
- They're quite look-alike but if we compare point-to-point, they're clearly very different!
- With DTW, we compare:
- hollows of series 1 with ones of series 2.
- cambers of series 1 with ones of series 2.
- Dynamic Time Warping is used to compare the similarity or calculate the distance between two arrays or time series with different length.
- An example: Voice of a man. He can speak fast. He can speak slowly. However, the both voices are his. If we don't use DTW but Euclidian distance, the distance is very large → there are 2 voices → wrong prediction!
- Sound Pattern Recognition: detect the same kind of sound pattern (like the above example).
- Stock Market:
- Divide 2 time series into equal points.
- Calculate distance between 1st point in TS1 with all points in TS2 and then store the min.
- Move to 2nd point.
- Repeat step 2 & 3 but with 2nd point as a reference point.
- Add up all stored distances. This is a true measure between 2 time series.
👉 Check this video fore a more explanation.
1pip install dtaidistance
1from dtaidistance import dtw 2s1 = [0, 0, 1, 2, 1, 0, 1, 0, 0] 3s2 = [0, 1, 2, 0, 0, 0, 0, 0, 0] 4distance = dtw.distance(s1, s2) 5 6# plot 7from dtaidistance import dtw_visualisation as dtwvis 8import numpy as np 9path = dtw.warping_path(s1, s2) 10dtwvis.plot_warping(s1, s2, path, filename="warp.png")
👉 Another option: dtw-python
👉 fastdtw (an approximate Dynamic Time Warping (DTW) algorithm that provides optimal or near-optimal alignments with an O(N) time and memory complexity)
1pip install fastdtw
1import numpy as np 2from scipy.spatial.distance import euclidean 3 4from fastdtw import fastdtw 5 6x = np.array([[1,1], [2,2], [3,3], [4,4], [5,5]]) 7y = np.array([[2,2], [3,3], [4,4]]) 8distance, path = fastdtw(x, y, dist=euclidean) 9print(distance)