Dynamic Time Warping

El DTW (Dynamic Time Warping) es uno de los métodos utilizados para medir la similitud entre los datos de las series temporales. Cuando se comparan dos formas de onda, no está claro qué punto corresponde a qué punto si las longitudes de las formas de onda son diferentes; DTW encuentra la distancia entre cada punto de dos series temporales por fuerza bruta y encuentra la combinación más pequeña entre todos los patrones. De este modo, es posible encontrar formas de onda que tengan una forma similar, aunque las ondas estén ligeramente alejadas. Esta página utiliza "fastdtw" para encontrar la similitud entre los datos de las series temporales.

import numpy as np
import matplotlib.pyplot as plt
from fastdtw import fastdtw

Traza las dos formas de onda utilizadas en el experimento

data1 = [91.0 * np.sin(i / 2.1) for i in range(30)]
data2 = [100.0 * np.sin(i / 2.0) + np.random.rand() for i in range(30)]
data3 = [50.0 * np.cos(i / 2.0) + np.random.rand() for i in range(30)]

plt.figure(figsize=(12, 4))

# Trazado de formas de onda
plt.plot(data1, label="data1", color="k")
plt.plot(data2, label="data2", color="r")
plt.plot(data3, label="data3", color="b")
plt.legend()
plt.show()

png

Calcular el DTW y trazar la correspondencia

Podemos determinar que el DTW entre las formas de onda negra y roja muestra un DTW menor y es más similar (en la medida del DTW) que la forma de onda azul.

# Calcular el DTW
distance_12, path_12 = fastdtw(data1, data2)
distance_13, path_13 = fastdtw(data1, data3)

# Conecta los puntos correspondientes con una línea
plt.figure(figsize=(12, 4))
for x_12, x_13 in zip(path_12, path_13):
    plt.plot(x_12, [data1[x_12[0]], data2[x_12[1]]], color="r", linestyle="dotted")
    plt.plot(x_13, [data1[x_13[0]], data3[x_13[1]]], color="b", linestyle="dotted")

# Trazado de formas de onda
plt.plot(data1, label="data1", color="k")
plt.plot(data2, label="data2", color="r")
plt.plot(data3, label="data2", color="b")
plt.legend()
plt.title(
    f"DTW(data1, data2) {np.round(distance_12, 3)} < {np.round(distance_13, 3)} DTW(data1, data3)",
    fontsize=14,
)
plt.show()

png

Comentarios

(Los comentarios aparecerán después de la aprobación)