Python &引用;牛顿CG法需要雅可比矩阵;当jac=False时,对未使用的雅可比矩阵进行近似时?

Python &引用;牛顿CG法需要雅可比矩阵;当jac=False时,对未使用的雅可比矩阵进行近似时?,python,scipy,Python,Scipy,我正在使用scipy.optimize.minimize进行优化,并尝试使用以下方法:“Newton CG”、“dogleg”和“trust ncg”。据我所知,对于这些方法,需要目标函数的雅可比矩阵。然而,这表明,如果jac设置为False,则将通过数值计算梯度 所以我试着像这样调用函数: scipy.optimize.minimize(fun,x0,method='Newton-CG',jac=False,options={'disp':True} 当我调用此命令时,会收到以下错误消息:

我正在使用scipy.optimize.minimize进行优化,并尝试使用以下方法:“Newton CG”、“dogleg”和“trust ncg”。据我所知,对于这些方法,需要目标函数的雅可比矩阵。然而,这表明,如果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')
令人惊讶的是,“无”是印刷的,不是假的!因此,我查看了调用函数,它位于/usr/lib/python2.7/dist-packages/scipy/optimize//u minimize.py中,我找到了将其设置为“无”的代码片段:

    if not callable(jac):
    if bool(jac):
        fun = MemoizeJac(fun)
        jac = fun.derivative
    else:
        jac = None
这就是为什么jac被设置为None的原因(尽管它似乎与文档中建议我将通过在原始函数调用中将jac设置为False来获得雅可比矩阵的数值近似值不兼容)


我错过了什么?我是否可以像上面使用Scipy计算雅可比矩阵的数值近似值那样调用“Newton CG”方法

根据我在SciPy的经验

SciPy文档提到的数值近似值是您在引用的代码中看到的“MemoizeJac”类。当未提供“jac”时,自动进行记忆。牛顿CG函数的文档中可能有一个错误,它告诉您将雅可比矩阵设置为“False”


只需设置jac=None或不提供jac参数,牛顿CG函数将使用梯度的数值近似值。

显然,三年后,缺陷仍然存在

对于Newton CG,最小值只取一个可调用的雅可比矩阵。获取一个的快速方法是使用
scipy.optimize.approx\u 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点”方法的实现方式。

表面扫描表明,
\u minimize\u newton\u cg
中缺少近似逻辑。因此,它可能是scipy代码库中的一个bug。不过,还不能完全确定。您可能想在github的scipy bug tracker中打开一个bug,或者希望Warren Weckesser神奇地出现:)我可能需要几年才能神奇地出现:)这看起来像是一个文档问题。看到后,我在github上为它创建了一个问题:“只需设置jac=None或不为jac提供参数…”您尝试过这个吗?您使用了哪个版本的scipy?它对我不起作用。[version Scipy 0.19.1]我再次查看了它,它显然是“Newton CG”方法的自定义行为。使用默认的“方法”时,代码工作正常。但是,当您仅删除“jac=False”时,错误消息会显示“牛顿CG方法需要雅可比矩阵”。我必须进一步研究它,以了解为什么雅可比矩阵的数值近似不适用于牛顿CG方法,但无论出于何种原因,它们似乎被禁用。