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:
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? –