我有一个相当复杂的函数f(x),我想优化,我正在使用Scipy的scipy.optimize模块中的fmin_bfgs函数。它迫使我分别给出函数最小化和渐变f'(x)的函数,这是一个遗憾,因为在评估函数f(x)时可以完成梯度的一些计算。
有没有办法结合这两种功能?我正在考虑保存两个函数所需的中间值,但我不知道fmin_bfgs函数是否保证f(x)在f'(x)之前得到评估。
谢谢
答案 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)