在 scipy.optimize.minimize 回调函数中访问 OptimizeResult

问题描述 投票:0回答:1

我正在尝试定义一个在优化时使用的回调函数。我只对每次迭代的当前目标函数值感兴趣。

文档表明,大多数优化方法,特别是 BFGS(我使用的方法),支持带有签名的回调函数

callback(OptimizeResult: intermediate_result)
。但尝试访问 middle_result 的 fun 属性会抛出 AttributeError。

使用签名

callback(xk)
效果很好,仅访问当前迭代的参数。但为了在每次迭代中获得目标的价值,我需要重新评估目标,这是不可取的。

如何在回调中返回每次迭代的目标值,而不需要对目标进行冗余函数评估?

python callback scipy-optimize scipy-optimize-minimize
1个回答
0
投票

如果您阅读了紧密链接的文档,它会说:

请注意,参数名称必须为

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)
© www.soinside.com 2019 - 2024. All rights reserved.