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コードを書くことができません
これは、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])
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
は、ネルダーミード法も実装しています。
名前は必ずしもmatlab
からscipy
に直接変換されるとは限らず、誤解を招くことさえあります。たとえば、ブレント法はfminbnd
ではMatlab
として実装されますが、scipy
ではoptimize.brentq
として実装されます。したがって、ドキュメント文字列を確認することは常に良い考えです。