如何强制scipy优化模块的函数同时接受函数及其梯度

3 投票
2 回答
868 浏览
提问于 2025-04-17 05:50

我有一个比较复杂的函数 f(x),我想对它进行优化,所以我在使用 Scipy 里的 fmin_bfgs 函数。这个函数要求我分别提供要最小化的函数和它的梯度函数 f'(x),这让我觉得有点麻烦,因为计算梯度时,有些步骤可以在计算 f(x) 的时候一起完成。

有没有办法把这两个函数合并起来呢?我考虑过保存一些中间值,这样两个函数都能用到,但我不确定 fmin_bfgs 函数是否保证在计算 f'(x) 之前一定会先计算 f(x)。

谢谢!

2 个回答

5

scipy.optimize.minimize这个方法里有一个参数叫“jac”。如果把它设置为True,minimize就会期待你提供的函数f(x)不仅返回函数的值,还要返回它的导数。

3

你可以使用记忆化来缓存中间值。无论先调用哪个函数,第二个函数都能利用已经缓存的值。


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)  

撰写回答