【问题标题】:"Jacobian is required for Newton-CG method" when doing a approximation to a Jacobian not being used when jac=False?当 jac=False 时不使用雅可比时,“牛顿 CG 方法需要雅可比”?
【发布时间】:2016-02-28 19:47:09
【问题描述】:

我正在使用 scipy.optimize.minimize 进行优化,并尝试使用以下方法:“Newton-CG”、“dogleg”和“trust-ncg”。据我了解,对于这些方法,需要目标函数的雅可比。但是,documentation 建议如果 jac 设置为 False,则梯度将以数值计算。

所以我试图像这样调用函数:

scipy.optimize.minimize(fun,x0,method='Newton-CG',jac=False,options={'disp':True}

当我调用它时,我收到以下错误消息:

  File "/usr/lib/python2.7/dist-packages/scipy/optimize/optimize.py", line 1351, in _minimize_newtoncg
raise ValueError('Jacobian is required for Newton-CG method')

这很令人惊讶,因为我以为我只是将它设置为 False(如果 jac 设置为 None,则此异常仅发生在 */optimize.py 中)。于是我进入 /usr/lib/python2.7/dist-packages/scipy/optimize/optimize.py 看看函数

def _minimize_newtoncg(fun, x0, args=(), jac=None, hess=None, hessp=None,
                   callback=None, xtol=1e-5, eps=_epsilon, maxiter=None,
                   disp=False, return_all=False,
                   **unknown_options):

在这个函数的开头,我写了以下打印语句:

print (jac)
_check_unknown_options(unknown_options)
print(jac)
if jac is None:
    raise ValueError('Jacobian is required for Newton-CG method')

令人惊讶的是,打印的是“None”而不是 False!因此,我查看了 /usr/lib/python2.7/dist-packages/scipy/optimize/_minimize.py 中的调用函数,我找到了将其设置为 None 的代码 sn-p:

    if not callable(jac):
    if bool(jac):
        fun = MemoizeJac(fun)
        jac = fun.derivative
    else:
        jac = None

因此,为什么将 jac 设置为 None 是有道理的(尽管它似乎与建议我将通过在原始函数调用中将 jac 设置为 False 来获得 jacobian 的数值近似值的文档不兼容)。

我错过了什么?我是否可以像我在上面使用 Scipy 为我计算雅可比行列式的数值近似时那样调用“Newton-CG”方法?

【问题讨论】:

  • 表面扫描表明_minimize_newton_cg 中缺少近似逻辑。所以这可能是 scipy 代码库中的一个错误。不过,不完全确定。您可能想在 github 上的 scipy 错误跟踪器中打开一个错误,或者希望 Warren Weckesser 神奇地出现:)
  • 我可能需要几年时间才能神奇地出现 :) 这看起来像是一个文档问题。看到a new question related to this one后,我在github上为它创建了一个issue:github.com/scipy/scipy/issues/9042

标签: python scipy


【解决方案1】:

显然,三年后该错误仍然存​​在。

对于 Newton-CG,最小化器只需要一个可调用的雅可比行列式。一种快速获取方法是使用scipy.optimize.approx_fprime,如下所示:

# x0 is your initial guess.
fprime = lambda x: optimize.approx_fprime(x, f, 0.01)
result = optimize.minimize(f, x0, method = 'Newton-CG', jac = fprime)

据我了解,这应该是“2点”方法的实现方式。

【讨论】:

    【解决方案2】:

    根据我使用 SciPy 的经验...

    SciPy 文档所指的数值近似值是您在引用的代码中看到的“MemoizeJac”类。当没有提供“jac”时,记忆会自动发生。 Newton-CG 函数的文档中告诉您将 Jacobian 设置为“False”可能是一个错误。

    只需设置 jac=None 或不为 jac 提供参数,梯度的数值近似值将用于 Newton-CG 函数。

    【讨论】:

    • “只需设置 jac=None 或不为 jac 提供参数...” 你试过了吗?你用的是哪个版本的 scipy?它对我不起作用。
    • [version Scipy 0.19.1] 我再次查看它,这显然是“Newton-CG”方法的自定义行为。使用默认的“方法”时,代码可以正常工作。但是,当您只删除“jac=False”时,错误消息会显示“Newton-CG 方法需要 Jacobian”。我必须进一步研究它以了解为什么雅可比的数值近似不适用于 Newton-CG 方法,但无论出于何种原因,它们似乎被禁用。
    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 2022-01-20
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-09
    相关资源
    最近更新 更多