2016-04-26 7 views
2

Ich weiß, dass es einige ähnliche Fragen gibt, aber da keiner von ihnen mich weiter brachte, entschied ich mich, einen meiner eigenen Fragen zu stellen. Es tut mir leid, wenn die Antwort auf mein Problem bereits irgendwo da draußen ist, aber ich konnte es wirklich nicht finden.Probleme mit curve_fit von scipy.optimze

Ich versuchte, f (x) = a * x ** b an eher lineare Daten mit curve_fit anzupassen. Es kompiliert richtig, aber das Ergebnis ist weg Art und Weise, wie unten dargestellt:

enter image description here

Die Sache ist, dass ich weiß nicht wirklich, was ich tue, aber auf der anderen Seite immer passend mehr eine Kunst als Wissenschaft und es gab mindestens einen allgemeinen bug with scipy.optimize.

Meine Daten sieht wie folgt aus:

x-Werte:

[16.8, 2.97, 0.157, 0.0394, 14.000000000000002, 8.03, 0.378, 0.192, 0.0428, 0.029799999999999997, 0.000781, 0.0007890000000000001] 

y-Werte:

[14561.766666666666, 7154.7950000000001, 661.53750000000002, 104.51446666666668, 40307.949999999997, 15993.933333333332, 1798.1166666666666, 1015.0476666666667, 194.93800000000002, 136.82833333333332, 9.9531566666666684, 12.073133333333333] 

, dass mein Code ist (ein wirklich schönes Beispiel in der letzten Antwort mit zu that question):

Die Startwerte stammen von einer Anpassung mit Gnuplot, das ist plausibel, aber ich muss es überprüfen.

[ 4.67885857e+03 6.24149549e-01] 
chi-square 
424707043.407 

Ich denke, dies ist eine schwierige Frage ist daher vielen Dank im Voraus:

(, dann Chi-Quadrat ersten p0 ausgestattet, p1) Dies ist Ausgabe gedruckt!

Antwort

1

Bei der Montage curve_fit die Summe optimiert (Daten - Modell)^2/(Fehler)^2

Wenn Sie nicht in Fehler passieren kann (wie Sie hier tun) curve_fit, dass alle Punkte davon ausgegangen, haben einen Fehler von 1.

In diesem Fall, wie Ihre Daten viele Größenordnungen umfasst, die Punkte mit den größten y-Werte dominieren die Zielfunktion, und verursacht curve_fit zu versuchen, sie auf Kosten der anderen passen.

Der beste Weg, um dies zu beheben wäre die Fehler in Ihrem yvalues in die Passform (es sieht aus wie Sie tun, wie Sie Fehlerbalken in der Handlung haben, die Sie gemacht haben!). Sie können dies tun, indem Sie sie als sigma Parameter von curve_fit übergeben.

+0

Vielen Dank, die Verwendung von 'sigma' gab mir eine gut aussehende Passform. Ich habe es vorher nicht benutzt, weil ich dachte, es sei a) nicht wichtig und b) für Fehler in den 'xvalues'. (Was ich nicht verstehe ist, warum es keinen Parameter für Fehler in 'xvalues' gibt.) Auch ich denke, ein geschätzter Fehler von 1 ist ein Designfehler und würde etwas wie '0.1 * value' bevorzugen. Würdest du zustimmen? Glauben Sie, dass es sich lohnt, einen Fehlerbericht einzureichen? Schöne Grüße. – Fabi

+0

Nicht wirklich - der Weg der geringsten Überraschung für mich im Code wäre, dass wenn keine Fehler gegeben sind, dann sollte angenommen werden, dass die Fehler konstant sind. Das wäre normalerweise das, was du willst. Die [Dokumentation ist auch hier ziemlich klar] (http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.curve_fit.html) –

+0

Ich bin mir nicht sicher. Ich habe immer gedacht, dass es auf eine Weise sein muss, die keinen Einfluss darauf hat, wie wichtig ein Punkt ist, da a priori kein Unterschied zwischen ihnen besteht. Weißt du, ob 0 möglich ist? – Fabi

1

Ich würde den experimentellen Teil überdenken. Zwei Datenpunkte sind fragwürdig: enter image description here

Das Bild, das Sie zeigte uns ziemlich gut aussieht, weil Sie das Protokoll nahm:

enter image description here

Sie könnten eine lineare Anpassung auf Protokoll tun (x) und log (y) . Auf diese Weise können Sie die Auswirkungen der größten Residuen begrenzen. Ein anderer Ansatz wäre eine robuste Regression (RANSAC von sklearn oder least_squares von scipy).

Trotzdem sollten Sie entweder mehr Datenpunkte sammeln oder die Messungen wiederholen.

+0

Nun, andere Daten sind nicht wirklich eine Option, aber ich kann Punkte ignorieren, wenn nicht plausibel, da alle meine Punkte Einzelmessungen sind. Aber Ihre Ideen zu den Berechnungen sind sehr hilfreich und ich werde sie im Hinterkopf behalten. Vielen Dank. – Fabi

Verwandte Themen