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
之外,還會傳回fopt
、func_calls
、grad_calls
和warnflag
。- 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 (預設值),則使用單位矩陣。
- fcallable
- 傳回值:
- 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 給定。
參數 c1 和 c2 必須滿足
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])