首页 文章

当jac = False时,对Jacobian的近似值进行近似时,“Jacobian是Newton-CG方法所必需的”吗?

提问于
浏览
4

我'm doing an optimization with scipy.optimize.minimize, and attempting to use the following methods: ' Newton-CG ', ' dogleg ', and ' 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语句:

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/_minimize.py中,我找到了将其设置为None的代码片段:

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

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

我错过了什么?我是否有可能像上面用Scipy计算雅各比的数值近似来调用'Newton-CG'方法?

1 回答

  • 0

    根据我对SciPy的经验......

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

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

相关问题