scipy.optimize.

fmin_bfgs#

scipy.optimize.fmin_bfgs(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, xrtol=0, c1=0.0001, c2=0.9, hess_inv0=None)[源代码]#

使用 BFGS 算法最小化函数。

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

要最小化的目标函数。

x0ndarray

初始猜测,形状为 (n,)

fprime可调用 f'(x,*args),可选

f 的梯度。

argstuple,可选

传递给 f 和 fprime 的额外参数。

gtolfloat,可选

如果梯度范数小于 gtol,则成功终止

normfloat,可选

范数的阶数(Inf 是最大值,-Inf 是最小值)

epsilonint 或 ndarray,可选

如果近似 fprime,则使用此值作为步长。

callback可调用,可选

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

maxiterint,可选

要执行的最大迭代次数。

full_outputbool,可选

如果为 True,则除了 xopt 之外,还返回 foptfunc_callsgrad_callswarnflag

dispbool,可选

如果为 True,则打印收敛消息。

retallbool,可选

如果为 True,则返回每次迭代的结果列表。

xrtolfloat,默认值:0

x 的相对容差。如果步长小于 xk * xrtol,则成功终止,其中 xk 是当前参数向量。

c1float,默认值:1e-4

Armijo 条件规则的参数。

c2float,默认值:0.9

曲率条件规则的参数。

hess_inv0None 或 ndarray,可选

初始逆海森矩阵估计,形状为 (n, n)。如果为 None(默认),则使用单位矩阵。

返回:
xoptndarray

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

foptfloat

最小值。

goptndarray

最小值处的梯度值,f’(xopt),应该接近 0。

Boptndarray

1/f’’(xopt) 的值,即逆海森矩阵。

func_callsint

进行的函数调用次数。

grad_callsint

进行的梯度调用次数。

warnflaginteger

1:超出最大迭代次数。2:梯度和/或函数调用未更改。3:遇到 NaN 结果。

allvecslist

每次迭代时 xopt 的值。仅当 retall 为 True 时返回。

另请参见

minimize

多元函数最小化算法的接口。特别参见 method='BFGS'

说明

使用 Broyden、Fletcher、Goldfarb 和 Shanno (BFGS) 的拟牛顿法优化函数 f,其梯度由 fprime 给出。

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

参考文献

Wright 和 Nocedal 的《数值优化》,1999,第 198 页。

示例

>>> import numpy as np
>>> from scipy.optimize import fmin_bfgs
>>> def quadratic_cost(x, Q):
...     return x @ Q @ x
...
>>> x0 = np.array([-3, -4])
>>> cost_weight =  np.diag([1., 10.])
>>> # Note that a trailing comma is necessary for a tuple with single element
>>> fmin_bfgs(quadratic_cost, x0, args=(cost_weight,))
Optimization terminated successfully.
        Current function value: 0.000000
        Iterations: 7                   # may vary
        Function evaluations: 24        # may vary
        Gradient evaluations: 8         # may vary
array([ 2.85169950e-06, -4.61820139e-07])
>>> def quadratic_cost_grad(x, Q):
...     return 2 * Q @ x
...
>>> fmin_bfgs(quadratic_cost, x0, quadratic_cost_grad, args=(cost_weight,))
Optimization terminated successfully.
        Current function value: 0.000000
        Iterations: 7
        Function evaluations: 8
        Gradient evaluations: 8
array([ 2.85916637e-06, -4.54371951e-07])