scipy.optimize.

minimize_scalar#

scipy.optimize.minimize_scalar(fun, bracket=None, bounds=None, args=(), method=None, tol=None, options=None)[原始碼]#

單變數純量函數的局部最小化。

參數:
funcallable

目標函數。純量函數,必須回傳純量值。

假設 callable 具有簽名 f0(x, *my_args, **my_kwargs),其中 my_argsmy_kwargs 是必要的位置和關鍵字引數。與其傳遞 f0 作為 callable,不如將其包裝以僅接受 x;例如,傳遞 fun=lambda x: f0(x, *my_args, **my_kwargs) 作為 callable,其中 my_args (tuple) 和 my_kwargs (dict) 已在此函數調用之前收集。

bracketsequence, optional

對於 ‘brent’ 和 ‘golden’ 方法,bracket 定義了括號區間且為必要項。可以是滿足 xa < xb < xcfunc(xb) < func(xa) and  func(xb) < func(xc) 的三元組 (xa, xb, xc),或一對 (xa, xb) 用於下坡括號搜尋的初始點(請參閱 scipy.optimize.bracket)。最小值 res.x 不一定滿足 xa <= res.x <= xb

boundssequence, optional

對於 ‘bounded’ 方法,bounds 是強制性的,且必須有兩個有限項目對應於最佳化邊界。

argstuple, optional

傳遞給目標函數的額外引數。

methodstr 或 callable, optional

求解器類型。應為以下之一

  • Brent

  • Bounded

  • Golden

  • custom - 一個 callable 物件 (在版本 0.14.0 中新增),請參閱下方

如果提供了 bounds 則預設為 “Bounded”,否則為 “Brent”。請參閱 ‘Notes’ 章節以了解每個求解器的詳細資訊。

tolfloat, optional

終止容忍度。如需詳細控制,請使用求解器特定的選項。

optionsdict, optional

求解器選項的字典。

maxiterint

要執行的最大迭代次數。

dispbool

設定為 True 以印出收斂訊息。

請參閱 show_options 以取得求解器特定的選項。

回傳:
resOptimizeResult

最佳化結果表示為 OptimizeResult 物件。重要的屬性為:x 解答陣列,success 布林標記,指示最佳化器是否成功退出,以及 message 描述終止原因。請參閱 OptimizeResult 以取得其他屬性的描述。

另請參閱

minimize

純量多變數函數的最小化演算法介面

show_options

求解器接受的其他選項

註釋

本節描述可透過 ‘method’ 參數選擇的可用求解器。預設方法是 "Bounded" Brent 方法 (如果傳遞 bounds) 和無邊界的 "Brent" (否則)。

方法 Brent 使用 Brent 演算法 [1] 尋找局部最小值。該演算法在可能的情況下使用反拋物線插值來加速黃金分割法的收斂。

方法 Golden 使用黃金分割搜尋技術 [1]。它使用二分法的類比來減少括號區間。通常最好使用 Brent 方法。

方法 Bounded 可以執行有界限的最小化 [2] [3]。它使用 Brent 方法在區間 x1 < xopt < x2 中尋找局部最小值。

請注意,除非提供了有效的 bracket 三元組,否則 Brent 和 Golden 方法不保證成功。如果找不到三點括號,請考慮 scipy.optimize.minimize。此外,所有方法僅適用於局部最小化。當感興趣的函數具有多個局部最小值時,請考慮 全域最佳化

自訂最小化器

傳遞自訂最小化方法可能很有用,例如在使用某些程式庫前端來 minimize_scalar 時。您可以簡單地傳遞一個 callable 作為 method 參數。

該 callable 會被呼叫為 method(fun, args, **kwargs, **options),其中 kwargs 對應於傳遞給 minimize 的任何其他參數(例如 brackettol 等),除了 options 字典,其內容也會成對地作為 method 參數傳遞。該方法應回傳一個 OptimizeResult 物件。

提供的 method callable 必須能夠接受(並可能忽略)任意參數;minimize 接受的參數集可能會在未來版本中擴展,然後這些參數將傳遞給該方法。您可以在 scipy.optimize 教學文件中找到範例。

在版本 0.11.0 中新增。

參考文獻

[1] (1,2)

Press, W., S.A. Teukolsky, W.T. Vetterling, and B.P. Flannery. Numerical Recipes in C. Cambridge University Press.

[2]

Forsythe, G.E., M. A. Malcolm, and C. B. Moler. “Computer Methods for Mathematical Computations.” Prentice-Hall Series in Automatic Computation 259 (1977).

[3]

Brent, Richard P. Algorithms for Minimization Without Derivatives. Courier Corporation, 2013.

範例

考慮最小化以下函數的問題。

>>> def f(x):
...     return (x - 2) * x * (x + 2)**2

使用 Brent 方法,我們找到局部最小值為

>>> from scipy.optimize import minimize_scalar
>>> res = minimize_scalar(f)
>>> res.fun
-9.9149495908

最小值為

>>> res.x
1.28077640403

使用 Bounded 方法,我們在指定的邊界內找到局部最小值為

>>> res = minimize_scalar(f, bounds=(-3, -1), method='bounded')
>>> res.fun  # minimum
3.28365179850e-13
>>> res.x  # minimizer
-2.0000002026