當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy optimize.fmin_cg用法及代碼示例


本文簡要介紹 python 語言中 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 必須是在搜索最小值時要更改的變量的一維數組,而 args 是 f 的其他(固定)參數。

x0 ndarray

用戶提供的 xopt 初始估計值,即 x 的最優值。它必須是一維值數組。

fprime 可調用,fprime(x, *args),可選

返回 f 在 x 處的梯度的函數。這裏 x 和 args 與上麵對 f 的說明相同。返回的值必須是一維數組。默認為 None,在這種情況下,梯度是數值近似的(參見下麵的 epsilon)。

args 元組,可選

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

gtol 浮點數,可選

當梯度的範數小於 gtol 時停止。

norm 浮點數,可選

用於梯度範數的順序(-np.inf 是最小值,np.inf 是最大值)。

epsilon float 或 ndarray,可選

何時使用的步長fprime是數值近似的。可以是標量或一維數組。默認為sqrt(eps), 用 eps 表示浮點機器精度。通常sqrt(eps)約為 1.5e-8。

maxiter 整數,可選

要執行的最大迭代次數。默認為 200 * len(x0)

full_output 布爾型,可選

如果為 True,除了 xopt 之外,還返回 fopt、func_calls、grad_calls 和 warnflag。有關可選返回值的更多信息,請參閱下麵的返回部分。

disp 布爾型,可選

如果為 True,則返回收斂消息,然後是 xopt。

retall 布爾型,可選

如果為 True,則將每次迭代的結果添加到返回值中。

callback 可調用的,可選的

一個可選的用戶提供的函數,在每次迭代後調用。稱為callback(xk),其中xk是的當前值x0.

c1 浮點數,默認:1e-4

Armijo 條件規則的參數。

c2 浮點數,默認值:0.4

曲率條件規則的參數。

返回

xopt ndarray

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

fopt 浮點數,可選

找到最小值,f(xopt)。僅在 full_output 為 True 時返回。

func_calls 整數,可選

function_calls 的數量。僅在 full_output 為 True 時返回。

grad_calls 整數,可選

進行的梯度調用次數。僅在 full_output 為 True 時返回。

warnflag 整數,可選

帶有警告狀態的整數值,僅在 full_output 為 True 時返回。

0:成功。

1:超過最大迭代次數。

2 梯度和/或函數調用沒有改變。可能表明

該精度丟失了,即例程沒有收斂。

3:遇到NaN 結果。

allvecs ndarray 列表,可選

數組列表,包含每次迭代的結果。隻有當retall 為True 時才返回。

注意

這種共軛梯度算法基於 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 年,第 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:使用scipy.optimize.minimize函數。 (這關注字典顯示了所有可用的選項,盡管實際上隻需要非默認值。返回的值將是一個字典。)

>>> 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])

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.optimize.fmin_cg。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。