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
. Таким образом, проверка строк документа всегда хорошая идея.