2013-06-28 5 views
5

Ich habe eine Frage zu den Anpassungsalgorithmen in scipy verwendet. In meinem Programm habe ich eine Reihe von x- und y-Datenpunkten mit y Fehlern nur, und will eine FunktionUnterschied zwischen Anpassungsalgorithmen in scipy

f(x) = (a[0] - a[1])/(1+np.exp(x-a[2])/a[3]) + a[1] 

, um es zu passen.

Das Problem ist, dass ich absurd hohe Fehler auf den Parametern und auch verschiedene Werte und Fehler für die Fit-Parameter mit den beiden Fit scipy passen Routinen scipy.odr.ODR (mit kleinsten Quadrate Algorithmus) und scipy.optimize bekommen. Ich werde mein Beispiel:

Fit mit scipy.odr.ODR, fit_type = 2

Beta: [ 11.96765963 68.98892582 100.20926023 0.60793377] 
Beta Std Error: [ 4.67560801e-01 3.37133614e+00 8.06031988e+04 4.90014367e+04] 
Beta Covariance: [[ 3.49790629e-02 1.14441187e-02 -1.92963671e+02 1.17312104e+02] 
[ 1.14441187e-02 1.81859542e+00 -5.93424196e+03 3.60765567e+03] 
[ -1.92963671e+02 -5.93424196e+03 1.03952883e+09 -6.31965068e+08] 
[ 1.17312104e+02 3.60765567e+03 -6.31965068e+08 3.84193143e+08]] 
Residual Variance: 6.24982731975 
Inverse Condition #: 1.61472215874e-08 
Reason(s) for Halting: 
Sum of squares convergence 

und dann der Sitz mit scipy.optimize.leastsquares:

Fit mit scipy.optimize. leastsq

beta: [ 11.9671859 68.98445306 99.43252045 1.32131099] 
Beta Std Error: [0.195503 1.384838 34.891521 45.950556] 
Beta Covariance: [[ 3.82214235e-02 -1.05423284e-02 -1.99742825e+00 2.63681933e+00] 
[ -1.05423284e-02 1.91777505e+00 1.27300761e+01 -1.67054172e+01] 
[ -1.99742825e+00 1.27300761e+01 1.21741826e+03 -1.60328181e+03] 
[ 2.63681933e+00 -1.67054172e+01 -1.60328181e+03 2.11145361e+03]] 
Residual Variance: 6.24982904455 (calulated by me) 

Mein Punkt ist der dritte Fitparameter: die Ergebnisse sind

scipy.odr. ODR, fit_type = 2: C = 100.209 +/- 80600

scipy.optimize.leastsq: C = 99.432 +/- 12.730

Ich weiß nicht, warum der erste Fehler so viel höher ist. Noch besser: Wenn ich mit Fehlern in Origin 9 genau die gleichen Datenpunkte setzen bekomme ich C = x0 = 99,41849 +/- 0,20283

und wieder genau die gleichen Daten in C++ ROOT Cern C = 99,85 +/- 1.373

obwohl ich genau die gleichen Anfangsvariablen für ROOT und Python verwendet habe. Origin benötigt keine.

Haben Sie eine Ahnung, warum das passiert und welches ist das beste Ergebnis?

Ich habe den Code für Sie bei Pastebin:

Danke für die Unterstützung!

EDIT: Hier ist die Handlung zu SirJohnFranklins Post bezogen werden: see comment below

+0

Können Sie auf dem gleichen Graphen die Passungen und Fehler grafisch darstellen, die durch (1) 'scipy.odr' mit x- und y-Fehlern und (2)' ROOT' mit x- und y-Fehlern erhalten wurden. Wie bestimmt 'ROOT' auch, welche relative Gewichtung für x- und y-Fehler gegeben ist, da sie in verschiedenen Einheiten gemessen werden? In 'scipy.odr' werden' sx' und 'sy' in Gewichtungen umgewandelt, indem 1.0 durch ihre Quadrate dividiert wird - macht' ROOT' dasselbe? –

Antwort

1

Haben Sie versucht, tatsächlich die ODR und leastsq passen nebeneinander aufgetragen? Sie sehen im Grunde identisch:

enter image description here

überlegen Sie, was die Parameter entsprechen - die Sprungfunktion beschrieben durch beta[0] und beta[1], die Anfangs- und Endwerte, erklärt bei weitem der Mehrheit der Varianz in Ihren Daten.Im Gegensatz dazu haben kleine Änderungen in beta[2] und beta[3], dem Wendepunkt und der Steigung, einen vergleichsweise geringen Effekt auf die Gesamtform der Kurve und daher auf die Restvarianz für die Anpassung. Es überrascht daher nicht, dass diese Parameter hohe Standardfehler aufweisen und durch die beiden Algorithmen etwas anders angepasst werden.

Die insgesamt größeren Standardfehler, die von ODR gemeldet werden, sind auf die Tatsache zurückzuführen, dass dieses Modell Fehler in den y-Werten enthält, während die gewöhnliche Methode der kleinsten Quadrate nicht - Fehler in den gemessenen y-Werten unsere Zuverlässigkeit reduzieren sollte geschätzte Anpassungsparameter.

0

(Leider kann ich die Passform nicht hochladen, weil ich mehr Ruf brauchen. Ich werde die Handlung Kapitän Sandwich geben, so kann er es für mich hochladen.)

ich in der gleichen bin Arbeitsgruppe als die Person, die den Thread gestartet, aber ich habe diese Handlung.

Also habe ich x-Fehler auf die Daten hinzugefügt, weil ich nicht das letzte Mal so weit war. Der durch die ODR erhaltene Fehler ist immer noch absurd hoch (4.18550164e + 04 auf Beta [2]). In der Handlung zeige ich dir, was die FIT aus [ROOT Cern] [2] nun mit x- und y-Fehler gibt. Hier ist x0 das Beta [2].

Die rote und die grüne Kurve haben ein anderes Beta, das linke minus den Fehler der Anpassung von 3.430, der von ROOT und dem rechten plus dem Fehler erhalten wurde. Ich denke, das macht völlig Sinn, viel mehr, als der Fehler von 0.2 durch die Anpassung von Origin 9 (die nur y-Fehler behandeln kann) oder den Fehler von etwa 40k durch die ODR, der auch x und y enthält Fehler.

Vielleicht, weil ROOT hauptsächlich von Astrophysikern verwendet wird, die sehr raue Anpassungsalgorithmen benötigen, kann es viel schwierigere Anpassungen bewältigen, aber ich weiß nicht genug über die Robustheit von Anpassungsalgorithmen.

+0

Ich glaube wirklich nicht, dass es ein Problem mit der Robustheit der Passungen gibt - all die verschiedenen Algorithmen, die Sie ausprobiert haben, scheinen vernünftige Schätzungen für die Modellparameter zu geben. Die einzige Frage, die mir in den Sinn kommt, ist, dass ODR die Standardfehler der Fit-Parameter meldet. –

Verwandte Themen