nlaby / scipy模拟matlab的fminsearch

时间:2013-09-28 19:40:17

标签: python matlab numpy scipy

我正在使用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代码

2 个答案:

答案 0 :(得分:17)

这只是从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])

答案 1 :(得分:8)

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.fminfmin也实现了Nelder-Mead方法。

这些名称并不总是直接从matlab转换为scipy,有时甚至会产生误导。例如,Brent的方法在fminbnd中实现为Matlab,而在optimize.brentq中实现为scipy。因此,检查doc字符串总是一个好主意。