minimize#
- scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)[source]#
單變數或多變數純量函數的最小化。
- 參數:
- fun可呼叫物件
要最小化的目標函數
fun(x, *args) -> float
其中
x
是一個形狀為 (n,) 的一維陣列,而args
是一個元組,包含完整指定函數所需的固定參數。假設可呼叫物件的簽名為
f0(x, *my_args, **my_kwargs)
,其中my_args
和my_kwargs
是必要的位置和關鍵字參數。與其將f0
作為可呼叫物件傳遞,不如將其包裝起來以僅接受x
;例如,將fun=lambda x: f0(x, *my_args, **my_kwargs)
作為可呼叫物件傳遞,其中my_args
(元組) 和my_kwargs
(字典) 已在此函數調用之前收集。- x0ndarray,形狀 (n,)
初始猜測值。大小為 (n,) 的實數元素陣列,其中 n 是獨立變數的數量。
- args元組,選用
傳遞給目標函數及其導數(fun、jac 和 hess 函數)的額外參數。
- method字串或可呼叫物件,選用
解算器類型。應為下列其中之一
‘Nelder-Mead’ (請參閱此處)
‘Powell’ (請參閱此處)
‘CG’ (請參閱此處)
‘BFGS’ (請參閱此處)
‘Newton-CG’ (請參閱此處)
‘L-BFGS-B’ (請參閱此處)
‘TNC’ (請參閱此處)
‘COBYLA’ (請參閱此處)
‘COBYQA’ (請參閱此處)
‘SLSQP’ (請參閱此處)
‘trust-constr’(請參閱此處)
‘dogleg’ (請參閱此處)
‘trust-ncg’ (請參閱此處)
‘trust-exact’ (請參閱此處)
‘trust-krylov’ (請參閱此處)
custom - 一個可呼叫物件,請參閱下文說明。
若未指定,則根據問題是否具有約束或邊界,選擇
BFGS
、L-BFGS-B
、SLSQP
其中之一。- jac{可呼叫物件、‘2-point’、‘3-point’、‘cs’、布林值},選用
計算梯度向量的方法。僅適用於 CG、BFGS、Newton-CG、L-BFGS-B、TNC、SLSQP、dogleg、trust-ncg、trust-krylov、trust-exact 和 trust-constr。如果它是可呼叫物件,則應為一個返回梯度向量的函數
jac(x, *args) -> array_like, shape (n,)
其中
x
是一個形狀為 (n,) 的陣列,而args
是一個包含固定參數的元組。如果 jac 是一個布林值且為 True,則假定 fun 返回一個元組(f, g)
,其中包含目標函數和梯度。方法 ‘Newton-CG’、‘trust-ncg’、‘dogleg’、‘trust-exact’ 和 ‘trust-krylov’ 要求提供可呼叫物件,或 fun 返回目標函數和梯度。如果為 None 或 False,則將使用絕對步長的 2 點有限差分估計來估計梯度。或者,可以使用關鍵字 {‘2-point’、‘3-point’、‘cs’} 來選擇有限差分方案,以使用相對步長數值估計梯度。這些有限差分方案遵守任何指定的 bounds。- hess{可呼叫物件、‘2-point’、‘3-point’、‘cs’、HessianUpdateStrategy},選用
計算 Hessian 矩陣的方法。僅適用於 Newton-CG、dogleg、trust-ncg、trust-krylov、trust-exact 和 trust-constr。如果它是可呼叫物件,則應返回 Hessian 矩陣
hess(x, *args) -> {LinearOperator, spmatrix, array}, (n, n)
其中
x
是一個 (n,) ndarray,而args
是一個包含固定參數的元組。關鍵字 {‘2-point’、‘3-point’、‘cs’} 也可用於選擇有限差分方案,以數值估計 Hessian 矩陣。或者,可以使用實作HessianUpdateStrategy
介面的物件來近似 Hessian 矩陣。實作此介面的可用擬牛頓法為並非所有選項都適用於每種方法;如需可用性,請參閱註解。
- hessp可呼叫物件,選用
目標函數的 Hessian 矩陣乘以任意向量 p。僅適用於 Newton-CG、trust-ncg、trust-krylov、trust-constr。hessp 和 hess 只需要提供其中一個。如果提供了 hess,則 hessp 將被忽略。hessp 必須計算 Hessian 矩陣乘以任意向量
hessp(x, p, *args) -> ndarray shape (n,)
其中
x
是一個 (n,) ndarray,p
是一個維度為 (n,) 的任意向量,而args
是一個包含固定參數的元組。- bounds序列或
Bounds
,選用 Nelder-Mead、L-BFGS-B、TNC、SLSQP、Powell、trust-constr、COBYLA 和 COBYQA 方法的變數邊界。有兩種方法可以指定邊界
Bounds
類別的實例。每個 x 元素的
(min, max)
配對序列。None 用於指定無邊界。
- constraints{Constraint, dict} 或 {Constraint, dict} 列表,選用
約束定義。僅適用於 COBYLA、COBYQA、SLSQP 和 trust-constr。
‘trust-constr’ 和 ‘cobyqa’ 的約束定義為單一物件或物件列表,用於指定最佳化問題的約束。可用約束為
COBYLA、SLSQP 的約束定義為字典列表。每個字典都包含以下欄位
- type字串
約束類型:「eq」表示等式,「ineq」表示不等式。
- fun可呼叫物件
定義約束的函數。
- jac可呼叫物件,選用
fun 的 Jacobian 矩陣(僅適用於 SLSQP)。
- args序列,選用
傳遞給函數和 Jacobian 矩陣的額外參數。
等式約束表示約束函數的結果應為零,而不等式表示應為非負數。請注意,COBYLA 僅支援不等式約束。
- tol浮點數,選用
終止容忍度。當指定 tol 時,選定的最小化演算法會將一些相關的解算器特定容忍度設定為等於 tol。如需詳細控制,請使用解算器特定選項。
- options字典,選用
解算器選項的字典。除了 TNC 之外的所有方法都接受以下通用選項
- maxiter整數
要執行的最大迭代次數。根據方法,每次迭代可能會使用多次函數評估。
對於 TNC,請使用 maxfun 而不是 maxiter。
- disp布林值
設定為 True 以列印收斂訊息。
如需方法特定選項,請參閱
show_options
。- callback可呼叫物件,選用
每次迭代後呼叫的可呼叫物件。
除了 TNC、SLSQP 和 COBYLA 之外的所有方法都支援具有以下簽名的可呼叫物件
callback(intermediate_result: OptimizeResult)
其中
intermediate_result
是一個關鍵字參數,包含一個OptimizeResult
,其中包含屬性x
和fun
,即參數向量和目標函數的目前值。請注意,參數名稱必須為intermediate_result
,才能將OptimizeResult
傳遞給回呼函數。如果回呼函數引發StopIteration
,這些方法也會終止。除了 trust-constr 之外的所有方法(也)支援類似的簽名
callback(xk)
其中
xk
是目前的參數向量。內省用於確定要調用上述哪個簽名。
- 傳回:
- resOptimizeResult
最佳化結果表示為
OptimizeResult
物件。重要屬性包括:x
解算器陣列、success
一個布林標誌,指示最佳化器是否成功退出,以及message
描述終止原因的訊息。如需其他屬性的說明,請參閱OptimizeResult
。
另請參閱
minimize_scalar
純量單變數函數最小化演算法的介面
show_options
解算器接受的其他選項
註解
本節說明可透過 ‘method’ 參數選取的可用解算器。預設方法為 BFGS。
無約束最小化
方法 CG 使用 Polak 和 Ribiere 的非線性共軛梯度演算法,這是 Fletcher-Reeves 方法的變體,如 [5] 第 120-122 頁所述。僅使用一階導數。
方法 BFGS 使用 Broyden、Fletcher、Goldfarb 和 Shanno (BFGS) 的擬牛頓法 [5] 第 136 頁。它僅使用一階導數。即使對於非平滑最佳化,BFGS 也已證明具有良好的效能。此方法也會傳回 Hessian 矩陣逆矩陣的近似值,並以 hess_inv 形式儲存在 OptimizeResult 物件中。
方法 Newton-CG 使用 Newton-CG 演算法 [5] 第 168 頁(也稱為截斷牛頓法)。它使用 CG 方法來計算搜尋方向。另請參閱 TNC 方法,以了解使用類似演算法的箱型約束最小化。適用於大規模問題。
方法 dogleg 使用 dog-leg 信賴域演算法 [5] 進行無約束最小化。此演算法需要梯度和 Hessian 矩陣;此外,Hessian 矩陣必須是正定矩陣。
方法 trust-ncg 使用 Newton 共軛梯度信賴域演算法 [5] 進行無約束最小化。此演算法需要梯度以及 Hessian 矩陣或計算 Hessian 矩陣與給定向量乘積的函數。適用於大規模問題。
方法 trust-krylov 使用 Newton GLTR 信賴域演算法 [14]、[15] 進行無約束最小化。此演算法需要梯度以及 Hessian 矩陣或計算 Hessian 矩陣與給定向量乘積的函數。適用於大規模問題。在不定問題上,它通常比 trust-ncg 方法需要更少的迭代次數,建議用於中型和大型問題。
方法 trust-exact 是一種用於無約束最小化的信賴域方法,其中二次子問題幾乎完全求解 [13]。此演算法需要梯度和 Hessian 矩陣(不 需要是正定矩陣)。在許多情況下,它是迭代次數較少的牛頓法,最適合小型和中型問題。
邊界約束最小化
方法 Nelder-Mead 使用 Simplex 演算法 [1]、[2]。此演算法在許多應用中都很穩健。但是,如果可以信任導數的數值計算,則通常優先選擇使用一階和/或二階導數資訊的其他演算法,以獲得更好的效能。
方法 L-BFGS-B 使用 L-BFGS-B 演算法 [6]、[7] 進行邊界約束最小化。
方法 Powell 是 Powell 方法的修改 [3]、[4],這是一種共軛方向法。它沿方向集(options 和 info 中的 direc 欄位)的每個向量執行循序一維最小化,該方向集在主最小化迴圈的每次迭代中都會更新。該函數不需要是可微的,也不會取導數。如果未提供邊界,則將使用無界線搜尋。如果提供邊界且初始猜測值在邊界內,則整個最小化過程中的每個函數評估都將在邊界內。如果提供邊界,初始猜測值在邊界外,且 direc 是滿秩的(預設為滿秩),則第一次迭代期間的某些函數評估可能在邊界外,但第一次迭代之後的每個函數評估都將在邊界內。如果 direc 不是滿秩的,則某些參數可能未最佳化,且不保證解會在邊界內。
方法 TNC 使用截斷牛頓演算法 [5]、[8] 來最小化受邊界約束的變數函數。此演算法使用梯度資訊;它也稱為牛頓共軛梯度法。它與上面描述的 Newton-CG 方法不同,因為它包裝了 C 實作,並允許為每個變數指定上限和下限。
約束最小化
方法 COBYLA 使用線性近似約束最佳化 (COBYLA) 方法 [9]、[10]、[11]。該演算法基於目標函數和每個約束的線性近似。該方法包裝了演算法的 FORTRAN 實作。約束函數 ‘fun’ 可能會傳回單個數字或數字陣列或列表。
方法 COBYQA 使用二次近似約束最佳化 (COBYQA) 方法 [18]。該演算法是一種基於二次近似的無導數信賴域 SQP 方法,用於目標函數和每個非線性約束。邊界被視為不可放寬的約束,因為演算法始終在整個最佳化過程中遵守它們。
方法 SLSQP 使用循序最小平方規劃來最小化具有邊界、等式和不等式約束任意組合的多個變數函數。該方法包裝了最初由 Dieter Kraft [12] 實作的 SLSQP 最佳化子常式。請注意,包裝器透過將邊界中的無限值轉換為大型浮點值來處理它們。
方法 trust-constr 是一種用於約束最佳化的信賴域演算法。它根據問題定義在兩種實作之間切換。它是 SciPy 中實作的最通用的約束最小化演算法,也是最適合大規模問題的演算法。對於等式約束問題,它是 Byrd-Omojokun 信賴域 SQP 方法的實作,如 [17] 和 [5] 第 549 頁所述。當也施加不等式約束時,它會切換到 [16] 中描述的信賴域內點法。反過來,此內點演算法透過引入鬆弛變數並針對障礙參數逐漸減小的值求解一系列等式約束障礙問題來解決不等式約束。先前描述的等式約束 SQP 方法用於求解子問題,隨著迭代更接近解,精確度會不斷提高。
有限差分選項
對於方法 trust-constr,梯度和 Hessian 矩陣可以使用三種有限差分方案來近似:{‘2-point’、‘3-point’、‘cs’}。方案 ‘cs’ 可能是最準確的,但它要求函數正確處理複數輸入,並且在複數平面中是可微的。方案 ‘3-point’ 比 ‘2-point’ 更準確,但需要兩倍的操作次數。如果梯度是透過有限差分估計的,則 Hessian 矩陣必須使用擬牛頓策略之一來估計。
hess 關鍵字的方法特定選項
方法/Hess
無
可呼叫物件
‘2-point’/‘3-point’/‘cs’
HUS
Newton-CG
x
(n, n) LO
x
x
dogleg
(n, n)
trust-ncg
(n, n)
x
x
trust-krylov
(n, n)
x
x
trust-exact
(n, n)
trust-constr
x
(n, n) LO sp
x
x
其中 LO=LinearOperator,sp=Sparse matrix,HUS=HessianUpdateStrategy
自訂最小化器
傳遞自訂最小化方法可能很有用,例如在使用此方法的前端(例如
scipy.optimize.basinhopping
)或其他程式庫時。您可以直接將可呼叫物件作為method
參數傳遞。可呼叫物件會以
method(fun, x0, args, **kwargs, **options)
的形式呼叫,其中kwargs
對應於傳遞給minimize
的任何其他參數(例如 callback、hess 等),但 options 字典除外,其內容也會成對傳遞為 method 參數。此外,如果 jac 已作為布林類型傳遞,則會修改 jac 和 fun,以便 fun 僅傳回函數值,而 jac 會轉換為傳回 Jacobian 矩陣的函數。該方法應傳回OptimizeResult
物件。提供的 method 可呼叫物件必須能夠接受(並可能忽略)任意參數;
minimize
接受的參數集可能會在未來版本中擴展,然後這些參數將傳遞給該方法。您可以在 scipy.optimize 教學課程中找到範例。參考文獻
[1]Nelder, J A, and R Mead. 1965. A Simplex Method for Function Minimization. The Computer Journal 7: 308-13.
[2]Wright M H. 1996. Direct search methods: Once scorned, now respectable, in Numerical Analysis 1995: Proceedings of the 1995 Dundee Biennial Conference in Numerical Analysis (Eds. D F Griffiths and G A Watson). Addison Wesley Longman, Harlow, UK. 191-208.
[3]Powell, M J D. 1964. An efficient method for finding the minimum of a function of several variables without calculating derivatives. The Computer Journal 7: 155-162.
[4]Press W, S A Teukolsky, W T Vetterling and B P Flannery. Numerical Recipes (any edition), Cambridge University Press.
[6]Byrd, R H and P Lu and J. Nocedal. 1995. A Limited Memory Algorithm for Bound Constrained Optimization. SIAM Journal on Scientific and Statistical Computing 16 (5): 1190-1208.
[7]Zhu, C and R H Byrd and J Nocedal. 1997. L-BFGS-B: Algorithm 778: L-BFGS-B, FORTRAN routines for large scale bound constrained optimization. ACM Transactions on Mathematical Software 23 (4): 550-560.
[8]Nash, S G. 牛頓型最小化透過 Lanczos 方法。1984。SIAM 數值分析期刊 21: 770-778。
[9]Powell, M J D. 一種直接搜尋最佳化方法,透過線性內插法模擬目標函數和約束函數。1994。最佳化與數值分析進展,編輯:S. Gomez 和 J-P Hennart,Kluwer Academic (Dordrecht),51-67。
[10]Powell M J D. 用於最佳化計算的直接搜尋演算法。1998。Acta Numerica 7: 287-336。
[11]Powell M J D. 無導數最佳化演算法的觀點。2007。劍橋大學技術報告 DAMTP 2007/NA03
[12]Kraft, D. 用於循序二次規劃的軟體套件。1988。技術報告 DFVLR-FB 88-28, DLR 德國航空太空中心 – 飛行力學研究所,科隆,德國。
[13]Conn, A. R., Gould, N. I., 和 Toint, P. L. 信賴域方法。2000。Siam。pp. 169-200。
[14]F. Lenders, C. Kirches, A. Potschka: “trlib: 用於信賴域問題迭代解的 GLTR 方法的無向量實作”, arXiv:1611.04718
[15]N. Gould, S. Lucidi, M. Roma, P. Toint: “使用 Lanczos 方法求解信賴域子問題”, SIAM J. Optim., 9(2), 504–525, (1999)。
[16]Byrd, Richard H., Mary E. Hribar, 和 Jorge Nocedal。1999。用於大規模非線性規劃的內點演算法。SIAM 最佳化期刊 9.4: 877-900。
[17]Lalee, Marucha, Jorge Nocedal, 和 Todd Plantenga。1998。關於大規模等式約束最佳化演算法的實作。SIAM 最佳化期刊 8.3: 682-706。
[18]Ragonneau, T. M. 基於模型的無導數最佳化方法與軟體。博士論文,應用數學系,香港理工大學,香港,中國,2022。網址:https://theses.lib.polyu.edu.hk/handle/200/12294。
範例
讓我們考慮最小化 Rosenbrock 函數的問題。此函數(及其各自的導數)已在
rosen
(resp.rosen_der
,rosen_hess
)的scipy.optimize
中實作。>>> from scipy.optimize import minimize, rosen, rosen_der
Nelder-Mead 方法的一個簡單應用是
>>> x0 = [1.3, 0.7, 0.8, 1.9, 1.2] >>> res = minimize(rosen, x0, method='Nelder-Mead', tol=1e-6) >>> res.x array([ 1., 1., 1., 1., 1.])
現在使用 BFGS 演算法,使用一階導數和一些選項
>>> res = minimize(rosen, x0, method='BFGS', jac=rosen_der, ... options={'gtol': 1e-6, 'disp': True}) Optimization terminated successfully. Current function value: 0.000000 Iterations: 26 Function evaluations: 31 Gradient evaluations: 31 >>> res.x array([ 1., 1., 1., 1., 1.]) >>> print(res.message) Optimization terminated successfully. >>> res.hess_inv array([ [ 0.00749589, 0.01255155, 0.02396251, 0.04750988, 0.09495377], # may vary [ 0.01255155, 0.02510441, 0.04794055, 0.09502834, 0.18996269], [ 0.02396251, 0.04794055, 0.09631614, 0.19092151, 0.38165151], [ 0.04750988, 0.09502834, 0.19092151, 0.38341252, 0.7664427 ], [ 0.09495377, 0.18996269, 0.38165151, 0.7664427, 1.53713523] ])
接下來,考慮一個具有多個約束的最小化問題(即來自 [5] 的範例 16.4)。目標函數是
>>> fun = lambda x: (x[0] - 1)**2 + (x[1] - 2.5)**2
定義了三個約束條件如下
>>> cons = ({'type': 'ineq', 'fun': lambda x: x[0] - 2 * x[1] + 2}, ... {'type': 'ineq', 'fun': lambda x: -x[0] - 2 * x[1] + 6}, ... {'type': 'ineq', 'fun': lambda x: -x[0] + 2 * x[1] + 2})
並且變數必須為正數,因此有以下界限
>>> bnds = ((0, None), (0, None))
最佳化問題使用 SLSQP 方法解決,如下所示
>>> res = minimize(fun, (2, 0), method='SLSQP', bounds=bnds, ... constraints=cons)
它應該收斂到理論解 (1.4 ,1.7)。