fmin_cg#
- scipy.optimize.fmin_cg(f, x0, fprime=None, args=(), gtol=1e-05, norm=inf, epsilon=np.float64(1.4901161193847656e-08), maxiter=None, full_output=0, disp=1, retall=0, callback=None, c1=0.0001, c2=0.4)[source]#
使用非线性共轭梯度算法最小化函数。
- 参数:
- f可调用,
f(x, *args)
要最小化的目标函数。此处 x 必须是一个一维数组,包含在搜索最小值时需要改变的变量,而 args 则是 f 的其他(固定)参数。
- x0ndarray
用户提供的 xopt(x 的最优值)的初始估计。它必须是一个值的一维数组。
- fprime可调用,
fprime(x, *args)
, 可选 一个函数,返回 f 在 x 处的梯度。此处 x 和 args 的描述与 f 相同。返回值必须是一个一维数组。默认为 None,此时梯度将通过数值方式近似(参见下方的 epsilon)。
- args元组, 可选
传递给 f 和 fprime 的参数值。当需要额外的固定参数来完全指定函数 f 和 fprime 时,必须提供此参数。
- gtol浮点数, 可选
当梯度的范数小于 gtol 时停止。
- norm浮点数, 可选
用于梯度范数的阶次(
-np.inf
表示最小值,np.inf
表示最大值)。- epsilon浮点数或 ndarray, 可选
当 fprime 通过数值方式近似时使用的步长。可以是标量或一维数组。默认为
sqrt(eps)
,其中 eps 是浮点机器精度。通常sqrt(eps)
大约是 1.5e-8。- maxiter整数, 可选
要执行的最大迭代次数。默认为
200 * len(x0)
。- full_output布尔值, 可选
如果为 True,除了 xopt 之外,还返回 fopt、func_calls、grad_calls 和 warnflag。有关可选返回值的更多信息,请参阅下面的“返回值”部分。
- disp布尔值, 可选
如果为 True,则返回一个收敛消息,后跟 xopt。
- retall布尔值, 可选
如果为 True,则在返回值中添加每次迭代的结果。
- callback可调用, 可选
一个可选的用户提供函数,在每次迭代后调用。调用形式为
callback(xk)
,其中xk
是 x0 的当前值。- c1浮点数, 默认: 1e-4
Armijo 条件规则的参数。
- c2浮点数, 默认: 0.4
曲率条件规则的参数。
- f可调用,
- 返回值:
- xoptndarray
使 f 最小化的参数,即
f(xopt) == fopt
。- fopt浮点数, 可选
找到的最小值,f(xopt)。仅当 full_output 为 True 时返回。
- func_calls整数, 可选
函数调用次数。仅当 full_output 为 True 时返回。
- grad_calls整数, 可选
梯度调用次数。仅当 full_output 为 True 时返回。
- warnflag整数, 可选
带有警告状态的整数值,仅当 full_output 为 True 时返回。
0 : 成功。
1 : 超过最大迭代次数。
- 2梯度和/或函数调用没有变化。可能表明
精度已丢失,即例程未收敛。
3 : 遇到 NaN 结果。
- allvecsndarray 列表, 可选
数组列表,包含每次迭代的结果。仅当 retall 为 True 时返回。
另请参阅
minimize
所有
scipy.optimize
算法(用于无约束和有约束的多元函数最小化)的通用接口。它提供了调用fmin_cg
的另一种方式,即通过指定method='CG'
。
备注
该共轭梯度算法基于 Polak 和 Ribiere 的算法 [1]。
共轭梯度方法在以下情况下效果更好:
f 具有唯一的全局最小点,并且没有局部最小值或其他驻点,
f 至少在局部范围内,可以被变量的二次函数合理地近似,
f 是连续的并且具有连续梯度,
fprime 不会太大,例如,其范数小于 1000,
初始猜测 x0 合理地接近 f 的全局最小点 xopt。
参数 c1 和 c2 必须满足
0 < c1 < c2 < 1
。参考文献
[1]Wright & Nocedal, “数值优化”, 1999, 第 120-122 页。
示例
示例 1:寻找表达式
a*u**2 + b*u*v + c*v**2 + d*u + e*v + f
的最小值,给定参数值和初始猜测(u, v) = (0, 0)
。>>> import numpy as np >>> args = (2, 3, 7, 8, 9, 10) # parameter values >>> def f(x, *args): ... u, v = x ... a, b, c, d, e, f = args ... return a*u**2 + b*u*v + c*v**2 + d*u + e*v + f >>> def gradf(x, *args): ... u, v = x ... a, b, c, d, e, f = args ... gu = 2*a*u + b*v + d # u-component of the gradient ... gv = b*u + 2*c*v + e # v-component of the gradient ... return np.asarray((gu, gv)) >>> x0 = np.asarray((0, 0)) # Initial guess. >>> from scipy import optimize >>> res1 = optimize.fmin_cg(f, x0, fprime=gradf, args=args) Optimization terminated successfully. Current function value: 1.617021 Iterations: 4 Function evaluations: 8 Gradient evaluations: 8 >>> res1 array([-1.80851064, -0.25531915])
示例 2:使用
minimize
函数解决相同的问题。(这个 myopts 字典显示了所有可用选项,尽管在实践中只需要非默认值。返回值将是一个字典。)>>> opts = {'maxiter' : None, # default value. ... 'disp' : True, # non-default value. ... 'gtol' : 1e-5, # default value. ... 'norm' : np.inf, # default value. ... 'eps' : 1.4901161193847656e-08} # default value. >>> res2 = optimize.minimize(f, x0, jac=gradf, args=args, ... method='CG', options=opts) Optimization terminated successfully. Current function value: 1.617021 Iterations: 4 Function evaluations: 8 Gradient evaluations: 8 >>> res2.x # minimum found array([-1.80851064, -0.25531915])