SciPy глобальное минимальное соответствие кривой - PullRequest
6 голосов
/ 22 марта 2011

Я использую scipy.optimize.curve_fit, но подозреваю, что он приближается к локальному минимуму, а не к глобальному минимуму.

Я пытался использовать имитацию отжига следующим образом:

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

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

где specf - это кривая, которую я пытаюсь подогнать. Результаты в p явно хуже, чем минимум, возвращаемый curve_fit, даже если возвращаемое значение указывает, что достигнут глобальный минимум ( см. Отжиг ).

Как я могу улучшить результаты? Есть ли в SciPy глобальный установщик кривых?

Ответы [ 3 ]

6 голосов
/ 22 марта 2011

Вы правы, он сходится только к локальному минимуму (когда сходится), поскольку использует алгоритм Левенбурга-Марквардта.В SciPy нет глобального адаптера кривой, вы должны написать свой собственный, используя существующих глобальных оптимизаторов .Но имейте в виду, что это все равно не должно сходиться с тем значением, которое вы хотите.Это невозможно в большинстве случаев.

Единственный способ улучшить ваш результат - достаточно хорошо угадать начальные параметры.

3 голосов
/ 22 марта 2011

Возможно, вы захотите попробовать leastsq () (на самом деле это используется Curve_fit, но вы не получите полный вывод) или пакет ODR вместо Curve_fit.

Полный вывод leastsq () дает вам гораздо больше информации, например, значение в числовом выражении (если вы хотите использовать его в качестве быстрого и грязного теста на соответствие).

Если вам нужно взвесить форму, вы можете сделать это следующим образом:

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 голос
/ 13 апреля 2011

Это нетривиальная проблема. Рассматривали ли вы использовать эволюционные стратегии? У меня был большой успех с ecspy (см. http://code.google.com/p/ecspy/), и сообщество небольшое, но очень полезное.

...