最小化の問題とそのヤコビ行列の制約と、ヤコビ行列をほとんど無料で得る点。計算を共有する方法はありますか?scipy.optimize.minimize、制約とそれらのヤコビアンを一度に計算する
答えて
制約とヤコビアンは常に評価されるとは限らないので、ほんの少しの改善しか期待できません。しかし、あなたは別の関数/メソッドに一般的な計算を置くことができる場合は、後でそれらを再計算する必要がないように、あなたはその戻り値をcacheことができます。
import scipy.optimize as opt
from functools import lru_cache
# only for the dummy example:
import scipy as sp
from time import sleep
def cost(x):
'''dummy cost function to minimize on [1,11]'''
return sp.log(x)
@lru_cache(maxsize=None) # careful with this choice
def heavy_stuff(x):
'''idle computation representing common work in constraint and jacobian'''
sleep(0.1)
return 0
def constraint(x):
'''constraint for [1,11], with simulated idle work'''
# the following only works for 1d arrays, needs more work for nd
throwaway = heavy_stuff(tuple(x))
return 5 - abs(6 - x) # non-negative between 1 and 11
def jacobian(x):
'''return the jacobiam with the same simulated idle work'''
throwaway = heavy_stuff(tuple(x))
return 1/x
x0 = 11
tol = 0
opts = {'disp': True}
cons = {'type': 'ineq', 'fun': constraint}
kwargs = {'method':'SLSQP', 'constraints': cons,
'jac': jacobian, 'tol': tol, 'options': opts}
res = opt.minimize(cost,x0,**kwargs)
print(heavy_stuff.cache_info())
上log(x)
を最小化しようとする試み上記のダミーの例は、区間[1,11]
。一定の境界の代わりに私は間隔を与える制約を定義したので、あなたの質問に関して私が意味することを示すことができます。
constraint
とjacobian
は同じ作業を行いますが、これは同じ引数で複数の評価が行われた場合に備えておきたいことです。これらの共通の計算をすべて共通の関数(ここではheavy_stuff
)に入れ、戻り値をconstraint
とjacobian
の両方で使用する必要があります。
重いものをメモするには、functools.lru_cache
を使用する必要があります。適切なキャッシュサイズを設定することにより、複数の評価heavy_stuff
が同じx
になると、計算をやり直すことなく、以前に計算された戻り値が一度に得られます。
私の疑惑が正しい場合はmaxsize=1
で、おそらくlru_cache
デコレータで十分です。 maxsize=None
(上限なし)を設定すると、正当な理由であまりにも多くのメモリを失う危険があります。あなたは実験して、複数のメモ化された値が必要かどうか、またはいくつかの唯一の値が十分かどうかを確認する必要があります。
ただし、lru_cache
は、キーが装飾された関数の入力パラメータである以前に計算された結果を検索するためにdictを使用することに注意してください。これは、入力引数がハッシュ可能でなければならないことを意味します。これは実際には不変でなければならないことを意味します。ナンシー配列はリストと非常によく似ていて、同様にではなく、ハッシュ可能です。このため、heavy_stuff
をtuple(x)
と呼びます.1dの配列入力はタプルに変換されます。 x
が多次元配列である場合、入れ子の各レベルはタプルに変換する必要があります。さらに悪いことに、heavy_stuff
は、タフプルをnumpy ndarraysに変換して、重い作業を行う必要があります。しかし、ジャコビー/コンストレインを計算するのが実際にこのCPUを大量に使用する場合は、おそらく全体的にはまだ良いでしょう。
キャッシュのパフォーマンスを評価する場合は、末尾にheavy_stuff.cache_info()
が表示されます。キャッシュされた値が使用された頻度、および新しい値が何回計算されなければならなかったかを示します。
- 1. fminconの目的関数と制約関数の単一計算
- 2. なぜekf-slamのヤコビアンを計算するのですか
- 3. 制約のある最適化をscipy.optimize.minimizeに変える?
- 4. Scipy.optimize.minimize method = 'SLSQP'は制約を無視します
- 5. scipy.optimize.minimize Pythonの制約最適化のため
- 6. 与えられた角度のベジェ曲線制御点を計算する
- 7. タイムテーブルの制約を計算するためのアルゴリズム
- 8. UITableViewCell - UITextViewに制約を追加する前にheightForRowAtIndexが計算されます
- 9. 最小化制約を持つ方程式系(scipy.optimize.minimize)
- 10. ベアリングと距離から緯度と経度を計算する
- 11. 'y'方向に約 'x' mtsの点の経度と緯度の計算
- 12. minとmaxを計算してそれらを削除する
- 13. グラフと制約の一致
- 14. SQL - のみUNIQUEまたはPRIMARY KEY制約が計算列に
- 15. リストの長さをループの前に一度計算するのは、ループの中でそれを再計算するよりも速いのですか?
- 16. プライマリキー制約とテーブルの同じ列に定義された一意制約
- 17. 方向変更のSnapKit制約を再計算
- 18. 計算プロパティは、一度だけ
- 19. 重心と精度を計算する
- 20. 速度を計算する
- 21. 速度から角度の方向を計算する
- 22. 緯度と経度からの計算画面の位置
- 23. Java:それらに複数の一般的な "制約"がある変数を宣言する
- 24. カメラの角度と位置をOpenCVと一致させて計算する
- 25. 緯度/経度を計算する
- 26. xとyの速度から方向の角度を計算する
- 27. Android加速度計の角度計算
- 28. リコールと精度からAUCを計算する
- 29. 2点と方向ベクトルから角度を計算する
- 30. タプルリレーショナル計算に "のみ" を理解しようとすると、 "すべて" 制約
例を追加できますか? – Cleb
関数はPythonのファーストクラスの市民であるため、jacobianとconstraintの両方を扱う関数を定義し、共通のものを格納するためにインスタンス属性を使用することができます。しかし、あなたは何とか最初に呼び出されたものを何とか処理しなければならないでしょう。たぶん 'コールバック 'でフラグを設定するのでしょうか?私は唯一推測している、私は遠く離れた何かをしたことはない。 –