Implementación de Python de dtw para la coincidencia de series temporales (2)

Introducción

En el artículo anterior, presentamos el uso de la biblioteca dtw, pero tiene demasiadas restricciones, no es lo suficientemente flexible y no es conveniente para dibujar, por lo que presentamos una biblioteca más compleja: dtw-python. Es la versión python de dtw en el lenguaje R, y la API básica es correspondiente.Su ventaja es que puede personalizar el modo de coincidencia de puntos, restricciones y ventanas deslizantes. Al mismo tiempo, proporciona un dibujo conveniente y un cálculo rápido (el núcleo del lenguaje C), haga clic aquí para obtener el documento oficial .

ejemplo

Esta vez, las dos series temporales aún eligen la secuencia del artículo anterior:

import numpy as np
from dtw import *
x=[2., 0., 1., 1., 2., 4., 2., 1., 2., 0.]
y=[1., 1., 2., 4., 2., 1., 2., 0.]

Cabe señalar que esta biblioteca usa números de coma flotante de forma predeterminada, por lo que aquí usamos el tipo flotante para inicializar.Si se usa un número entero int, provocará un error de cálculo, como se muestra en la figura a continuación: encontrará que el porcentaje del eje y de 1e18 aparece en la esquina superior izquierda, y la línea negra se convierte en una línea plana larga
inserte la descripción de la imagen aquí
.
Me tomó mucho tiempo darme cuenta de que era un problema con int y float.
A continuación, explicaremos el cálculo y el dibujo en detalle:

ds = dtw(y, x,keep_internals=True, step_pattern=asymmetric)
ds.plot(type="twoway",offset=-2)

La primera línea de código se calcula para generar un objeto dtw, y el contenido se puede obtener a través de cada atributo del objeto. Por ejemplo, ds.distance muestra la distancia más corta calculada, ds.reference muestra el valor de la secuencia de plantilla, ds.query muestra el valor de la secuencia de consulta y ds.index1 y ds.index2 respectivamente muestran la secuencia correspondiente de cada secuencia, por lo que no entraré en detalles aquí. Solo necesitamos saber aquí que nuestra y es una secuencia de consulta (query), x es una secuencia de plantilla (plantilla) y hacemos coincidir y con x.
Expliquemos de nuevo los parámetros entre paréntesis. No hace falta decir que x e y, en aras de la exhaustividad, añadiremos otros parámetros:

dtw.dtw(x, y=None, dist_method='euclidean', step_pattern='symmetric2', window_type=None, window_args={}, keep_internals=False, distance_only=False, open_end=False, open_begin=False)

dist_method define el método de distancia que usa, el valor predeterminado es 'euclidean', que es la distancia euclidiana.
keep_internals=True guarda información interna, incluida la matriz de distancia y similares, generalmente lo establecemos en True.
step_pattern define el patrón de coincidencia entre puntos, hay varios tipos, consulte el sitio web oficial para obtener más detalles.
window_type indica restricciones de condiciones globales, y hay varios modos, consulte también el sitio web oficial.
Si distance_only se establece en True, el cálculo se acelerará, solo se calculará la distancia y se ignorará la función de coincidencia.
Open_end y open_begin se establecen en True para indicar una coincidencia sin restricciones, es decir, una coincidencia parcial completa, y el valor predeterminado es una coincidencia global, que se corresponde estrictamente con la cabeza y la cola.
La segunda línea de código es el código de dibujo, donde el tipo indica el modo del gráfico. Generalmente, hay dos modos : de dos vías y de tres vías . Los detalles se explican a continuación. offset=-2 se puede entender como el grado de separación entre las dos líneas. Para facilitar la visualización, se puede configurar más grande.
La imagen generada por el código anterior es la siguiente:
inserte la descripción de la imagen aquí
En esta imagen, podemos ver que la cabeza y la cola coinciden estrictamente. La línea negra en la figura representa la secuencia de consulta, la línea azul representa la secuencia de la plantilla y la línea punteada representa la coincidencia de puntos. Podemos encontrar que en el modo 'asimétrico' (step_pattern), aunque la cabeza y la cola coinciden, algunos puntos en el medio se ignoran. ¿Qué tipo de formulario coincidente es? Podemos imprimirlo y echar un vistazo:

print(asymmetric)
asymmetric.plot()

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Para ser honesto, yo tampoco lo entiendo muy bien, pero no importa si no lo entiendo, podemos compararlo, ¿no?

ds = dtw(y, x,keep_internals=True, step_pattern=symmetric1)
ds.plot(type="twoway",offset=-2)

Reemplace step_pattern con symmetric1 y dibuje la imagen de la siguiente manera:
inserte la descripción de la imagen aquí
podemos encontrar que los puntos en la imagen tienen una correspondencia uno a uno esta vez, y observe el diagrama de patrón de symmetric1:

print(symmetric1)
symmetric1.plot()

inserte la descripción de la imagen aquí
Obviamente, este modo es más flexible que el anterior modo asimétrico asimétrico (hay tres direcciones de arriba, abajo, izquierda y abajo), razón por la cual los puntos pueden ser uno a uno.
Al mismo tiempo, veamos otra imagen:

ds.plot(type="threeway",offset=-2)

inserte la descripción de la imagen aquí
El gráfico dibujado en el modo de tres vías es muy similar al gráfico de nuestro artículo anterior, se puede ver que el eje vertical coincide uno a uno desde el segundo punto.
Dado que asimétrico no se puede hacer coincidir globalmente, ¿se puede hacer coincidir parcialmente? De hecho, es posible, utilizando los parámetros open_end y open_begin que explicamos anteriormente:

ds = dtw(y, x,keep_internals=True, step_pattern=asymmetric,open_begin=True,open_end=False)
ds.plot(type="twoway",offset=-2)

Debido a que la secuencia x es en realidad la secuencia de la secuencia y excepto el comienzo, establecemos open_begin en True, lo que significa que dejamos de lado la restricción del comienzo y podemos hacer que el comienzo coincida arbitrariamente. En este caso, podemos encontrar que ha completado una coincidencia parcial
inserte la descripción de la imagen aquí
.

Resumir

Este artículo presenta principalmente la función de dibujo de la biblioteca dtw-python. La definición de la ventana y la definición de la función de distancia aún no se han cubierto. Espero que los lectores puedan explorarla y complementarla por sí mismos. Excepto por el error principal del error de cálculo de tipo int, la biblioteca está relativamente completa. Hasta ahora, la exploración de dtw ha llegado a su fin temporalmente y los lectores pueden dejar un mensaje para el debate.

1.https://dynamictimewarping.github.io/py-api/html/api/dtw.dtw.html#dtw.dtw
2.https://dynamictimewarping.github.io/py-api/html/api/dtw.StepPattern.html#dtw.StepPattern
3.https://dynamictimewarping.github.io/
4.https://www.jstatsoft.org/article/view/v031i07

Supongo que te gusta

Origin blog.csdn.net/weixin_43945848/article/details/120826885
Recomendado
Clasificación