[PYTHON] Erkennung von EKG-Datenanomalien durch Matrix Profile

Zeitreihen-Data-Mining scheint eine Revolution von Matrix Profile zu sein. Es scheint jedoch, dass es noch wenige japanische Dokumente gibt, daher hoffe ich, sie hinzuzufügen. Dieser Artikel bietet einen Überblick über MatrixProfile und eine Beispielimplementierung in Python.

Was ist ein Matrixprofil?

Es ist eine ähnliche Kombination von Teilzeitreihen.

Betrachten Sie ein Paar Zeitreihendaten (A, B) (es kann ein Paar derselben Zeitreihe sein). Jede Zeitreihe wird in Teilzeitreihen der Länge m zerlegt. Für alle Teilzeitreihen in A werden der Index der Teilzeitreihen in B, die ihm am nächsten liegen, und sein Abstand (Ähnlichkeit) als MatrixProfile bezeichnet. Wenn A und B dieselbe Zeitreihe sind, ist das Paar mit der Teilzeitreihe optimal, sodass der Bereich um die Teilzeitreihe ignoriert wird.

無題.jpg Beispiel für seismische Daten und Matrixprofil [Yeh et al., ICDM2016]

Die korrekte Berechnung nimmt viel Zeit in Anspruch, aber es ist möglich, sie in einer realistischen Zeit zu lösen, indem ein Algorithmus unter Verwendung von FFT oder dergleichen entwickelt wird. Es ist eine Revolution, nicht wahr?

Weitere Informationen finden Sie unter https://www.cs.ucr.edu/~eamonn/MatrixProfile.html Es wird gesagt, dass es sich um eine Technologie aus dem Labor von Dr. Keogh von UCR handelt, der für SAX und Shapelet berühmt ist. Es scheint, dass die Titel der Artikel in Form von Matrix Profile 〇〇: serialisiert sind und ab November 2019 in Matrix Profile XIX: veröffentlicht wurden.

Bibliothek für MatrixProfile "matrixprofile-ts"

Es gibt bereits eine supereinfache Python-Bibliothek nur für MatrixProfile namens matrixprofile-ts.

pip install matrixprofile-ts

