análogo numpy / scipy del fminsearch de matlab

Estoy convirtiendo algo de código de Matlab en python usando numpy . Todo funcionó bastante bien, pero recientemente encontré la función fminsearch .

Entonces, para abreviar: ¿hay una manera fácil de hacer en python algo como esto:

banana = @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2; [x,fval] = fminsearch(banana,[-1.2, 1]) 

que volverá

 x = 1.0000 1.0000 fval = 8.1777e-010 

Hasta ahora no he encontrado nada que se vea similar en numpy. Lo único que encontré similar es scipy.optimize.fmin . Basado en la definición que

Minimiza una función usando el algoritmo simplex de descenso.

Pero en este momento no puedo encontrar para escribir el código Matlab mencionado anteriormente utilizando esta función

Es solo una conversión directa de la syntax de Matlab a la syntax de python:

 import scipy.optimize banana = lambda x: 100*(x[1]-x[0]**2)**2+(1-x[0])**2 xopt = scipy.optimize.fmin(func=banana, x0=[-1.2,1]) 

con salida:

 Optimization terminated successfully. Current function value: 0.000000 Iterations: 85 Function evaluations: 159 array([ 1.00002202, 1.00004222]) 

fminsearch implementa el método Nelder-Mead, consulte el documento Matlab : http://www.mathworks.com/help/matlab/ref/fminsearch.html . En la sección de referencia.

Para encontrar su equivalente en scipy , solo necesita verificar las cadenas de documentación de los métodos proporcionados en scipy.optimize . Consulte: http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin.html#scipy.optimize.fmin . fmin también implementa el método Nelder-Mead.

Los nombres no siempre se traducen directamente de matlab a scipy y, en ocasiones, son incluso engañosos. Por ejemplo, el método de Brent se implementa como fminbnd en Matlab pero optimize.brentq en scipy . Por lo tanto, comprobar las cadenas de documentos siempre es una buena idea.