fmin_cg#
- scipy.optimize.fmin_cg(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, c1=0.0001, c2=0.4)[原始碼]#
使用非線性共軛梯度演算法最小化函數。
- 參數:
- f可呼叫物件,
f(x, *args)
要最小化的目標函數。此處 x 必須是要在搜尋最小值時變更的變數的 1 維陣列,而 args 是 f 的其他(固定)參數。
- x0ndarray
使用者提供的 xopt 的初始估計值,即 x 的最佳值。它必須是值的 1 維陣列。
- fprime可呼叫物件,
fprime(x, *args)
, 可選 一個函數,回傳 f 在 x 的梯度。此處 x 和 args 與上述 f 的描述相同。回傳值必須是 1 維陣列。預設為 None,在這種情況下,梯度會以數值方式近似(請參閱下方的 epsilon)。
- argstuple, 可選
傳遞給 f 和 fprime 的參數值。當需要額外的固定參數來完全指定函數 f 和 fprime 時,必須提供。
- gtolfloat, 可選
當梯度的範數小於 gtol 時停止。
- normfloat, 可選
用於梯度範數的階數(
-np.inf
為最小值,np.inf
為最大值)。- epsilonfloat 或 ndarray, 可選
當以數值方式近似 fprime 時要使用的步長。可以是純量或 1 維陣列。預設為
sqrt(eps)
,其中 eps 是浮點運算機器精度。通常sqrt(eps)
約為 1.5e-8。- maxiterint, 可選
要執行的最大迭代次數。預設值為
200 * len(x0)
。- full_outputbool, 可選
如果為 True,則除了 xopt 之外,還回傳 fopt、func_calls、grad_calls 和 warnflag。有關可選回傳值的其他資訊,請參閱下方的「回傳」章節。
- dispbool, 可選
如果為 True,則回傳收斂訊息,後接 xopt。
- retallbool, 可選
如果為 True,則將每次迭代的結果新增到回傳值中。
- callback可呼叫物件, 可選
一個可選的使用者提供函數,在每次迭代後呼叫。呼叫方式為
callback(xk)
,其中xk
是 x0 的目前值。- c1float, 預設值:1e-4
Armijo 條件規則的參數。
- c2float, 預設值:0.4
曲率條件規則的參數。
- f可呼叫物件,
- 回傳值:
- xoptndarray
最小化 f 的參數,即
f(xopt) == fopt
。- foptfloat, 可選
找到的最小值,f(xopt)。僅當 full_output 為 True 時回傳。
- func_callsint, 可選
進行的函數呼叫次數。僅當 full_output 為 True 時回傳。
- grad_callsint, 可選
進行的梯度呼叫次數。僅當 full_output 為 True 時回傳。
- warnflagint, 可選
具有警告狀態的整數值,僅當 full_output 為 True 時回傳。
0 : 成功。
1 : 超過最大迭代次數。
- 2梯度和/或函數呼叫沒有改變。可能表示
精度遺失,即常式沒有收斂。
3 : 遇到 NaN 結果。
- allvecsndarray 列表, 可選
陣列列表,包含每次迭代的結果。僅當 retall 為 True 時回傳。
另請參閱
minimize
所有
scipy.optimize
演算法的通用介面,用於多變數函數的無約束和約束最小化。它提供了一種呼叫fmin_cg
的替代方法,透過指定method='CG'
。
註解
此共軛梯度演算法基於 Polak 和 Ribiere 的演算法 [1]。
當以下情況時,共軛梯度方法往往效果更好:
f 具有唯一的全域最小化點,且沒有局部最小值或其他靜止點,
f 至少在局部上可以合理地用變數的二次函數近似,
f 是連續的且具有連續梯度,
fprime 不會太大,例如,範數小於 1000,
初始猜測 x0 相當接近 f 的全域最小化點 xopt。
參數 c1 和 c2 必須滿足
0 < c1 < c2 < 1
。參考文獻
[1]Wright & Nocedal, “Numerical Optimization”, 1999, pp. 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])