我正在尝试定义一个在优化时使用的回调函数。我只对每次迭代的当前目标函数值感兴趣。
文档表明,大多数优化方法,特别是 BFGS(我使用的方法),支持带有签名的回调函数:
callback(OptimizeResult: intermediate_result)
。但尝试访问 middle_result 的 fun 属性会抛出 AttributeError。
使用签名
callback(xk)
效果很好,仅访问当前迭代的参数。但为了在每次迭代中获得目标的价值,我需要重新评估目标,这是不可取的。
如何在回调中返回每次迭代的目标值,而不需要对目标进行冗余函数评估?
如果您阅读了紧密链接的文档,它会说:
请注意,参数名称必须为
,回调函数才能传递intermediate_result
。OptimizeResult
意思是,你不能将变量保留为
xk
并让它成为位置参数,它必须被称为intermediate_result
并且必须是关键字参数。在 Python 3 中,您可以通过将 *
作为第一个参数来强制函数参数成为关键字参数(相关堆栈溢出问题)。
from scipy.optimize import minimize, rosen
def callback(*, intermediate_result):
print(intermediate_result.fun)
x0 = [1.3, 0.7, 0.8, 1.9, 1.2]
res = minimize(rosen, x0, method="Nelder-Mead", tol=1e-6, callback=callback)