2016-07-29 4 views
2

時間がかかりすぎていると最小化が完了します私は1に対する耐性を減らす場合は、実行するために30分以上....は、私は約1500の変数と制約付き最適化問題を実行しています

を取っています約5分で、それは物事をスピードアップする良い方法のようには思われません。

from scipy.optimize import minimize 

results = minimize(objFun, initialVals, method='SLSQP', bounds = bnds, constraints=cons, tol = toler) 

print(results) 

fun: -868.72033130318198 
jac: array([ 0., 0., 0., ..., 0., 0., 0.]) 
message: 'Optimization terminated successfully.' 
nfev: 1459 
nit: 1 
njev: 1 
status: 0 
success: True 
x: array([ 0., 0., 0., ..., 1., 1., 1.]) 

いずれかの提案があります。

+0

ステップサイズ/有限差分派生イプシロンを増やしてみましたか?時には、小さすぎると進歩はほとんどないでしょうが、これは問題に依存します(滑らかさは大きな要因です)。また、他のオプティマイザを試すこともできます。 – sascha

+0

1回の反復だけが必要ですか?あなたは幸せでなければなりません。あなたは勾配を与えなかったように見えるので、ソルバは有限の違いを示しました。あなたの関数は高価で評価され、利用可能な勾配がないため、この問題はこのソルバにはあまり適していません。派生フリーソルバを見る必要があるかもしれません。 –

+0

非線形方程式で動作する他の制約付き最適化ライブラリがPython用にありますか?私は何も見ていない。 –

答えて

2

は、ここで私がしたいものです。

  • が最小化をプロファイリング。あなたの出力からは、関数の評価がボトルネックだと思われます。そうであるかどうかを確認してください。それがある場合は、:あなたは紙と鉛筆またはCASシステムでヤコビアンを計算することができるかどう
  • を参照してください。有限差分の代わりに使用してください。
  • あなたは関数自体をスピードアップすることができればあなたの許容範囲は何が必要許容範囲に設定する必要があります(数学の単純化、numpyのベクトル化、cython)
4

参照してください。それをより高く設定すると、オプティマイザはより早く停止するように指示し、実際には高速化しません。言われているように、それはより大きいtollerenceに行くことを許可することはあなたの時間の無駄かもしれない必要がない場合。次のように必要な時間を短縮する

可能な方法があります。

  • は、デザインの数を減らし
  • スピードアップあなたの目的関数を
  • 異なる勾配発見方法を使用し
  • 異なるオプティマイザを使用します変数
  • より良い初期推測を選択する
  • 並列処理を使用

グラデーション方法

あなたは有限差分を使用しているとして、あなたは合計感度を得るためにあなたの目的関数の(1 +設計変数の数)の評価を必要としています。

ev-brと述べたように、ジャコビアンの解析ソリューションを見つけることができれば、これは必要ありません。実際には、1500の設計変数があります。あなたの目的関数が許せば、自動微分がオプションになるかもしれませんが、これは簡単ではないと推測しています。 Ivはあなたが見ることができるAlgoPyの経験がありました。目的関数評価の高い数に起因

目的関数速度

は、これが最も簡単な手法であってもよいです。もう一度、cythonを使用してコンパイルするなどのためのev-brの答えと一般的な複雑さの軽減を参照してください。 timeitを使用してコードの一部を実行してみると、変更が有益かどうか確認できます。

設計変数設計変数の数を減らす

直線有限差分のために必要な目的関数の呼び出しを低下させます。すべての変数が大幅に変更されますか?いくつかは設定値で修正できますか?あなたは他の人の機能としていくつかを引き出すことができますか?

初期推定

あなたの問題によって、あなたはあなたのオプティマイザは、最終的な解決策に「近い」であることを意味しますより良い出発点を選択することができます。問題によっては、前回の結果から最適化を再開することもできます。

並列化

有限差分評価は、あなたがあなた自身の有限差分関数を記述し、その後multiprocessingクラスを使用して並列で呼び出しを実行することができるように順番に行う必要はありません。これの有効性は、利用可能なシステムとコア数に基づいています。

+0

AlgoPyで生成された派生物を最小化関数に組み込む方法は?私の最初の私の最初の推測はかなり良いですが、ジャコビーンを別々に計算するのが最善の選択肢のようです。私は多分変数の数を減らすことができるので、私はそれについても見ていきます。 –

+0

それはおそらくそれ自身の質問に最も適していますが、私はしばらくそれを使用していましたが、一般的に、自動微分は実際にはシンボリック/コード化微分関数を生成するのではなく、与えられた入力を使って、元の機能だから私はあなたのグラジエント関数は目的関数を使用する自動difコードのラッパーになると思います。 – Wokpak

+0

私は手で導関数を計算し、それぞれの点でヤコビ行列を返す関数に入れました...その仕組みを見ていきます。 –

関連する問題