当jac = False时,对Jacobian的近似未使用时,“雅可比是牛顿 - CG方法所必需的”吗

时间:2015-11-25 21:02:40

标签: python scipy

我正在使用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语句:

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'方法?

2 个答案:

答案 0 :(得分:0)

根据我对SciPy的经验...

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

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

答案 1 :(得分:0)

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

对于Newton-CG,最小化器仅采用可调用的Jacobian。一种快速获取方法是使用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)

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