我有一個相當複雜的函數f(x),我想優化,我使用scipy.optimize模塊中的fmin_bfgs函數來自Scipy。它迫使我給出最小化的函數和梯度f'(x)的函數,這是一個遺憾,因爲在評估函數f(x)時可以完成梯度的一些計算。如何強制scipy優化模塊的功能同時採取功能和其梯度
有沒有兩種功能結合的方式?我正在考慮保存這兩個函數所需的中間值,但我不知道fmin_bfgs函數是否保證f(x)先於f'(x)計算。
謝謝
我有一個相當複雜的函數f(x),我想優化,我使用scipy.optimize模塊中的fmin_bfgs函數來自Scipy。它迫使我給出最小化的函數和梯度f'(x)的函數,這是一個遺憾,因爲在評估函數f(x)時可以完成梯度的一些計算。如何強制scipy優化模塊的功能同時採取功能和其梯度
有沒有兩種功能結合的方式?我正在考慮保存這兩個函數所需的中間值,但我不知道fmin_bfgs函數是否保證f(x)先於f'(x)計算。
謝謝
您可以使用memoization緩存中間值。無論首先調用哪個函數,第二個函數都能夠利用memoized值。
cache={}
def expensive_calc(x):
# If x is a numpy array, you need to convert x into something hashable so it
# can be used as a key in cache.
key=tuple(x)
try:
return cache[key]
except KeyError:
# do expensive calc for result
cache[key] = result
return result
def func(x):
y=expensive_calc(x)
return something_based_on_y
def func_der(x):
y=expensive_calc(x)
return something_else_based_on_y
def optimize_fmin_bfgs():
xopt = fmin_bfgs(func, x_guess, fprime=func_der)
的scipy.optimize.minimize方法有一個名爲 「江淮」 參數。如果設置爲True,則最小化將期望可調用函數f(x)返回函數值及其導數。
很酷。 [看起來像設置'jac = True'使用緩存方法](https://github.com/scipy/scipy/blob/c96c5294ca73586cadd6f4c10f26b6be5ed35045/scipy/optimize/optimize.py#L53)在接受的答案中建議。 –