Python-Implementierung von dtw für den Zeitreihenabgleich (1)

Einführung

Dynamic Time Warping (kurz DTW) ist ein klassischer Algorithmus zur Zeitreihenanalyse, der dazu dient, den Abstand zwischen zwei Zeitreihen zu vergleichen und den kürzesten Weg zu finden. Als ich auf Github nach dtw suchte, fand ich zwei weitere klassische Bibliotheken: dtw und dtw-python. Die dtw-Bibliothek verfügt über wenige Funktionen, ist aber einfach und leicht zu verstehen. dtw-python ist voll funktionsfähig und bietet klare Zeichnungen. Hier stellen wir zunächst die dtw-Bibliothek vor, und die dtw-python-Bibliothek wird im nächsten Artikel vorgestellt.

Beispiel

Wenn Sie die Grundprinzipien des dtw-Algorithmus nicht verstehen, können Sie hier klicken . Die Einleitung ist recht klar, und dann werden wir mit dem Thema beginnen.

import numpy as np
#来自官方库的示例,代码未动,但注解原创。
#y是x的子序列,从x的第三个数字开始一一匹配
x = np.array([2, 0, 1, 1, 2, 4, 2, 1, 2, 0]).reshape(-1, 1)
y = np.array([1, 1, 2, 4, 2, 1, 2, 0]).reshape(-1, 1)

from dtw import dtw
#曼哈顿距离定义,各点相减的绝对值
manhattan_distance = lambda x, y: np.abs(x - y)
#计算出总距离,耗费矩阵,累计耗费矩阵,在矩阵上的路径
d, cost_matrix, acc_cost_matrix, path = dtw(x, y, dist=manhattan_distance)

print(d)
#计算得出2.0

import matplotlib.pyplot as plt

plt.imshow(acc_cost_matrix.T, origin='lower', cmap='gray', interpolation='nearest')
#lower参数表示上下颠倒,注意这里矩阵行列转置
plt.plot(path[0], path[1], 'w')
#path包含两个array
plt.show()

Fügen Sie hier eine Bildbeschreibung ein
Kannst du nicht lesen? Es spielt keine Rolle, lassen Sie es uns im Detail analysieren:
Fügen Sie hier eine Bildbeschreibung ein
Wie ich bereits sagte, ist y eine Teilmenge von x. Die orangefarbene Linie in der Abbildung stellt y dar und die blaue Linie stellt x dar. Aus der Perspektive unseres bloßen Auges müssen wir y nur in die Vergangenheit übersetzen, aber für den Computer müssen wir die Distanzmatrix jedes Punktes berechnen. Wir drucken die Kostenmatrix aus: Wenn Sie nicht klar sehen können, wird empfohlen, hineinzuzoomen. Oben ist x und links ist y. Der kürzeste Abstand ist 1+ 1+0+0+0+0+0+0+0+0 = 2, also d
Fügen Sie hier eine Bildbeschreibung ein
. Tatsächlich besteht unser Optimierungsziel darin, den aktuellen Abstand + den Wert im oberen rechten oder unteren rechten oder rechten vorderen Raster zu minimieren.
Dies ist die Berechnung von cost_matrix und d, und acc_cost_matrix besteht darin, sie wie folgt zu addieren:
Fügen Sie hier eine Bildbeschreibung ein
Sie können sehen, dass der kumulative Abstand über dem Schrägstrich immer 2 beträgt.
Welcher Wert ist im Pfad gespeichert? Warum sind die obige Linie und die von mir gezeichnete Linie vertauscht? Wir drucken den Pfad aus.
Fügen Sie hier eine Bildbeschreibung ein
Das erste Array speichert die Abszisse und das zweite Array speichert die Ordinate, d. h. der Pfad ist: (0,0)–>(1,0)–>(2,0)–>(3,1)–>(4,2)–>(5,3)–>(6,4)–>(7,5)–>(8,6)–>(9,7). Tatsächlich ist die vertikale Achse hier umgekehrt, daher müssen wir den Parameter origin='lower' in der Plotfunktion übergeben, um sie auf den Kopf zu stellen und die vorherige Figur zu bilden. Die richtige Figur, die nicht auf dem Kopf steht, sieht wie folgt aus (beachten Sie, dass die vertikale Achse und die vorherige umgekehrt sind).
Fügen Sie hier eine Bildbeschreibung ein
Natürlich ist ein solches Diagramm immer noch nicht intuitiv genug, um die Transformation der Originalsequenz direkt anzuzeigen, daher werde ich im nächsten Artikel das Paket dtw-python vorstellen.

1.https://github.com/pierre-rouanet/dtw
2.https://zhuanlan.zhihu.com/p/43247215

おすすめ

転載: blog.csdn.net/weixin_43945848/article/details/120777669
おすすめ