2013-09-28 169 views
12

我正在使用numpy将一些Matlab代码转换为python。一切工作都很顺利,但最近我遇到了fminsearch函数。numpy/scipy模拟matlab的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。基于它的定义

使用下坡单纯形算法最小化函数。

但是现在我无法找到使用此功能

回答

15

这是一个从Matlab的语法只是一个简单直接的转换为Python语法编写上述Matlab代码:

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]) 
8

fminsearch实现内尔德-米德法,见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,有时甚至会产生误导。例如,布伦特方法的实现为fminbnd,Matlab,但optimize.brentqscipy。所以,检查文档字符串总是一个好主意。