python - scipy.optimize.minimize 与 BFGS : Objective called twice with same parameter vector

标签 python optimization scipy numerical-methods scipy-optimize-minimize

我正在使用 scipy.optimize.minimize使用 method='bfgs' 训练凸目标。

每次运行最小化时,BFGS 优化器对我的目标函数进行的前两次调用始终具有相同的参数向量。这似乎是不必要的,因为它浪费了好几分钟时间重新计算同一件事两次。

最小工作示例(具有更简单的目标);

from scipy.optimize import minimize

def obj_jac(x):
    """Return objective value and jacobian value wrt. x"""
    print(x)
    return 10*x**2, 20*x

minimize(obj_jac, -100, method='bfgs', jac=True, tol=1e-7)

输出;

[-100.]
[-100.]
[-98.99]
[-94.95]
[-78.79]
[-30.17904355]
[-3.55271368e-15]

有谁知道这是否是 scipy 中 BFGS 实现的预期行为?


更新:我已将其提交为 issue #10385在 Scipy 项目上。

最佳答案

这不是预期的行为,或者至少存在报告错误。

通过options参数进行优化的统计输出:

minimize(obj_jac, -100, method='bfgs', jac=True, tol=1e-7, options={'disp': True})

SciPy 输出如下:

[-100.]
[-100.]
[-98.99]
[-94.95]
[-78.79]
[-30.17904355]
[-3.55271368e-15]
Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 3
         Function evaluations: 6
         Gradient evaluations: 6

报告的函数数量和梯度评估肯定相差一个。 因此,BFGS 的 SciPy 中肯定存在统计报告错误。

我还怀疑 SciPy 内部存在效率低下的问题,具体如下。在迭代循环之前,评估函数及其梯度。然后开始循环并从评估函数及其梯度开始。这将为第 0 次迭代添加一个额外的函数评估,当然可以通过轻微的代码重组来避免(可能需要权衡算法可读性流程)。

以下是相关的:

我不是 SciPy 方面的专家,我想说要么是突然冒出一个老错误(然后应该报告),要么一开始就没有修复,尽管我从 GitHub 的讨论中了解到。

关于python - scipy.optimize.minimize 与 BFGS : Objective called twice with same parameter vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56828860/

相关文章:

python - 属性错误 : 'module' object (scipy) has no attribute *** Why does this error occur?

python - Keras 预测一个数字,如果在一个范围内则通过

c++ - 极快is_iequal? (不区分大小写的相等比较)

python - 如何在 scipy.interpolate 中设置三次样条插值的第一个和最后一个斜率?

python - 将 Mayavi 鼠标拖动限制为绕其轴旋转地球

c++ - 编译器通常能够将多个连续的内存拷贝压缩为一个操作吗?

python - 如何在 Python 中就地解压列表或元组?

python - 使用opencv解析点云图像

python - 在python中,如何最好地插入给定变量路径和值的键:value to json,

c++ - SSE 舍入精度