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 。这里 xargs 是如上所述的 f 。返回值必须是一维数组。缺省值为None,在这种情况下,渐变是以数字形式近似的(请参见 epsilon ,下文)。

args元组,可选

传递给的参数值 ffprime 。必须在需要附加固定参数才能完全指定函数时提供 ffprime

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,则返回 foptfunc_callsgrad_calls ,以及 warnflag 除了……之外 xopt 。有关可选返回值的其他信息,请参阅下面的返回部分。

disp布尔值,可选

如果为True,则返回收敛消息,后跟 xopt

retall布尔值,可选

如果为True,则将每次迭代的结果添加到返回值。

callback可调用,可选

用户提供的可选函数,在每次迭代后调用。称为 callback(xk) ,在哪里 xk 是的当前值 x0

退货
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].

在以下情况下,共轭梯度法往往工作得更好:

  1. f 具有唯一的全局极小点,没有局部极小点或其他固定点,

  2. f 至少在局部上由变量的二次函数合理地很好地逼近,

  3. f 是连续的,并且具有连续的梯度,

  4. fprime 不是太大,例如具有小于1000的规范,

  5. 最初的猜测是, 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])