scipy.optimize.fmin_cg¶
- scipy.optimize.fmin_cg(f, x0, fprime=None, args=(), gtol=1e-05, norm=inf, epsilon=1.4901161193847656e-08, maxiter=None, full_output=0, disp=1, retall=0, callback=None)[源代码]¶
使用非线性共轭梯度算法最小化函数。
- 参数
- 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,则返回 fopt , func_calls , grad_calls ,以及 warnflag 除了……之外 xopt 。有关可选返回值的其他信息,请参阅下面的返回部分。
- disp布尔值,可选
如果为True,则返回收敛消息,后跟 xopt 。
- retall布尔值,可选
如果为True,则将每次迭代的结果添加到返回值。
- callback可调用,可选
用户提供的可选函数,在每次迭代后调用。称为
callback(xk)
,在哪里xk
是的当前值 x0 。
- f :可调用,
- 退货
- xoptndarray
最小化f的参数,即,
f(xopt) == fopt
。- fopt浮动,可选
找到的最小值,f(Xopt)。仅在以下情况下返回 full_output 是真的。
- func_calls整型,可选
进行的Function_Call数。仅在以下情况下返回 full_output 是真的。
- grad_calls整型,可选
进行的渐变调用数。仅在以下情况下返回 full_output 是真的。
- warnflag整型,可选
具有警告状态的整数值,仅在 full_output 是真的。
0:成功。
1:已超过最大迭代次数。
- 2渐变和/或函数调用未更改。可表明
精确度丧失了,也就是说,例程没有收敛。
3:遇到NaN结果。
- allvecsndarray列表,可选
数组列表,包含每次迭代的结果。仅在以下情况下返回 retall 是真的。
参见
minimize
面向所有用户的通用界面
scipy.optimize
多元函数无约束最小化和约束最小化的算法。它提供了另一种调用fmin_cg
,通过指定method='CG'
。
注意事项
该共轭梯度算法是在Polak和Ribiere算法的基础上提出的 [1].
在以下情况下,共轭梯度法往往工作得更好:
f 具有唯一的全局极小点,没有局部极小点或其他固定点,
f 至少在局部上由变量的二次函数合理地很好地逼近,
f 是连续的,并且具有连续的梯度,
fprime 不是太大,例如具有小于1000的规范,
最初的猜测是, x0 ,相当接近 f 的全局极小点, xopt 。
参考文献
- 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)
。>>> 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 DICTIONARY显示所有可用选项,尽管实际上只需要非默认值。返回值将是一个字典。)>>> 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])