当您想与目标函数一起计算梯度时,如何使用 scipy.optimize.minimize 函数?
Posted
技术标签:
【中文标题】当您想与目标函数一起计算梯度时,如何使用 scipy.optimize.minimize 函数?【英文标题】:How to use scipy.optimize.minimize function when you want to compute gradient along with the objective function? 【发布时间】:2016-10-10 14:33:21 【问题描述】:scipy.optimize.minimze
将 obj
和 jac
函数作为输入。我相信它会在需要时单独调用它们。但我们经常会遇到目标函数,其梯度计算与目标函数共享大量计算。所以理想情况下我想同时计算obj
和grad
。但是这个库似乎不是这种情况?如果还想用scipy.optimize.minimze
,有什么办法呢?
【问题讨论】:
【参考方案1】:你完全可以。只需使用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])
其实是documented:
jac : bool 或可调用,可选的 Jacobian (梯度) 目标 功能。仅适用于 CG、BFGS、Newton-CG、L-BFGS-B、TNC、SLSQP、dogleg、 信任-ncg。 如果 jac 是布尔值并且为 True,则假定 fun 返回 梯度和目标函数。如果为假,梯度 将被数值估计。 jac 也可以是可调用的返回 目标的梯度。在这种情况下,它必须接受相同的 争论很有趣。
(强调我的)
【讨论】:
感谢您指出这一点!从文档/示例中这并不是很明显,我觉得应该考虑到这是一个功能的重要性。 我同意文档不是 100% 清楚的。理想情况下,它应该说“fun 假定返回一个元组,第一个元素是函数值,第二个元素是梯度”以上是关于当您想与目标函数一起计算梯度时,如何使用 scipy.optimize.minimize 函数?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Security 自定义 Http 授权标头
当您想使用链接组件时,外部链接在 Next.js 中不起作用