Es ist auch unter [hier] verfügbar (https://github.com/target/matrixprofile-ts). Es scheint, dass es auch R- und C ++ gibt. Dieses Mal werden wir versuchen, Anomalien in EKG-Daten mithilfe dieser Matrixprofile zu erkennen.

Problemstellung

Dieses Mal besteht das Problem darin, unter Verwendung einer Reihe von EKG-Daten, einschließlich abnormaler Wellenformteile, den Grad der Abnormalität an jedem Punkt ohne Lehrer zu berechnen und den abnormalen Teil zu identifizieren. Im Folgenden werden wir mit der Implementierung fortfahren.

EKG-Daten lesen

Dieses Mal werden wir EKG-Daten mit dem Namen qtdbsel102 verwenden. https://www.cs.ucr.edu/~eamonn/discords/qtdbsel102.txt Dies sind auch die Daten, die in Professor Keoghs Artikel verwendet wurden. Da die Datenlänge sehr lang ist, werden die ersten 5000 Punkte verwendet. MatrixProfile wird übrigens im Berechnungsprozess normalisiert, sodass keine Vorverarbeitung erforderlich ist.

from matrixprofile import *
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#Daten lesen
ECG = pd.read_csv('qtdbsel102.txt', header=None, delimiter='\t')    
X = ECG.values[:5000,2]

#EKG-Visualisierung
plt.style.use('seaborn')
plt.figure(figsize=(16, 8))
plt.xlim(0, 5000)
plt.plot(X)
plt.axvspan(4200, 4400, facecolor='r', alpha=0.1)

ecg_data.png Abnormale Wellenformen treten bei 4200 bis 4400 Punkten auf. Es ist auf einen Blick offensichtlich.

Matrixprofilberechnung

Dank der hervorragenden Bibliothek ist es einfach zu implementieren. Der Hyperparameter ist nur die Länge der Teilzeitreihen. Diesmal auf 200 einstellen. Für die Berechnungsmethode werde ich ** SCRIMP ++ ** verwenden, die schnellste und neueste Methode, obwohl die Genauigkeit etwas geringer ist.

#Berechnung von matrixProfile
window_size = 200
MP = matrixProfile.scrimp_plus_plus(X,window_size)

Erkennung von Anomalien

In Daten mit Periodizität wie EKG sollte eine normale Teilzeitreihe eine Wellenform haben, die sich in anderen Teilen sehr ähnlich ist. Wenn umgekehrt keine sich selbst ähnliche Wellenform vorhanden ist, dh der Teil, in dem der Abstandswert des Matrixprofils groß wird, wird als abnormal angesehen. Dies ist die sogenannte Nachbarschaftsmethode.

Übrigens werden die Abstandsspalte und die Referenzindexspalte in dem zuvor berechneten MP gespeichert. Lassen Sie uns die Abstandsspalte überprüfen und visualisieren.

#Visualisierung des Matrixprofils
plt.figure(figsize=(16, 8))

plt.subplot(2,1,1)
plt.xlim(0, 5000)
plt.title('ECG')
plt.plot(X)
x = np.arange(4200,4400)
plt.axvspan(4200, 4400, facecolor='r', alpha=0.1)

plt.subplot(2,1,2)
plt.xlim(0, 5000)
plt.title('MatrixProfile')
plt.plot(MP[0])
plt.axvspan(4200, 4400, facecolor='r', alpha=0.1)

ecg_and_mp.png Sie können bestätigen, dass die Anomalie erfolgreich erkannt wurde. Lassen Sie uns außerdem die Wellenform des Teils überprüfen, bei dem der Wert von MatrixProfile das Maximum ist, dh die Wellenform des abnormalsten Teils.

#Maximale Wellenform von MatrixProfile und die nächste Wellenform
max_point_index = np.argmax(MP[0])
nearest_neighbor_index = MP[1][max_point_index]
plt.tight_layout()
fig, ax = plt.subplots(1, 3, figsize=(22, 6))


ax[0].plot(X[max_point_index:max_point_index+window_size], linewidth=5, color = "r")
ax[0].title.set_text("mp_peak(anormaly_wave)")

ax[1].plot(X[nearest_neighbor_index:nearest_neighbor_index+window_size], linewidth=5, color = "b")
ax[1].title.set_text("nearest_neighbor")

from sklearn.preprocessing import StandardScaler
S = StandardScaler()

ax[2].title.set_text("comparison")
ax[2].plot(S.fit_transform(X[max_point_index:max_point_index+window_size].reshape(-1,1)).flatten(), linewidth=5, color = "r")
ax[2].plot(S.fit_transform(X[nearest_neighbor_index:nearest_neighbor_index+window_size].reshape(-1,1)).flatten(), linewidth=5, color = "b")

図1.png Die Wellenform ganz links ist die größte MatrixProfile-Wellenform, die Mitte ist die nächste Wellenform und ganz rechts ist der z-normalisierte Vergleich jeder Wellenform. Nun, ich bin kein EKG-Experte, daher kann ich die Bedeutung der Wellenform nicht verstehen, aber die abnormale Wellenform weist in erster Linie verschiedene Spitzen, kleine Dellen und eine Phasenverschiebung auf. Sie können den Unterschied sehen. Es ist interpretierbar und nett.

Stärken des Matrixprofils

"Ist es nicht möglich, Anomalien mit anderen Methoden zu erkennen? Deep Learning ist in Ordnung." Viele Leute mögen das glauben.

Der Reiz von Matrix Profile liegt jedoch in seiner Einfachheit. Obwohl der Berechnungsprozess von MatrixProfile überraschend neu ist, stimmt die endgültige Ausgabe nur mit Teilwellenformen überein. Mit anderen Worten, selbst wenn eine Anomalie festgestellt wird, kann die Gültigkeit von einer Person leicht überprüft werden. In Bezug auf Zuverlässigkeit und Rückverfolgbarkeit gibt es nichts Vergleichbares.

Darüber hinaus ist diese Erkennung abnormaler Wellenformen nur eine der Funktionen von Matrix Profile. Es scheint, dass es viele Anwendungen gibt, einschließlich der Entdeckung von Motiv und Shapelet. Es ist eine Revolution, nicht wahr?

Zusammenfassung

MatrixProfile eingeführt und eine Bibliothek namens matrixprofile-ts ausprobiert: grinsen:

Recommended Posts

Erkennung von EKG-Datenanomalien durch Matrix Profile
Abnormalitätserkennung von Zeitreihendaten durch LSTM (Keras)
Abnormalitätserkennung mit MNIST durch Autoencoder (PyTorch)
Tiefes Lernen durch Implementierung gelernt ~ Erkennung von Abnormalitäten (Lernen ohne Lehrer) ~
[Erkennung von Abnormalitäten] Erkennen Sie Bildverzerrungen durch Fernunterricht
Matrix nach Funktion betrachtet
Daten nach Schwellenwert aufteilen
Trainingsdaten von CNN
Korrelation durch Datenvorverarbeitung
Einführung in die Anomalieerkennung 2 Ausreißererkennung
Abnormalitätserkennung unter der Annahme einer multivariaten Normalverteilung nach der T ^ 2-Hotelmethode
Ich habe versucht, die Erkennung von Anomalien durch spärliches Strukturlernen zu implementieren
Abnormalitätserkennung durch Auto-Encoder mit Keras [Implementierungsbeispiel für Anfänger]