Ich habe eine Reihe von Daten, die nicht in einer bestimmten Reihenfolge angeordnet sind, aber bei einer klaren Darstellung zwei unterschiedliche Trends aufweisen. Eine einfache lineare Regression wäre hier aufgrund der eindeutigen Unterscheidung der beiden Reihen nicht ausreichend. Gibt es eine einfache Möglichkeit, die beiden unabhängigen linearen Trendlinien zu ermitteln?
Ich benutze Python und bin einigermaßen vertraut mit Programmierung und Datenanalyse, einschließlich maschinellem Lernen, bin aber bereit, bei Bedarf auf R umzusteigen.
time-series
python
curve-fitting
jbbiomed
quelle
quelle
Antworten:
Ein guter Ansatz zur Lösung Ihres Problems besteht darin, ein Wahrscheinlichkeitsmodell zu definieren, das mit den Annahmen zu Ihrem Dataset übereinstimmt. In Ihrem Fall möchten Sie wahrscheinlich eine Mischung aus linearen Regressionsmodellen. Sie können ein "Gemisch von Regressoren" -Modell erstellen, das einem Gaußschen Gemischmodell ähnelt, indem Sie verschiedene Datenpunkte mit verschiedenen Gemischkomponenten verknüpfen.
Ich habe Code eingefügt, um Ihnen den Einstieg zu erleichtern. Der Code implementiert einen EM-Algorithmus für eine Mischung aus zwei Regressoren (eine Erweiterung auf größere Mischungen sollte relativ einfach sein). Der Code scheint für zufällige Datensätze ziemlich robust zu sein. Im Gegensatz zur linearen Regression haben Mischungsmodelle jedoch nicht konvexe Ziele. Daher müssen Sie für einen realen Datensatz möglicherweise einige Versuche mit verschiedenen zufälligen Startpunkten durchführen.
quelle
An anderer Stelle in diesem Thread bietet user1149913 hervorragende Ratschläge (Definieren eines probabilistischen Modells) und Code für einen leistungsfähigen Ansatz (EM-Schätzung). Zwei Fragen müssen noch geklärt werden:
Wie gehe ich mit Abweichungen vom Wahrscheinlichkeitsmodell um (die in den Daten für 2011-2012 sehr deutlich und in den Unebenheiten der weniger geneigten Punkte etwas deutlich erkennbar sind)?
Identifizieren guter Startwerte für den EM-Algorithmus (oder einen anderen Algorithmus).
Verwenden Sie eine Hough-Transformation, um Nummer 2 zu adressieren . Dies ist ein Merkmalserkennungsalgorithmus, der zum Auffinden linearer Merkmalsabschnitte effizient als Radon-Transformation berechnet werden kann .
Um mit diesen Daten zu beginnen, habe ich zuerst die Hilfsmittel (Achsen, Häkchen und Beschriftungen) und zum guten Teil die offensichtlich äußeren Punkte unten rechts ausgeschnitten und entlang der unteren Achse gestreut. (Wenn das Zeug nicht ausgeschnitten ist, funktioniert die Prozedur immer noch gut, aber es erkennt auch die Achsen, die Frames, die linearen Sequenzen von Ticks, die linearen Sequenzen von Labels und sogar die Punkte, die sporadisch auf der unteren Achse liegen!)
(Dies und der Rest des Codes befinden sich in Mathematica .)
Jedem Punkt in diesem Bild entspricht ein enger Kurvenbereich in der Hough-Transformation, der hier sichtbar ist. Sie sind Sinuswellen:
Dies verdeutlicht visuell den Sinn, in dem die Frage ein Linienclustering- Problem ist: Die Hough-Transformation reduziert sie auf ein Punktclustering- Problem, auf das wir jede beliebige Clustering-Methode anwenden können.
In diesem Fall ist die Clusterbildung so eindeutig, dass eine einfache Nachbearbeitung der Hough-Transformation ausreicht. Um Stellen mit der größten Intensität in der Transformation zu identifizieren, habe ich den Kontrast erhöht und die Transformation über einen Radius von etwa 1% verwischt: Das ist vergleichbar mit den Durchmessern der Diagrammpunkte im Originalbild.
Durch Schwellenwertbildung wurde das Ergebnis auf zwei winzige Flecken eingegrenzt, deren Zentroide die Punkte mit der größten Intensität identifizieren: Diese schätzen die angepassten Linien.
Die linke Seite des Bildes entspricht einer Richtung von 0 Grad (horizontal), und wenn wir von links nach rechts schauen, vergrößert sich dieser Winkel linear auf 180 Grad. Wenn ich interpoliere, berechne ich, dass die beiden Blobs bei 19 bzw. 57,1 Grad zentriert sind. Wir können die Abschnitte auch an den vertikalen Positionen der Blobs ablesen. Diese Information liefert die Anfangsanpassungen:
Auf ähnliche Weise kann man die Abschnitte berechnen, die diesen Steigungen entsprechen, und diese Anpassungen ergeben:
(Die rote Linie entspricht dem winzigen rosa Punkt im vorherigen Bild und die blaue Linie entspricht dem größeren Aqua-Blob.)
Dieser Ansatz hat sich weitgehend automatisch mit dem ersten Problem befasst: Abweichungen von der Linearität verwischen die Punkte mit der größten Intensität, verschieben sie jedoch in der Regel nicht stark. Ehrlich gesagt tragen äußere Punkte während der gesamten Hough-Transformation zu einem niedrigen Rauschpegel bei, der während der Nachbearbeitungsvorgänge verschwindet.
An diesem Punkt kann man diese Schätzungen als Startwerte für den EM-Algorithmus oder für einen Likelihood-Minimierer (der bei guten Schätzungen schnell konvergiert) bereitstellen. Besser wäre es jedoch, einen robusten Regressionsschätzer wie iterativ gewichtete kleinste Quadrate zu verwenden . Es ist in der Lage , jedem Punkt ein Regressionsgewicht zuzuweisen . Niedrige Gewichte bedeuten, dass ein Punkt nicht zu einer Linie gehört. Nutzen Sie diese Gewichte, wenn Sie möchten, um jedem Punkt die richtige Linie zuzuweisen. Nachdem Sie die Punkte klassifiziert haben, können Sie gewöhnliche kleinste Quadrate (oder ein anderes Regressionsverfahren) für die beiden Punktgruppen separat verwenden.
quelle
rotation
ursprünglich auf Null gesetzt war und daher keinen Unterschied machte.Ich habe diese Frage mit einer anderen Frage verknüpft . Ich habe tatsächlich akademisch über diese Art von Problem geforscht. Bitte überprüfen Sie meine Antwort "Least Square Root" passend? Eine Anpassungsmethode mit mehreren Minima für weitere Details.
Der auf Hough-Transformation basierende Ansatz von whuber ist eine sehr gute Lösung für einfache Szenarien, wie Sie sie angegeben haben. Ich habe an Szenarien mit komplexeren Daten gearbeitet, wie zum Beispiel:
Meine Co-Autoren und ich bezeichneten dies als ein "Datenassoziations" -Problem. Wenn Sie versuchen, es zu lösen, ist das Hauptproblem aufgrund der exponentiellen Menge möglicher Datenkombinationen in der Regel kombinatorisch.
Wir haben eine Veröffentlichung " Überlappende Mischungen von Gaußschen Prozessen für das Datenassoziationsproblem " veröffentlicht, in der wir uns dem allgemeinen Problem der N-Kurven mit einer iterativen Technik näherten und sehr gute Ergebnisse erzielten. Sie finden den Matlab-Code im Artikel.
[Update] Eine Python-Implementierung der OMGP-Technik finden Sie in der GPClust-Bibliothek .
Ich habe ein anderes Papier, in dem wir das Problem gelockert haben, um ein konvexes Optimierungsproblem zu erhalten, aber es wurde noch nicht zur Veröffentlichung angenommen. Es ist spezifisch für 2 Kurven, sodass es perfekt für Ihre Daten funktioniert. Lass es mich wissen wenn du interessiert bist.
quelle
user1149913 hat eine exzellente Antwort (+1), aber es sieht so aus, als ob Ihre Datenerfassung Ende 2011 auseinanderfiel. Sie müssten also diesen Teil Ihrer Daten abschneiden und die Dinge dann immer noch ein paar Mal mit einem anderen Zufallsprinzip ausführen Startkoeffizienten, um zu sehen, was Sie bekommen.
Eine einfache Möglichkeit besteht darin, Ihre Daten per Auge in zwei Gruppen zu unterteilen und dann die gewohnte lineare Modelltechnik zu verwenden. In R wäre es die
lm
Funktion.Oder passen Sie zwei Linien mit dem Auge an. In R würden Sie dies verwenden
abline
.Die Daten sind durcheinander, haben Ausreißer und fallen am Ende auseinander, aber By-Eye hat zwei ziemlich offensichtliche Linien, daher bin ich mir nicht sicher, ob sich eine ausgefallene Methode lohnt.
quelle