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

使用 BFGS 演算法最小化函數。

參數:
fcallable f(x,*args)

要最小化的目標函數。

x0ndarray

初始猜測,形狀為 (n,)

fprimecallable f'(x,*args), optional

f 的梯度。

argstuple, optional

傳遞給 f 和 fprime 的額外參數。

gtolfloat, optional

如果梯度範數小於 gtol,則成功終止

normfloat, optional

範數的階數 (Inf 為最大值,-Inf 為最小值)

epsilonint 或 ndarray, optional

如果 fprime 是近似值,則使用此值作為步長。

callbackcallable, optional

一個可選的使用者提供的函數,在每次迭代後呼叫。呼叫方式為 callback(xk),其中 xk 是目前的參數向量。

maxiterint, optional

要執行的最大迭代次數。

full_outputbool, optional

如果為 True,則除了 xopt 之外,還會傳回 foptfunc_callsgrad_callswarnflag

dispbool, optional

如果為 True,則印出收斂訊息。

retallbool, optional

如果為 True,則傳回每次迭代的結果列表。

xrtolfloat, default: 0

x 的相對容忍度。如果步長小於 xk * xrtol,則成功終止,其中 xk 是目前的參數向量。

c1float, default: 1e-4

Armijo 條件規則的參數。

c2float, default: 0.9

曲率條件規則的參數。

hess_inv0None 或 ndarray, optional``

初始反 Hessian 估計,形狀為 (n, n)。如果為 None (預設值),則使用單位矩陣。

傳回值:
xoptndarray

最小化 f 的參數,即 f(xopt) == fopt

foptfloat

最小值。

goptndarray

最小值處的梯度值,f’(xopt),應接近 0。

Boptndarray

1/f’’(xopt) 的值,即反 Hessian 矩陣。

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 ‘Numerical Optimization’, 1999, p. 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])