wie man verschiedene Sätze von Zeitreihendaten vergleicht

8

Ich versuche mit Python und sklearn eine Anomalieerkennung zwischen Zeitreihen durchzuführen (aber andere Paketvorschläge sind auf jeden Fall willkommen!).

Ich habe einen Satz von 10 Zeitreihen; Jede Zeitreihe besteht aus Daten, die aus dem Drehmomentwert eines Reifens (also insgesamt 10 Reifen) erfasst wurden, und die Sätze enthalten möglicherweise nicht die gleiche Anzahl von Datenpunkten (Satzgröße unterschiedlich) . Jede Zeitreihendaten sind so ziemlich nur die Reifen-ID, der Zeitstempel und der sig-Wert (Wert aus dem Signal oder dem Sensor). Beispieldaten für eine Zeitreihe sehen folgendermaßen aus:

tire_id        timestamp        sig_value
tire_1           23:06.1            12.75
tire_1           23:07.5                0
tire_1           23:09.0            -10.5

Jetzt habe ich 10 von ihnen und 2 von ihnen verhalten sich seltsam. Ich verstehe, dass dies ein Problem bei der Erkennung von Anomalien ist, aber die meisten Artikel, die ich online lese, erkennen Anomaliepunkte innerhalb derselben Zeitreihe (auch bekannt als, wenn an einigen Punkten die Drehmomentwerte für diesen Reifen nicht normal sind).

Um festzustellen, welche 2 Reifen sich abnormal verhalten, habe ich versucht, die Clustering-Methode zu verwenden, im Grunde genommen k-bedeutet Clustering (da es unbeaufsichtigt ist).

Um die Daten für die Einspeisung in das k-means-Clustering für jede Zeitreihe (auch bekannt als für jeden Reifen) vorzubereiten, habe ich Folgendes berechnet:

  1. Die Top 3 Sätze des benachbarten lokalen Maximums und lokalen Minimums mit der höchsten Amplitude (Differenz)
  2. Mittelwert des Drehmomentwertes
  3. Standardabweichung der Drehmomentwerte

Ich habe auch die Anzahl der Cluster auf nur 2 festgelegt, also entweder Cluster 1 oder 2.

Mein Endergebnis (nach dem Zuweisen von Clustern) sieht also wie folgt aus:

        amplitude  local maxima  local minima  sig_value_std  \
tire_0     558.50        437.75       -120.75      77.538645   
tire_0     532.75        433.75        -99.00      77.538645   
tire_0     526.25        438.00        -88.25      77.538645   
tire_1     552.50       -116.50        436.00      71.125912   
tire_1     542.75        439.25       -103.50      71.125912   

        sig_value_average  cluster  
tire_0          12.816990        0  
tire_0          12.816990        0  
tire_0          12.816990        0  
tire_1          11.588038        1  
tire_1          11.588038        0 

Jetzt habe ich eine Frage, was ich mit diesem Ergebnis anfangen soll ... also hat jeder Reifen 3 Datenreihen, da ich die Top 3 Paare lokaler Max / Min mit 3 größten Amplituden ausgewählt habe, und das bedeutet, dass jede Reihe sein kann einem Cluster zugewiesen, und manchmal werden sie sogar für 1 Reifen verschiedenen Clustern zugewiesen. Außerdem ist die Clustergröße normalerweise größer als nur 2.

Meine Fragen sind:

  1. Wie erkennt man Anomalien über "Zeitreihen", nicht nur über einzelne Datenpunkte?
  2. Ist mein Ansatz vernünftig / logisch? Wenn ja, wie kann ich mein Ergebnis bereinigen, um das zu erhalten, was ich will? Und wenn nicht, was kann ich tun, um mich zu verbessern?
immer Fragen stellen
quelle

Antworten:

1

Ziemlich interessante Frage!

Zunächst einmal haben Sie einen Blick auf meine bearbeiten , wie Ihre Frage ein wenig unklar gemäß der Standardterminologie war. Sie haben eine Reihe von Zeitreihen und möchten die Ausreißer (Anomalien) erkennen.

  1. Ihr Ansatz ist ziemlich klar und logisch und zeigt Verständnis für das Problem und die Lösung. Es geht um die Art und Weise, wie Sie es angewendet haben.
  2. K-Mittel ist nicht der beste Weg. Ich möchte darauf hinweisen, dass die Auswahl von 2 Clustern hier sehr klug ist, da Sie hoffen, dass die Cluster auf der Grundlage einer normalen / abnormalen Struktur gebildet werden. In der Praxis funktioniert es einfach nicht gut, wenn die Funktionen, die Sie aus Ihren Zeitreihen extrahiert haben, das abnormale Verhalten nicht hemmen.
  3. Ich gehe davon aus, dass Einbettungsalgorithmen der richtige Weg sind. Wenn Sie eine einfache PCA anwenden, werden Sie höchstwahrscheinlich irgendwo weiter als andere abnormale Zeitreihen sehen. Unten schreibe ich den Code. Probieren Sie es aus und schreiben Sie mir eine Nachricht, wenn es nicht funktioniert hat, sodass ich mich für anspruchsvollere Lösungen entscheide (z. B. können Sie einen Phasenraum erstellen und Ihre Daten dort anzeigen oder die Wiederholung von Zeitreihen überwachen usw.).
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

pca = PCA(n_components=2)
X_new = pca.fit_transform(X)
plt.figure(figsize=(10,10))
plt.plot(X_new[:,0],X_new[:,1],"*")
plt.show()

Dabei ist X eine 10xN-Matrix, in der jede Zeile eine Zeitreihe ist.

Sie können weitere Komponenten für PCA auswählen und verschiedene PCs miteinander vergleichen.

Auf jeden Fall ist das Problem nicht so schwierig und wenn es nicht funktioniert hat, werde ich meine Antwort mit einer anderen Lösung aktualisieren.

Hoffe es hilft und viel Glück!

Kasra Manshaei
quelle
Hallo Kasra! Vielen Dank, dass Sie versucht haben zu helfen! Ich probiere Ihre Methode aus und habe einen Mangel / eine Einschränkung Ihrer Methode festgestellt. Das heißt, Ihr Ansatz geht davon aus, dass jeder von mir verwendete Zeitreihendatensatz dieselbe Anzahl von Datenpunkten aufweist, was nicht der Fall ist hier ... noch andere Vorschläge? :(
alwaysaskingquestions
Sicher, wenn Sie die Antwort positiv bewerten / akzeptieren, wenn sie funktioniert hat. In der ersten Phase nur Zeitreihen abschneiden. Schneiden Sie sie auf die gleiche Größe wie die kürzesten Zeitreihen. Wenn es nicht geholfen hat, schreiben Sie hier einen weiteren Kommentar.
Kasra Manshaei
Hallo Kasra, ich möchte die Daten nicht verlieren. Ist es möglich, die Daten nicht zu schneiden? Ich möchte sie alle benutzen.
alwaysaskingquestions
Ersetzen Sie also den Schwanz Ihrer Zeitreihe durch den letzten Wert.
Probieren
Ändert das nicht die Daten im Grunde? Weil ich jetzt den kürzeren Datensätzen einen Mehrwert hinzufüge ... das ändert also meine Ergebnisse, oder? (Vielen Dank, dass Sie geduldig mit mir sind!)
Fragen