Ich habe eine große Folge von Vektoren der Länge N. Ich brauche einen unbeaufsichtigten Lernalgorithmus, um diese Vektoren in M Segmente zu unterteilen.
Zum Beispiel:
K-means ist nicht geeignet, da es ähnliche Elemente von verschiedenen Standorten in einem einzigen Cluster zusammenfasst.
Aktualisieren:
Die realen Daten sehen folgendermaßen aus:
Hier sehe ich 3 Cluster: [0..50], [50..200], [200..250]
Update 2:
Ich habe modifizierte k-Mittel verwendet und dieses akzeptable Ergebnis erhalten:
Grenzen von Clustern: [0, 38, 195, 246]
machine-learning
clustering
sequence
allgemein
quelle
quelle
Antworten:
Bitte lesen Sie meinen Kommentar oben und dies ist meine Antwort gemäß dem, was ich aus Ihrer Frage verstanden habe:
Vorverarbeitung
Bitte beachten Sie, dass es einen Kompromiss zwischen der genauen Position des Änderungspunkts und der genauen Anzahl von Segmenten gibt. Wenn Sie also die Originaldaten verwenden, finden Sie die genauen Änderungspunkte, aber die gesamte Methode ist zu rauschempfindlich, aber wenn Sie glätten Ihre Signale zuerst finden Sie möglicherweise nicht die genauen Änderungen, aber der Rauscheffekt ist viel geringer, wie in den folgenden Abbildungen gezeigt:
Fazit
Mein Vorschlag ist , Ihre Signale zuerst und gehen für ein einfaches Clustering mthod (zB mit glätten GMM s) eine genaue Schätzung der Anzahl der Segmente in Signale zu finden. Anhand dieser Informationen können Sie Änderungspunkte finden, die durch die Anzahl der Segmente eingeschränkt sind, die Sie im vorherigen Teil gefunden haben.
Ich hoffe es hat alles geholfen :)
Viel Glück!
AKTUALISIEREN
Zum Glück sind Ihre Daten ziemlich einfach und sauber. Ich empfehle dringend Algorithmen zur Reduzierung der Dimensionalität (z . B. einfache PCA ). Ich denke, es zeigt die interne Struktur Ihrer Cluster. Sobald Sie PCA auf die Daten angewendet haben, können Sie k-means viel einfacher und genauer verwenden.
Eine ernsthafte (!) Lösung
Nach Ihren Angaben sehe ich, dass die generative Verteilung verschiedener Segmente unterschiedlich ist, was eine große Chance für Sie ist, Ihre Zeitreihen zu segmentieren. Sehen Sie sich dies an (Original , Archiv , andere Quelle ), die wahrscheinlich die beste und modernste Lösung für Ihr Problem ist. Die Hauptidee hinter diesem Artikel ist, dass, wenn verschiedene Segmente einer Zeitreihe durch verschiedene zugrunde liegende Verteilungen erzeugt werden, Sie diese Verteilungen finden, dies als Grundwahrheit für Ihren Clustering-Ansatz festlegen und Cluster finden können.
Nehmen wir zum Beispiel ein langes Video an, in dem in den ersten 10 Minuten jemand Fahrrad fährt, in den zweiten 10 Minuten läuft er und in der dritten sitzt er. Mit diesem Ansatz können Sie diese drei verschiedenen Segmente (Aktivitäten) gruppieren.
quelle
Es ist bekannt, dass K-Means-Clustering lokale Minima ergibt, abhängig von Ihrer anfänglichen Initialisierung der Cluster-Zentren.
Die k-Mittelwert-Segmentierung kann jedoch meines Erachtens global gelöst werden, da wir bei der Suche nach der Lösung nichts zulassen.
Ich kann Ihren Kommentaren entnehmen, dass Sie es schließlich geschafft haben, eine Segmentierung zu erreichen. Könnten Sie bitte ein Feedback geben? Ist Ihre Lösung die beste Lösung? Oder haben Sie sich mit einer ausreichend guten Lösung zufrieden gegeben?
quelle
Nur als Vorschlag: Sie könnten versuchen, den DBSCAN-Algorithmus zu verwenden, da dieser beim Clustering oft viel besser funktioniert als K-means
Wenn Sie ansonsten etwas Neues für das Clustering ausprobieren und einige interessante Dinge lernen möchten, empfehlen wir Ihnen, eine topologische Datenanalyse anhand persistenter Diagramme durchzuführen. I'mma lass dir hier ein schönes einfaches Intro :)
https://towardsdatascience.com/persistent-homology-with-examples-1974d4b9c3d0
quelle