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]#
使用非线性共轭梯度算法最小化函数。
- 参数::
- fcallable,
f(x, *args)
要最小化的目标函数。这里x 必须是待改变变量的 1 维数组,这些变量用于搜索最小值,args 是f 的其他(固定)参数。
- x0ndarray
用户提供的xopt 的初始估计值,xopt 是x 的最佳值。它必须是 1 维数组。
- fprimecallable,
fprime(x, *args)
, optional 返回f 在x 处的梯度的函数。这里x 和args 与上述f 的描述相同。返回值必须是 1 维数组。默认为 None,在这种情况下,梯度将通过数值逼近(参见下面的epsilon)。
- argstuple, optional
传递给f 和fprime 的参数值。只要需要额外的固定参数才能完全指定函数f 和fprime,就必须提供这些参数。
- gtolfloat, optional
当梯度的范数小于gtol 时停止。
- normfloat, optional
用于梯度范数的顺序(
-np.inf
为最小,np.inf
为最大)。- epsilonfloat 或 ndarray, optional
当fprime 通过数值逼近时使用的步长。可以是标量或 1 维数组。默认为
sqrt(eps)
,其中 eps 是浮点数机器精度。通常sqrt(eps)
大约为 1.5e-8。- maxiterint, optional
要执行的最大迭代次数。默认为
200 * len(x0)
。- full_outputbool, optional
如果为 True,除了xopt 之外,还返回fopt、func_calls、grad_calls 和warnflag。有关可选返回值的更多信息,请参见下面的返回值部分。
- dispbool, optional
如果为 True,则返回收敛消息,后跟xopt。
- retallbool, optional
如果为 True,则将每次迭代的结果添加到返回值中。
- callbackcallable, optional
可选的用户提供的函数,在每次迭代后调用。调用方式为
callback(xk)
,其中xk
是x0 的当前值。- c1float, default: 1e-4
Armijo 条件规则的参数。
- c2float, default: 0.4
曲率条件规则的参数。
- fcallable,
- 返回值::
- xoptndarray
使 f 最小的参数,即
f(xopt) == fopt
。- foptfloat, optional
找到的最小值,f(xopt)。仅在full_output 为 True 时返回。
- func_callsint, optional
执行的函数调用次数。仅在full_output 为 True 时返回。
- grad_callsint, optional
执行的梯度调用次数。仅在full_output 为 True 时返回。
- warnflagint, optional
带有警告状态的整数值,仅在full_output 为 True 时返回。
0 : 成功。
1 : 超过了最大迭代次数。
- 2梯度和/或函数调用没有改变。可能表明
精度丢失,即例程没有收敛。
3 : 遇到 NaN 结果。
- allvecslist of ndarray, optional
数组列表,包含每次迭代的结果。仅在retall 为 True 时返回。
另请参阅
minimize
对所有
scipy.optimize
算法的通用接口,用于多元函数的无约束和约束最小化。它通过指定method='CG'
提供了一种调用fmin_cg
的替代方法。
注意事项
这种共轭梯度算法基于 Polak 和 Ribiere 的算法 [1]。
当共轭梯度方法倾向于更好地工作时
f 具有唯一的全局最小化点,并且没有局部最小值或其他驻点,
f 在至少局部范围内,可以通过变量的二次函数很好地近似,
f 是连续的,并且具有连续梯度,
fprime 不太大,例如,其范数小于 1000,
初始猜测值x0 相对接近f 的全局最小化点xopt。
参数c1 和c2 必须满足
0 < c1 < c2 < 1
。参考文献
[1]Wright & Nocedal,"Numerical Optimization",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])