19

我正在使用numpy将一些 Matlab 代码转换为 python 。一切都很顺利,但最近我遇到了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代码

4

2 回答 2

23

这只是从 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])
于 2013-09-28T20:13:28.927 回答
10

fminsearch实现 Nelder-Mead 方法,参见Matlab文档: 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 方法。

这些名称并不总是直接从matlabto翻译scipy,有时甚至会产生误导。例如,布伦特的方法被实现为fminbndinMatlaboptimize.brentqin scipy。因此,检查文档字符串总是一个好主意。

于 2013-09-29T06:17:55.370 回答