別のプログラムが計算する入力データ [パラメーター] を生成するスクリプトを作成しています。結果のデータを最適化したいと思います。以前は、numpy powell 最適化を使用していました。擬似コードは次のようになります。
def value(param):
run_program(param)
#Parse output
return value
scipy.optimize.fmin_powell(value,param)
これはうまくいきます。ただし、プログラムの反復ごとに実行に数日かかる場合があるため、非常に低速です。私がやりたいのは、これを粗粒度で並列化することです。そのため、一度に 1 つの反復を実行する代わりに、(パラメーターの数)*2 ずつ実行します。例えば:
Initial guess: param=[1,2,3,4,5]
#Modify guess by plus minus another matrix that is changeable at each iteration
jump=[1,1,1,1,1]
#Modify each variable plus/minus jump.
for num,a in enumerate(param):
new_param1=param[:]
new_param1[num]=new_param1[num]+jump[num]
run_program(new_param1)
new_param2=param[:]
new_param2[num]=new_param2[num]-jump[num]
run_program(new_param2)
#Wait until all programs are complete -> Parse Output
Output=[[value,param],...]
#Create new guess
#Repeat
変数の数は 3 ~ 12 の範囲である可能性があるため、このようなものを使用すると、1 年かかっていたコードが 1 週間に短縮される可能性があります。すべての変数は互いに依存しており、最初の推測から極小のみを探しています。ヘッセ行列を使用した実装を開始しました。ただし、それはかなり複雑です。これを行うもの、より簡単な方法、または開始するための提案はありますか?
したがって、主な質問は次のとおりです。最初の推測を取り、複数の推測を生成し、それらの複数の推測を使用して新しい推測を作成し、しきい値が見つかるまで繰り返すアルゴリズムはありますか? 分析導関数のみが利用可能です。これについての良い方法は何ですか、これを行うためにすでに構築されたものはありますか、他のオプションはありますか?
お時間をいただきありがとうございます。
小さな更新として、各次元の 3 点を通る単純な放物線を計算し、最小値を次の推測として使用することで、これを機能させています。これは適切に機能しているように見えますが、最適ではありません。私はまだ追加のオプションを探しています。
現在の最良の実装は、パウエルの方法の内側のループを並列化することです。
コメントありがとうございます。残念ながら、この特定の問題に対する簡潔な答えはないようです。これを実行する何かを実装する場合は、ここに貼り付けます。ただし、プロジェクトは特に重要ではないか、結果を急ぐ必要がないため、しばらくの間、ノードを取り上げることに満足するでしょう.