1

私は scipy.optimize.optimize のいくつかの関数に精通しており、過去に fmin_cg を使用して導関数を知っている関数を最小化しました。しかし、私は今、簡単に微分できない式を持っています。

そのモジュール内のいくつかの関数 (たとえば、fmin_cg) は、実際には導関数を提供する必要はありません。次に、各パラメーターに小さな値を順番に追加することにより、準導関数を計算すると思いますが、それは正しいですか?

私の主な質問は次のとおりです。特定の導関数を使用せずに複数のパラメーターで関数を最小化する場合、どの関数 (または他の場所の関数) を使用するのが最適ですか?

4

2 に答える 2

3

fmin_bfgs fmin_cg fmin_powellはい、次のいずれかを呼び出します

fmin_xx( func, x0, fprime=None, epsilon=.001 ... )

での勾配を推定x(func( x + epsilon I ) - func(x)) / epsilonます。
ただし、アプリケーションにとってどちらが「最適」かは、関数がどれだけ滑らかであるか、および変数の数に大きく依存します。
Plain Nelder-Mead, fmin, は良い最初の選択肢です。遅いですが確実です。残念ながら、scipy Nelder-Mead は、x のスケールに関係なく、固定サイズのシンプレックス .05 / .00025 から始まります。

fmin_tncinが良いと聞きましたscipy.optimize.tnc:

fmin_tnc( func, x0, approx_grad=True, epsilon=.001 ... )  or
fmin_tnc( func_and_grad, x0 ... )  # func, your own estimated gradient

(fmin_tnc は ~ fmin_ncg であり、制約がバインドされており、何が起こっているかを確認するための適切なメッセージであり、多少異なる引数です。)

于 2012-03-14T10:47:38.690 に答える
3

私は SciPy で利用できるものにあまり詳しくありませんが、Downhill Simplexメソッド (別名 Nelder-Mead または Amoeba メソッド) は多次元最適化によく機能します。

scipy のドキュメントを見るとminimize()、引数を使用して関数内のオプションとして使用できるようですmethod='Nelder-Mead'

線形計画法のシンプレックス (ダンツィヒ) アルゴリズムと混同しないでください...

于 2012-03-08T05:50:52.327 に答える