2013-06-28 14 views
5

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: see comment below

+0

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

Odpowiedz

1

Czy rzeczywiście spróbować wykreślenie ODR i leastsq pasuje obok siebie? Wyglądają w zasadzie identyczna:

enter image description here

Zastanów się, co parametry odpowiadają - funkcja kroku opisanego przez beta[0] i beta[1], początkowych i końcowych wartości, wyjaśnia zdecydowanie większości wariancji danych.Natomiast niewielkie zmiany w beta[2] i beta[3], punkcie przegięcia i nachyleniu, będą miały stosunkowo niewielki wpływ na ogólny kształt krzywej, a zatem wariancję resztkową dopasowania. Nic więc dziwnego, że parametry te mają wysokie błędy standardowe i są nieco inaczej dopasowane przez te dwa algorytmy.

Ogólne większe błędy standardowe zgłaszane przez ODR wynikają z faktu, że model ten zawiera błędy w wartościach y, podczas gdy zwykłe dopasowanie najmniejszych kwadratów nie powoduje - błędy w zmierzonych wartościach y powinny zmniejszyć naszą pewność szacunkowe parametry dopasowania.

0

(Niestety, nie mogę wgrać pasuje, bo potrzebują więcej reputacji. Dam działkę kapitanowi Sandwich, więc może on przesłać go do mnie.)

jestem w tym samym grupa robocza jako osoba, która rozpoczęła wątek, ale zrobiłem ten wątek.

Dodałem więc błędy X do danych, ponieważ nie byłem tak daleko po raz ostatni. Błąd uzyskany za pośrednictwem ODR jest nadal absurdalnie wysoki (4,18550164e + 04 na beta [2]). W wątku pokażę ci, co daje FIT z [ROOT Cern] [2], teraz z błędem xiy. Tutaj x0 jest wersją beta [2].

Czerwona i zielona krzywa mają inną wersję beta, lewa minus błąd dopasowania 3.430 uzyskany przez ROOT, a prawy plus błąd. Myślę, że ma to sens, o wiele więcej, niż błąd 0,2 podany przez dopasowanie Origin 9 (który może obsługiwać błędy y, jak sądzę) lub błąd około 40k podawany przez ODR, który obejmuje również xiy błędy.

Być może, ponieważ ROOT jest wykorzystywany głównie przez astrofizyków, którzy potrzebują bardzo rygorystycznych algorytmów dopasowania, radzi sobie z trudniejszymi dopasowaniami, ale nie wiem wystarczająco dużo o solidności algorytmów dopasowania.

+0

Naprawdę nie sądzę, że jest jakikolwiek problem z solidnością pasowań - wszystkie różne algorytmy, które wypróbowałeś, wydają się dawać rozsądne szacunki dla parametrów modelu. Jedyne pytanie w moim umyśle dotyczy raportowania przez ODR standardowych błędów w parametrach dopasowania. –

Powiązane problemy