Passen Sie stückweise lineare Daten an


18

Was ist eine robuste Methode, um stückweise lineare, aber verrauschte Daten anzupassen?

Ich messe ein Signal, das aus mehreren fast linearen Segmenten besteht. Ich würde gerne mehrere Zeilen automatisch an die Daten anpassen, um die Übergänge zu erkennen.

Der Datensatz besteht aus einigen tausend Punkten mit 1-10 Segmenten und ich kenne die Anzahl der Segmente.

Dies ist ein Beispiel dafür, was ich automatisch tun möchte.

Bildbeschreibung hier eingeben


Ich denke nicht, dass diese Frage vernünftig beantwortet werden kann, es sei denn, Sie sagen uns, wie genau Sie die Positionen der Unterbrechungspunkte kennen möchten, wie hoch Ihre Schätzung für die kürzeste Länge eines linearen Segments ist und wie viele Proben es in einem typischen Segment gibt Übergangsbereich. Wenn die horizontalen Achsenbeschriftungen in Ihrer Figur Beispielnummern sind, ist die Aufgabe mit zwei Übergängen im Bereich von bis schwieriger als wenn die geraden Segmente länger dauern (in Proben). x [ 0 ]x[5]x[0]
Dilip Sarwate

@ DilipSarwate Ich habe die Frage mit den Anforderungen aktualisiert (übrigens ist die X-Achse das Magnetfeld in Tesla)
P3trus

Sie können diese Toolbox ausprobieren, wenn Sie mit der MATLAB- Toolbox für Kurvenanpassungen arbeiten
Rhei,

Antworten:


12

Ich habe zwei Ansätze versucht, naiv (mit nur 3 Segmenten). Sicherlich würde es ausgefallenere Methoden geben.

    RANSAC, soll ein robuster Passmechanismus sein. Es ist einfach, den Algorithmus nach einer Reihe von Segmenten zu stoppen. Es kann jedoch schwierig sein, die Kontinuität zwischen Segmenten - wie in Ihrer Anwendung erforderlich - zumindest mit einer einfachen Implementierung zu erzwingen. Als Proof of Concept habe ich aus den Datenpunkten ein Bild erstellt, damit ich die in , der von Mathematica, verfügbare RANSAC-Engine verwenden kann.ImageLines

Bildbeschreibung hier eingeben

    Passen Sie ein stückweise lineares Modell mit einem universellen Minimierer an. Es ist einfach, die Kontinuität von Segmenten durchzusetzen. Interessanterweise kann das Testen auf Residuen und andere Eigenschaften genügend Informationen liefern, um die Anzahl der Segmente automatisch zu bestimmen - ich habe es jedoch nicht ausprobiert. So sieht es in Mathematica aus:

Bildbeschreibung hier eingeben


Sieht nach einer tollen Antwort aus. Vielen Dank für Ihren Beitrag.
Jason R

7

