我正在使用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,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/_minimize.py中,我找到了将其设置为None的代码片段:
if not callable(jac): if bool(jac): fun = MemoizeJac(fun) jac = fun.derivative else: jac = None
因此,为什么将jac设置为None是有道理的(尽管它似乎与文档不兼容,表明我将通过在原始函数调用中将jac设置为False来获得jacobian的数值近似).
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。