我正在使用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代码
答案 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.fmin。 fmin
也实现了Nelder-Mead方法。
这些名称并不总是直接从matlab
转换为scipy
,有时甚至会产生误导。例如,Brent的方法在fminbnd
中实现为Matlab
,而在optimize.brentq
中实现为scipy
。因此,检查doc字符串总是一个好主意。