Mam pytanie dotyczące algorytmów dopasowania używanych w scipy. W moim programie, Mam zestaw z X i Y punktów danych z zaledwie y błędów, a chcesz dopasować funkcjęRóżnica między algorytmami dopasowania w scipy
f(x) = (a[0] - a[1])/(1+np.exp(x-a[2])/a[3]) + a[1]
do niego.
Problem polega na tym, że otrzymuję absurdalnie wysokie błędy parametrów, a także różne wartości i błędy dla parametrów dopasowania za pomocą dwóch dopasowanych procedur scipy fit scipy.odr.ODR (z algorytmem najmniejszych kwadratów) i scipy.optimize. Podam mój przykład:
pasuje 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
a następnie pasowanie z scipy.optimize.leastsquares:
Fit z 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)
mój punkt widzenia jest parametrem pasuje trzeci: wyniki są
scipy.odr. ODR, fit_type = 2: C = 100.209 +/- 80600
scipy.optimize.leastsq: C = 99.432 +/- 12.730
nie wiem dlaczego pierwszy błąd jest więc znacznie wyższa. Nawet lepiej: Jeśli mogę umieścić dokładnie te same punkty danych z błędami język pochodzenia 9 dostaję C = x0 = 99,41849 +/- 0,20283
i ponownie dokładnie te same dane na język C++ ROOT CERN C = 99,85 +/- 1.373
mimo że użyłem dokładnie tych samych zmiennych początkowych dla ROOT i Python. Origin nie potrzebuje żadnych.
Czy masz pojęcie, dlaczego tak się dzieje i jaki jest najlepszy wynik?
dodałem kod dla ciebie na pastebin:
Dziękujemy za pomoc!
EDIT: tutaj fabuła związana SirJohnFranklins postu:
Czy możesz na tym samym wykresie narysować pasowania i błędy uzyskane przez (1) 'scipy.odr' z błędami xi y oraz (2)' ROOT' z błędami xi y. Ponadto, w jaki sposób 'ROOT' określa względną wagę, która daje błędy xiy, biorąc pod uwagę, że są one mierzone w różnych jednostkach? W 'scipy.odr',' sx' i 'sy' są konwertowane na wagi, dzieląc 1.0 przez ich kwadraty - czy' ROOT' robi to samo? –