scipy.optimize.

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 維陣列,而 argsf 的其他(固定)參數。

x0ndarray

使用者提供的 xopt 的初始估計值,即 x 的最佳值。它必須是值的 1 維陣列。

fprime可呼叫物件, fprime(x, *args), 可選

一個函數,回傳 fx 的梯度。此處 xargs 與上述 f 的描述相同。回傳值必須是 1 維陣列。預設為 None,在這種情況下,梯度會以數值方式近似(請參閱下方的 epsilon)。

argstuple, 可選

傳遞給 ffprime 的參數值。當需要額外的固定參數來完全指定函數 ffprime 時,必須提供。

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 之外,還回傳 foptfunc_callsgrad_callswarnflag。有關可選回傳值的其他資訊,請參閱下方的「回傳」章節。

dispbool, 可選

如果為 True,則回傳收斂訊息,後接 xopt

retallbool, 可選

如果為 True,則將每次迭代的結果新增到回傳值中。

callback可呼叫物件, 可選

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

c1float, 預設值:1e-4

Armijo 條件規則的參數。

c2float, 預設值:0.4

曲率條件規則的參數。

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

當以下情況時,共軛梯度方法往往效果更好:

  1. f 具有唯一的全域最小化點,且沒有局部最小值或其他靜止點,

  2. f 至少在局部上可以合理地用變數的二次函數近似,

  3. f 是連續的且具有連續梯度,

  4. fprime 不會太大,例如,範數小於 1000,

  5. 初始猜測 x0 相當接近 f 的全域最小化點 xopt

參數 c1c2 必須滿足 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])