5

Używam scipy.optimize.curve_fit, ale podejrzewam, że zbliża się do lokalnego minimum, a nie do globalnego minimum.SciPy globalna minimalna krzywa pasuje

Próbowałem za pomocą symulowanego wyżarzania w następujący sposób:

def fit(params): 
return np.sum((ydata - specf(xdata,*params))**2) 

p = scipy.optimize.anneal(fit,[1000,1E-10]) 

gdzie specf jest krzywa Staram się dopasować. Wyniki w p są jednak wyraźnie gorsze niż minimum zwracane przez curve_fit, nawet jeśli zwrócona wartość wskazuje, że osiągnięto globalne minimum (see anneal).

Jak mogę poprawić wyniki? Czy w grze SciPy istnieje globalny krzywa?

Odpowiedz

4

Masz rację, zbliża się tylko do lokalnego minimum (kiedy się konwerguje), ponieważ używa algorytmu Levenburg-Marquardt. W SciPy nie ma instalatora globalnej krzywej, musisz napisać własną, używając existing global optimizers. Ale pamiętaj, że to wciąż nie musi być zbieżne z pożądaną wartością. W większości przypadków jest to impossible.

Jedną z metod poprawy wyniku jest całkiem dobre odgadnięcie początkowych parametrów.

+0

Dzięki za odpowiedź. Zdaję sobie sprawę z problemów związanych z globalną optymalizacją, ale zgaduję (mając nadzieję), że ten kontur jest stosunkowo dobrze zachowany. Czy moje podejście do stosowania normy L2 do prawidłowego pomiaru sprawności? – Gus

3

Możesz spróbować użyć opcji leastsq() (curve_fit faktycznie używa tego, ale nie dostajesz pełnej wydajności) lub ODR package zamiast curve_fit.

Pełne wyjście minimumsq() daje o wiele więcej informacji, takich jak wartość chisquared (jeśli chcesz użyć tego jako szybkiego i brudnego testu dopasowania).

Jeśli trzeba ważyć dopasowanie można po prostu, że w ten sposób:

fitfunc = lambda p,x: p[0]+ p[1]*exp(-x) 
errfunc = lambda p, x, y, xerr: (y-fitfunc(p,x))/xerr 
out = leastsq(errfunc, pinit, args=(x,y, xerr), full_output=1) 
chisq=sum(infodict['fvec']*infodict['fvec']) 
1

jest to nietrywialne problem. Czy rozważałeś zastosowanie strategii ewolucyjnych? Miałem wielki sukces z ekspy (patrz http://code.google.com/p/ecspy/), a społeczność jest mała, ale bardzo pomocna.