如何强制scipy优化模块的功能同时取一个函数及其渐变

时间:2011-11-08 03:24:02

标签: python optimization scipy

我有一个相当复杂的函数f(x),我想优化,我正在使用Scipy的scipy.optimize模块中的fmin_bfgs函数。它迫使我分别给出函数最小化和渐变f'(x)的函数,这是一个遗憾,因为在评估函数f(x)时可以完成梯度的一些计算。

有没有办法结合这两种功能?我正在考虑保存两个函数所需的中间值,但我不知道fmin_bfgs函数是否保证f(x)在f'(x)之前得到评估。

谢谢

2 个答案:

答案 0 :(得分:4)

scipy.optimize.minimize方法有一个名为“jac”的参数。如果设置为True,则最小化将使可调用的f(x)都返回函数值及其导数。

答案 1 :(得分: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)