scipy.optimize.

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)[源代码][源代码]#

使用非线性共轭梯度算法最小化一个函数。

参数:
f : 可调用对象, f(x, *args)可调用对象,

要最小化的目标函数。这里 x 必须是一个一维数组,表示在寻找最小值过程中需要改变的变量,而 argsf 的其他(固定)参数。

x0ndarray

用户提供的 xopt 的初始估计值,即 x 的最优值。它必须是一个一维数组。

fprime : 可调用对象, fprime(x, *args), 可选可调用对象,

一个返回 fx 处的梯度的函数。这里 xargs 的描述如上所述用于 f。返回值必须是一个一维数组。默认为 None,在这种情况下,梯度是数值近似计算的(参见 epsilon,如下)。

参数tuple, 可选

传递给 ffprime 的参数值。每当需要额外的固定参数来完全指定函数 ffprime 时,必须提供这些参数值。

gtolfloat, 可选

当梯度的范数小于 gtol 时停止。

规范float, 可选

用于梯度范数的顺序(-np.inf 是最小值,np.inf 是最大值)。

epsilon浮点数或ndarray,可选

fprime 以数值方式近似时使用的步长。可以是标量或一维数组。默认为 sqrt(eps),其中 eps 是浮点数机器精度。通常 sqrt(eps) 大约是 1.5e-8。

maxiterint, 可选

要执行的最大迭代次数。默认值为 200 * len(x0)

完整输出bool, 可选

如果为 True,除了 xopt 之外,还会返回 foptfunc_callsgrad_callswarnflag。有关可选返回值的更多信息,请参阅下面的 Returns 部分。

dispbool, 可选

如果为真,返回一个收敛消息,随后是 xopt

retallbool, 可选

如果为真,则在返回的值中添加每次迭代的结果。

回调可调用,可选

一个可选的用户提供的函数,在每次迭代后调用。调用方式为 callback(xk),其中 xkx0 的当前值。

c1浮点数,默认值:1e-4

Armijo 条件规则的参数。

c2float, 默认值: 0.4

曲率条件规则的参数。

返回:
xoptndarray

最小化 f 的参数,即 f(xopt) == fopt

foptfloat, 可选

找到的最小值,f(xopt)。仅在 full_output 为 True 时返回。

函数调用int, 可选

函数调用的次数。仅当 full_output 为 True 时返回。

grad_callsint, 可选

所进行的梯度调用次数。仅当 full_output 为 True 时返回。

警告标志int, 可选

带有警告状态的整数值,仅在 full_output 为 True 时返回。

0 : 成功。

1 : 迭代次数已超过最大值。

2梯度和/或函数调用没有变化。可能表明

精度丢失,即,例程未收敛。

3 : 遇到 NaN 结果。

allvecsndarray 列表,可选

数组列表,包含每次迭代的结果。仅当 retall 为 True 时返回。

参见

minimize

scipy.optimize 算法中用于多元函数无约束和约束最小化的通用接口。它提供了一种替代方式来调用 fmin_cg,通过指定 method='CG'

注释

这个共轭梯度算法基于 Polak 和 Ribiere 的算法 [1]

共轭梯度法在以下情况下效果更好:

  1. f 有一个唯一的全局最小点,并且没有局部最小点或其他驻点。

  2. f 至少在局部,可以合理地近似为一个变量的二次函数,

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

  4. fprime 不是太大,例如,其范数小于1000,

  5. 初始猜测值 x0 合理地接近 f 的全局最小点 xopt

参数 c1c2 必须满足 0 < c1 < c2 < 1

参考文献

[1]

Wright & Nocedal, “数值优化”, 1999, 第120-122页。

示例

示例 1:对于给定的参数值和初始猜测 (u, v) = (0, 0),求表达式 a*u**2 + b*u*v + c*v**2 + d*u + e*v + f 的最小值。

>>> 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])