【发布时间】: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