Numpy/scipy аналог matlab fminsearch

Я преобразовываю некоторый код Matlab в python, используя numpy. Все работало довольно гладко, но в последнее время я столкнулся с функцией fminsearch.

Итак, чтобы сократить его: есть ли простой способ сделать в python что-то вроде этого:

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

который вернет

x = 1.0000    1.0000
fval = 8.1777e-010

До сих пор я не нашел ничего похожего на numpy. Единственное, что я нашел, это scipy.optimize.fmin. Основываясь на определении, он

Сведите к минимуму функцию с помощью алгоритма спуска влево.

Но прямо сейчас я не могу найти, чтобы написать вышеупомянутый код Matlab, используя эту функцию

Ответ 1

Это просто прямое преобразование из синтаксиса Matlab в синтаксис 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])

с выходом:

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

Ответ 2

fminsearch реализует метод Nelder-Mead, см. Matlab document: http://www.mathworks.com/help/matlab/ref/fminsearch.html. В справочном разделе.

Чтобы найти его эквивалент в scipy, вам просто нужно проверить строки документа методов, приведенных в scipy.optimize. См.: http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin.html#scipy.optimize.fmin. fmin также реализует метод Nelder-Mead.

Имена не всегда переводятся непосредственно из Matlab в scipy и иногда даже вводят в заблуждение. Например, метод Brent реализуется как fminbnd в Matlab, но optimize.brentq в scipy. Таким образом, проверка строк документа всегда хорошая идея.