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)