Ich weiß, scipy curve_fit kann es besser machen

9

Ich verwende python / numpy / scipy, um diesen Algorithmus für die Ausrichtung zweier digitaler Höhenmodelle (DEMs) basierend auf Geländeaspekt und -neigung zu implementieren:

"Ko-Registrierung und Bias-Korrekturen von Satelliten-Höhendatensätzen zur Quantifizierung der Gletscher-Dickenänderung", C. Nuth und A. Kääb, doi: 10.5194 / tc-5-271-2011

Ich habe Dinge ein Framework eingerichtet, aber die Qualität der Anpassung von scipy.optimize.curve_fit ist schlecht.

%Vor%

Hier ist die Eignung für meine Daten, die anfangs aus ~ 2 Millionen Punkten bestehen, aber ich habe zufällig zu Testzwecken / Plotting-Zwecken Proben genommen:

[-14.9639559 216.01093596 -41.96806735]

Da gibt es viele Daten für eine gute Anpassung, aber das Ergebnis von curve_fit ist schlecht. Wenn ich mit synthetischen Daten arbeite, bekomme ich einen schönen Sitz:

ursprüngliche Eingangsparameter [20.0, 130.0, -3.0]

Ergebnis von curve_fit [-19.66719631 -49.6673076 -3.12198723]

Ich bin mir nicht sicher, ob das etwas mit maskierten Arrays zu tun hat, eine Einschränkung von curve_fit oder ob ich einfach etwas Einfaches übersehen habe. Danke für Anregungen.

=========================

Bearbeiten 9/4/13 16:30 PDT

Wie von @Evert und anderen vorgeschlagen, hing das Problem definitiv mit Ausreißern zusammen. Ich war in der Lage, nach dem Entfernen von Ausreißern eine viel bessere Passform zu erhalten. Wenn ich meinen alten Code betrachte, scheint es, dass ich die mediane absolute Abweichung für jeden Aspekt berechnet habe und dann alles außerhalb von 2 * mad vor der Anpassung entfernt habe.

Ich habe bereits im November 2012 ein paar zusätzliche Pläne erstellt:

Aber wenn ich diese wieder ansehe, bin ich fast sicher, dass sie für verschiedene Eingabedaten generiert wurden. Das ist alles, was ich im Moment finden kann, deshalb nehme ich sie hier als Beispiel für einen Fall mit voreingenommenem Sampling auf. Diese Methode für die DEM-Ausrichtung muss in solchen Fällen fehlschlagen - und sie hat nichts mit den Fähigkeiten von scipy zur Kurvenanpassung zu tun.

Ich habe schließlich einen anderen Ansatz für die Ausrichtung entwickelt, der die normalisierte Kreuzkorrelation, Subpixel-Verfeinerung und vertikale Offset-Entfernung für zwei maskierte 2D-numpy-Arrays beinhaltet. Es ist schneller und liefert konsistent bessere Ergebnisse. Obwohl dieser Ansatz von einem Iterative Closest Point (ICP) -Tool (pc_align) abgelöst wurde, das von Oleg Alexandrow als Teil des NASA Ames Stereo-Pipeline .

Vielen Dank für all Ihre Antworten und ich entschuldige mich dafür, dass ich diese Frage aufgegeben habe.

    
David Shean 12.09.2012, 23:27
quelle

1 Antwort

1
___ antwort13211304 ___

Wenn Sie nur versuchen, eine Sinuswelle mit Phasenverschiebung zu erhalten, brauchen Sie keine nichtlineare Anpassung.

Sie können dieses a * sin(x - b) + c durch a * sin(x) + b * cos(x) + c ersetzen, weil jeder Sinus mit einem Offset als eine geeignete Kombination eines Sinus und eines Kosinus geschrieben werden kann ("Phasor addition", wie in einer Fourier-Transformation).

Wenn das das gleiche Ergebnis ergibt, dann ist es nicht die "nicht-lineare" Anpassung, die das Problem ist.

    
___ tag123curvefitting ___ Anpassen der 1-D-Kurve an Datenpunkte, Minimieren der vordefinierten Fehler / Verlust-Funktion. ___ tag123scipy ___ SciPy ist eine Open-Source-Bibliothek von Algorithmen und mathematischen Werkzeugen für die Programmiersprache Python. ___ qstntxt ___

Ich verwende python / numpy / scipy, um diesen Algorithmus für die Ausrichtung zweier digitaler Höhenmodelle (DEMs) basierend auf Geländeaspekt und -neigung zu implementieren:

"Ko-Registrierung und Bias-Korrekturen von Satelliten-Höhendatensätzen zur Quantifizierung der Gletscher-Dickenänderung", C. Nuth und A. Kääb, doi: 10.5194 / tc-5-271-2011

Ich habe Dinge ein Framework eingerichtet, aber die Qualität der Anpassung von scipy.optimize.curve_fit ist schlecht.

%Vor%

Hier ist die Eignung für meine Daten, die anfangs aus ~ 2 Millionen Punkten bestehen, aber ich habe zufällig zu Testzwecken / Plotting-Zwecken Proben genommen:

[-14.9639559 216.01093596 -41.96806735]

Da gibt es viele Daten für eine gute Anpassung, aber das Ergebnis von curve_fit ist schlecht. Wenn ich mit synthetischen Daten arbeite, bekomme ich einen schönen Sitz:

ursprüngliche Eingangsparameter [20.0, 130.0, -3.0]

Ergebnis von curve_fit [-19.66719631 -49.6673076 -3.12198723]

Ich bin mir nicht sicher, ob das etwas mit maskierten Arrays zu tun hat, eine Einschränkung von curve_fit oder ob ich einfach etwas Einfaches übersehen habe. Danke für Anregungen.

=========================

Bearbeiten 9/4/13 16:30 PDT

Wie von @Evert und anderen vorgeschlagen, hing das Problem definitiv mit Ausreißern zusammen. Ich war in der Lage, nach dem Entfernen von Ausreißern eine viel bessere Passform zu erhalten. Wenn ich meinen alten Code betrachte, scheint es, dass ich die mediane absolute Abweichung für jeden Aspekt berechnet habe und dann alles außerhalb von 2 * mad vor der Anpassung entfernt habe.

Ich habe bereits im November 2012 ein paar zusätzliche Pläne erstellt:

Aber wenn ich diese wieder ansehe, bin ich fast sicher, dass sie für verschiedene Eingabedaten generiert wurden. Das ist alles, was ich im Moment finden kann, deshalb nehme ich sie hier als Beispiel für einen Fall mit voreingenommenem Sampling auf. Diese Methode für die DEM-Ausrichtung muss in solchen Fällen fehlschlagen - und sie hat nichts mit den Fähigkeiten von scipy zur Kurvenanpassung zu tun.

Ich habe schließlich einen anderen Ansatz für die Ausrichtung entwickelt, der die normalisierte Kreuzkorrelation, Subpixel-Verfeinerung und vertikale Offset-Entfernung für zwei maskierte 2D-numpy-Arrays beinhaltet. Es ist schneller und liefert konsistent bessere Ergebnisse. Obwohl dieser Ansatz von einem Iterative Closest Point (ICP) -Tool (pc_align) abgelöst wurde, das von Oleg Alexandrow als Teil des NASA Ames Stereo-Pipeline .

Vielen Dank für all Ihre Antworten und ich entschuldige mich dafür, dass ich diese Frage aufgegeben habe.

    
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ qstnhdr ___ Ich weiß, scipy curve_fit kann es besser machen ___
mdaoust 03.11.2012 16:52
quelle

Tags und Links