web-dev-qa-db-ja.com

matlabfminsearchのnumpy / scipyアナログ

Matlabコードをpython using numpy を使用して変換しています。すべてが非常にスムーズに機能しましたが、最近 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コードを書くことができません

17
Salvador Dali

これは、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])
19
pcoving

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は、ネルダーミード法も実装しています。

名前は必ずしもmatlabからscipyに直接変換されるとは限らず、誤解を招くことさえあります。たとえば、ブレント法はfminbndではMatlabとして実装されますが、scipyではoptimize.brentqとして実装されます。したがって、ドキュメント文字列を確認することは常に良い考えです。

9
CT Zhu