2013-09-28 16 views
12

Ich konvertiere etwas Matlab-Code in Python mit numpy. Alles funktionierte ziemlich reibungslos, aber kürzlich stieß ich auf fminsearch Funktion.numpy/scipy analog von Matlabs fminsearch

Also, um es kurz zu schneiden: Gibt es eine einfache Möglichkeit, in Python, so etwas zu machen:

banana = @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2; 
[x,fval] = fminsearch(banana,[-1.2, 1]) 

die

x = 1.0000 1.0000 
fval = 8.1777e-010 

Bis jetzt zurückkehren ich nichts gefunden zu haben, sieht in Anzahl ähnlich aus. Das einzige, was ich ähnlich fand, ist scipy.optimize.fmin. Basierend auf der Definition

Minimieren Sie eine Funktion mit dem Downhill-Simplex-Algorithmus.

Aber jetzt kann ich nicht finden, die oben erwähnte Matlab-Code mit dieser Funktion

Antwort

15

Es ist nur eine Straight-Forward-Konvertierung von Matlab-Syntax Python-Syntax schreiben:

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

mit Ausgang:

Optimization terminated successfully. 
     Current function value: 0.000000 
     Iterations: 85 
     Function evaluations: 159 
array([ 1.00002202, 1.00004222]) 
8

fminsearch das Nelder-Mead-Verfahren implementiert, siehe Matlab Dokument: http://www.mathworks.com/help/matlab/ref/fminsearch.html. Im Referenzabschnitt.

Um das Äquivalent in scipy zu finden, müssen Sie nur die Doc-Strings der Methoden in scipy.optimize überprüfen. Siehe: http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin.html#scipy.optimize.fmin. fmin implementiert auch Nelder-Mead-Methode. Die Namen übersetzen nicht immer direkt von matlab zu scipy und sind manchmal sogar irreführend. Zum Beispiel ist das Brent-Verfahren implementiert als fminbnd in Matlab, aber optimize.brentq in scipy. Daher ist es immer eine gute Idee, die Doc-Strings zu überprüfen.