Ich behaupte nicht, dass die folgende Methode robust ist, aber sie könnte für Sie funktionieren. Gehen Sie mit Tausenden von Punkten und vielleicht zehn oder mehr geraden Segmenten wie folgt vor.x[n]

  • Verarbeiten Sie die Punkte , um ein Bit-Array wie folgt zu erstellen . Herey [ n ] y [ n ] = { 1 , wenn | ( x [ n + 1 ] - x [ n ] ) - ( x [ n ] - x [ n - 1 ] ) | < ϵ , 0 , sonstx[n]y[n]

    y[n]={1,if |(x[n+1]x[n])(x[n]x[n1])|<ϵ,0,otherwise.
    ϵx[n1],x[n],x[n+1](n1,x[n1])(n,x[n])(n,x[n])(n+1,x[n+1])
  • y[n]1011ϵ

  • y[n]x[3]x[88]x[94]x[120]x[129], und so weiter. Ziehen Sie A nach rechts und B nach links, um herauszufinden, wo sie sich schneiden. Verlängern Sie B nach rechts und C nach links, um herauszufinden, wo sie sich schneiden usw. Herzlichen Glückwunsch, Sie haben jetzt ein kontinuierliches und stückweise lineares Modell für Ihre Daten.


Total meine Antwort gestohlen! =)
Phonon

Interessante Idee, aber leider aufgrund von Rauschen auf dem Signal bekomme ich keine guten Ergebnisse.
P3trus

1
Dieser Ausdruck, dessen Magnitute mit Epsilon verglichen wird, ist tatsächlich eine Annäherung an die zweite Ableitung der Daten. Es gibt andere Möglichkeiten, dies unter Verwendung von mehr als drei Punkten zu berechnen, die nicht so stark auf Rauschen reagieren. Savitzky-Golay nachschlagen.
DarenW

4

(Jahre später) stückweise lineare Funktionen sind Splines vom Grad 1, was die meisten Spline-Monteure tun müssen. scipy.interpolate.UnivariateSpline kann zum Beispiel mit k=1 einem Glättungsparameter ausgeführt werden s, mit dem Sie spielen müssen - siehe scipy-interpolation-with-univariate-splines .
In Matlab erfahren Sie, wie man Knoten auswählt .

Hinzugefügt: optimale Knoten zu finden ist nicht einfach, da es viele lokale Optima geben kann. Stattdessen geben Sie UnivariateSpline ein Ziel s, eine Fehlersumme ^ 2, und lassen es die Anzahl der Knoten bestimmen. Nach dem Anpassen get_residual()wird die tatsächliche Summe aus Fehler ^ 2 und get_knots()den Knoten ermittelt. Eine kleine Änderung in skann die Knoten stark verändern, insbesondere bei starkem Rauschen (ymmv).
Das Diagramm zeigt Anpassungen an eine zufällige stückweise lineare Funktion + Rauschen für verschiedene s.

Informationen zum Anpassen stückweiser Konstanten finden Sie unter Schritterkennung . Kann das für pw linear verwendet werden? Weiß nicht; Wenn Sie mit der Unterscheidung von verrauschten Daten beginnen, wird das Rauschen erhöht.

Andere Testfunktionen und / oder Links zu Dokumenten oder Code wären willkommen. Ein paar Links:
stückweise-lineare-Regression-mit-Knoten-als-Parametern
Lineare Splines reagieren sehr empfindlich darauf, wo die Knoten platziert werden.
Knotenauswahl für kubische Regressions-Splines
Dies ist ein heikles Problem und die meisten Leute wählen die Knoten einfach durch Ausprobieren aus.
Ein Ansatz, der immer beliebter wird, ist die Verwendung von bestraften Regressionssplines.


Hinzugefügt März 2014: Dynamische Programmierung ist eine allgemeine Methode für Probleme mit verschachtelten Unterproblemen wie folgt:

optimal k lines
    = optimal k - 1 lines up to some x
    + cost of the last line x to the end
over x  (all x in theory, nearby x in practice)

Dynamisches Programmieren ist sehr clever, aber kann es Brute Force + Heuristik für diese Aufgabe übertreffen?
Siehe das hervorragende Skriptum von Erik Demaine unter MIT 6,006 Intro zu Algorithmen
auch google segmentiert lineare Regression
auch John Henry - Syndrom.


Bildbeschreibung hier eingeben


Das Problem, zumindest bei scipy, ist die Positionierung der Knoten. scipy benutzt gleichmässig verteilte Knoten.
P3trus

@ P3trus, ja erstmal, aber dann können sie sich bewegen - siehe Handlung. Wie auch immer, es zielt auf totale Fehler ab, nicht auf Knoten.
Denis

@ P3trus Haben Sie versucht, eine multivariate Regressionsspline-Methode zu verwenden, die die Haltepunkte automatisch iterativ auswählt? cs.rtu.lv/jekabsons/regression.html
Atul Ingle

@Atul Ingle, afaik Breakpoint / Knot-Auswahl ist das gleiche Problem, egal welcher Spline-Monteur. Wenn Sie von R / regression people verschiedene Algorithmen dafür kennen, können Sie bitte einen Link posten?
Denis

Suchen Sie nach Paketen in R / Matlab, die adaptive Regressionssplines ausführen? Hier: cran.r-project.org/web/packages/earth/index.html cran.r-project.org/web/packages/mda/index.html und auch ARESLab in Matlab, für das ich bereits den Link gepostet habe.
Atul Ingle

0

Nehmen Sie die Ableitung und suchen Sie nach Bereichen mit nahezu konstantem Wert. Sie müssten den Algorithmus erstellen, um nach Bereichen mit einer idealen Neigung von +/- zu suchen. Dadurch erhalten Sie die Neigung der Linie für diesen Abschnitt. Möglicherweise möchten Sie vor der Schnittklassifizierung eine Glättung durchführen, z. B. einen gleitenden Mittelwert. Der nächste Schritt wäre, den y-Schnittpunkt zu erhalten, der an diesem Punkt trivial sein sollte.


Das Derivat ist möglicherweise sehr laut. Ich glaube nicht, dass ich das empfehlen würde.
Robert Bristow-Johnson

0

Die Verwendung eines l1-Trendfilters ist eine weitere Idee:

Papier

Online-Beispiel


1
Ihre Antwort ist ein bisschen zu kurz, um konstruktiv zu sein! Bitte überlegen Sie sich, es pädagogisch zu erweitern.
Sansuiso
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.