2013-09-28 214 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。所以,檢查文檔字符串總是一個好主意。