如何强制scipy优化模块的函数同时接受函数及其梯度
我有一个比较复杂的函数 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)