2011-11-08 32 views
2

我有一個相當複雜的函數f(x),我想優化,我使用scipy.optimize模塊中的fmin_bfgs函數來自Scipy。它迫使我給出最小化的函數和梯度f'(x)的函數,這是一個遺憾,因爲在評估函數f(x)時可以完成梯度的一些計算。如何強制scipy優化模塊的功能同時採取功能和其梯度

有沒有兩種功能結合的方式?我正在考慮保存這兩個函數所需的中間值,但我不知道fmin_bfgs函數是否保證f(x)先於f'(x)計算。

謝謝

回答

1

您可以使用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) 
3

的scipy.optimize.minimize方法有一個名爲 「江淮」 參數。如果設置爲True,則最小化將期望可調用函數f(x)返回函數值及其導數。

+0

很酷。 [看起來像設置'jac = True'使用緩存方法](https://github.com/scipy/scipy/blob/c96c5294ca73586cadd6f4c10f26b6be5ed35045/scipy/optimize/optimize.py#L53)在接受的答案中建議。 –