5

Estoy usando scipy.optimize.curve_fit, pero sospecho que está convergiendo a un mínimo local y no al mínimo global.SciPy curva global mínima encajar

He intentado utilizar el recocido simulado de la siguiente manera:

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

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

donde specf es la curva que estoy tratando de encajar. Sin embargo, los resultados en p son claramente peores que el mínimo devuelto por curve_fit, incluso cuando el valor de retorno indica que se alcanzó el mínimo global (see anneal).

¿Cómo puedo mejorar los resultados? ¿Hay un instalador de curva global en SciPy?

Respuesta

4

Tienes razón, solo converge hacia un mínimo local (cuando converge) ya que usa el algoritmo de Levenburg-Marquardt. No hay un instalador de curva global en SciPy, tiene que escribir su propia cuenta usando el existing global optimizers. Pero tenga en cuenta que esto todavía no tiene que converger al valor que desea. Eso es impossible en la mayoría de los casos.

El único método para mejorar su resultado es adivinar los parámetros de inicio bastante bien.

+0

Gracias por la respuesta. Me doy cuenta de los problemas en la optimización global, pero supongo (espero) que este contorno se comporte relativamente bien. ¿Mi enfoque al usar la norma L2 para medir la aptitud es correcto? – Gus

3

Es posible que desee intentar usar leastsq() (curve_fit realmente lo usa, pero no obtiene la salida completa) o ODR package en lugar de curve_fit.

La salida completa de leastsq() le proporciona mucha más información, como el valor cifrado (si desea usarlo como prueba de bondad de ajuste rápida y sucia).

Si tiene que ponderar el ajuste puede simplemente que de esta manera:

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

Este es un problema trivial. ¿Has considerado usar estrategias evolutivas? He tenido un gran éxito con ecspy (ver http://code.google.com/p/ecspy/) y la comunidad es pequeña pero muy útil.