私は制約と上限/下限で非lenear最適化問題があるので、scipyではSLSQPを使用する必要があります。問題は明らかに凸ではありません。 私は、目的関数と制約関数の両方が正常に動作するようにjacobian foを得ました(結果は300入力ベクトルまでは良い/高速です)。すべての機能はベクトル化され、非常に高速に動作するように調整されています。問題は、1000+入力ベクトルの使用には年齢がかかることですが、ミニマイザが私の関数を多く呼び出すのではなく(客観的/制約/勾配)、処理時間の大半を内部的に費やしているようです。私はSLSQPのどこかのパーセンテージをO(n^3)と読んでいます。scipy.optimize.minimize( 'SLSQP')2000 dim変数を与えたときに処理が遅すぎる
Pythonのこのタイプの問題に対して、より優れた/高速のSLSQP実装や別の方法がありますか?私はnloptを試して、何とか私がscipyで使っているのと全く同じ関数(メソッドのシグネチャに適応するためのラッパーを使って)を指定すると、間違った結果を返す。私もpyoptoptパッケージでipoptを使用するのに失敗しました、pythonラッパーで動作するipoptバイナリを得ることができません。
UPDATE:私の入力変数は、基本的に(x、y)タプルのベクトル、または座標を表す2Dサーフェスの点です。 1000ポイントで、私は2000年の暗い入力ベクトルで終わる。私が最適化したい機能は、それらの関係と他の制約を考慮して、お互いの間のポイントの最適な位置を計算します。だから問題は疎ではありません。
おかげで...
Sandiaにはdakota(https://dakota.sandia.gov/)の最適化ソルバーがあります。 DakotaはPythonとインターフェースできます。つまり、パラメータをPythonからDakotaに渡して結果を返すことができます。ここにダコタについての要約に[link](https://dakota.sandia.gov/content/about)があります。 – dustin
また、SLSQPがBFGSを内部的に使用していることも確信しています。これは、20000 * 20000を使用するN * Nのサイズの行列を使用して、各繰り返しで重い計算(少なくとも行列ベクトル)を行うことを意味します。 – sascha