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_args
和my_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 < xc
和func(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
求解器類型。應為以下之一
如果提供了 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
的任何其他參數(例如bracket
、tol 等),除了 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