当你想要计算梯度和目标函数时,如何使用scipy.optimize.minimize函数?

Har*_*rma 9 python scipy scikit-learn

scipy.optimize.minimze接受objjac充当输入.我相信它会在需要时单独调用它们.但是,我们经常遇到目标函数,其梯度计算与目标函数共享大量计算.所以,我非常希望来计算obj,并grad同时进行.但这个图书馆的情况似乎并非如此?如果一个人仍然想要使用它,那么处理它的方法scipy.optimize.minimze是什么?

ev-*_*-br 14

你完全可以.只需使用jac=True:

In [1]: import numpy as np

In [2]: from scipy.optimize import minimize

In [3]: def f_and_grad(x):
   ...:     return x**2, 2*x
   ...: 

In [4]: minimize(f_and_grad, [1], jac=True)
Out[4]: 
      fun: 1.8367099231598242e-40
 hess_inv: array([[ 0.5]])
      jac: array([  2.71050543e-20])
  message: 'Optimization terminated successfully.'
     nfev: 4
      nit: 2
     njev: 4
   status: 0
  success: True
        x: array([  1.35525272e-20])
Run Code Online (Sandbox Code Playgroud)

它实际上记录在案:

jac:bool或callable,可选雅可比(渐变)的目标函数.仅适用于CG,BFGS,Newton-CG,L-BFGS-B,TNC,SLSQP,dogleg,trust-ncg.如果jac是布尔值并且为True,则假定fun会返回梯度以及目标函数.如果为False,将以数字方式估计梯度.jac也可以是一个可调用的,返回目标的梯度.在这种情况下,它必须接受与fun相同的参数.

(强调我的)

  • 我同意文档不是 100% 清楚的。理想情况下,它应该说“假设有趣返回一个元组,其中第一个元素是函数值,第二个元素是梯度” (3认同)
  • 感谢您指出这一点!从文档/示例中并不是很明显,我觉得应该给出这个功能的重要性。 (2认同)