So zeichnen Sie eine Linie (polygonale Kette) mit numpy / scipy / matplotlib mit minimaler Glättung

8

Ich versuche, eine Zeile in Matplotlib zu zeichnen. Ich suche nach der richtigen Art der Interpolation. Ich möchte so etwas wie

wo jede Zeile geglättet wird. Ich habe mehrere Kombinationen von scipy und matplotlib ausprobiert, wie zum Beispiel

%Vor%

aber das beste Ergebnis, das ich bekomme, ist

Die Zeile repräsentiert eine steigende Variable . Es ist also eine falsche Darstellung. Was kann ich suchen?

Danke

Edit: Ich denke über die Implementierung einer Methode von mir selbst, aber ich weiß nicht, ob es bereits getan wurde .. Pseudocode ist der folgende

%Vor%     
gc5 17.10.2012, 13:11
quelle

5 Antworten

8

Für diese Art von Graphen möchten Sie eine monotone Interpolation. Die PchipInterpolator Klasse (auf die Sie sich beziehen können, indem Sie kürzer angeben alias pchip ) in scipy.interpolate kann verwendet werden:

%Vor%

Ergebnis:

    
Warren Weckesser 17.10.2012, 14:32
quelle
1

Das Problem ist kein Anzeigeproblem. Es ist ein Interpolationsproblem. Sie interpolieren mit Spline-Funktionen. Das Auswählen der richtigen Interpolationsmethode hängt sehr von der Art der Daten ab, die Sie haben. Sie können nicht erwarten, eine Interpolationsfunktion zu haben, die sich unter allen Umständen richtig verhält (die Interpolation hat keine Möglichkeit zu wissen, dass Ihre Funktion zunimmt).

    
Nicolas Barbey 17.10.2012 13:23
quelle
1

Sie sollten sich entweder

ansehen

scipy.interpolate.LSQUnivariateSpline und spielen mit k Parameter (Grad des Splines)

oder scipy.interpolate.UnivariateSpline und spielen mit k und s Parameter.

    
sega_sai 17.10.2012 14:06
quelle
1

Es ist wichtig zu verstehen, dass die Interpolation nicht nur eine Linie für die Visualisierung ist. Es ist ein mathematisches Modell, das darstellt, wie das System sich verhält (das System, das die von Ihnen gemessenen Daten generiert). Verschiedene Arten von Interpolationen repräsentieren unterschiedliche Annahmen über das System.

Wenn Sie also wissen, dass Ihr System so ist, dass eine Variable nur zunehmen kann, sollten Sie ein passendes Modell einfügen (d. h. die entsprechende Interpolation verwenden). Wenn Sie Ihre Daten betrachten, sieht es so aus, als ob ein Polynom zweiten Grades oder eine Exponentialfunktion gut passen würde. Eine Loess-Anpassung (lokale Regression) funktioniert ebenfalls. Sie können entweder angepasste Funktionen wie numpy.polyfit () oder eine generische Kurvenanpassung mit scipy.optimize.curve_fit () verwenden. Wenn Sie weitere Kenntnisse über das System haben, sollten Sie es verwenden, um das passende Modell auszuwählen.

    
Bitwise 17.10.2012 14:28
quelle
1

Ich habe mich ein wenig umgeschaut. Was Sie wollen, heißt

Monotone kubische Interpolation,

siehe Wikipedia hier . Sie haben eine Diskussion über Mathexchange darüber hier und ich habe eine Implementierung in gefunden python hier . Lass es mich wissen, wenn das funktioniert!

    
gg349 17.10.2012 14:31
quelle