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)[source]#

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

参数::
fcallable, f(x, *args)

要最小化的目标函数。这里x 必须是待改变变量的 1 维数组,这些变量用于搜索最小值,argsf 的其他(固定)参数。

x0ndarray

用户提供的xopt 的初始估计值,xoptx 的最佳值。它必须是 1 维数组。

fprimecallable, fprime(x, *args), optional

返回fx 处的梯度的函数。这里xargs 与上述f 的描述相同。返回值必须是 1 维数组。默认为 None,在这种情况下,梯度将通过数值逼近(参见下面的epsilon)。

argstuple, optional

传递给ffprime 的参数值。只要需要额外的固定参数才能完全指定函数ffprime,就必须提供这些参数。

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 之外,还返回foptfunc_callsgrad_callswarnflag。有关可选返回值的更多信息,请参见下面的返回值部分。

dispbool, optional

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

retallbool, optional

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

callbackcallable, optional

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

c1float, default: 1e-4

Armijo 条件规则的参数。

c2float, default: 0.4

曲率条件规则的参数。

返回值::
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]

当共轭梯度方法倾向于更好地工作时

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

  2. f 在至少局部范围内,可以通过变量的二次函数很好地近似,

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

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

  5. 初始猜测值x0 相对接近f 的全局最小化点xopt

参数c1c2 必须满足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])