python实例 优化目标函数_python scipy optimize.minimize用法及代码示例
最小化一個或多個變量的標量函數。
參數:
fun:callable目標函數要最小化。
fun(x, *args) -> float
其中x是具有(n,)形狀的一維數組,而args是完全指定函數所需的固定參數的元組。
x0:ndarray, shape (n,)初步猜測。大小為(n,)的實數元素的數組,其中‘n’是自變量的數量。
args:tuple, 可選參數額外的參數傳遞給目標函數及其派生函數(fun,jac和hess函數)。
method:str 或 callable, 可選參數求解器類型。應該是其中之一
‘Nelder-Mead’ (see here)
‘Newton-CG’ (see here)
‘L-BFGS-B’ (see here)
‘trust-constr’(see here)
‘trust-ncg’ (see here)
‘trust-exact’ (see here)
‘trust-krylov’ (see here)
custom - a callable object (added in version 0.14.0),
see below for description.
如果未給出,則選擇為以下之一BFGS,L-BFGS-B,SLSQP,取決于問題是否具有約束或界限。
jac:{callable, ‘2-point’, ‘3-point’, ‘cs’, bool}, 可選參數梯度矢量的計算方法。僅適用于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是具有固定參數的元組?;蛘?#xff0c;關鍵字{“ 2點”,“ 3點”,‘cs’}選擇用于梯度的數字估計的有限差分方案。選項“ 3點”和‘cs’僅對“ trust-constr”可用。如果jac是布爾值且為True,則假定fun與目標函數一起返回梯度。如果為False,則將使用“兩點”有限差分估算來估算梯度。
hess:{callable, ‘2-point’, ‘3-point’, ‘cs’, HessianUpdateStrategy}, 可選參數計算黑森州矩陣的方法。僅適用于Newton-CG,狗腿,trust-ncg,trust-krylov,trust-exact和trust-constr。如果可調用,則應返回黑森州矩陣:
hess(x, *args) -> {LinearOperator, spmatrix, array}, (n, n)
其中x是(n,)ndarray,而args是具有固定參數的元組。只有“ trust-constr”方法才允許使用LinearOperator和稀疏矩陣返回。另外,關鍵字{“ 2點”,“ 3點”,‘cs’}選擇用于數字估計的有限差分方案?;蛘?#xff0c;對象實現HessianUpdateStrategy界面可用于近似Hessian。實現此接口的可用quasi-Newton方法是:
每當通過finite-differences估算坡度時,就無法使用選項{'2-point','3-point',‘cs’}估算Hessian,而需要使用quasi-Newton策略之一估算。 Finite-difference選項{“ 2點”,“ 3點”,‘cs’}和HessianUpdateStrategy僅適用于“ trust-constr”方法。
hessp:callable, 可選參數目標函數的Hessian乘以任意向量p。僅適用于Newton-CG,trust-ncg,trust-krylov,trust-constr。只需給出一個或多個。如果提供了hess,則hessp將被忽略。 hessp必須計算一個任意向量的Hessian時間:
hessp(x, p, *args) ->? ndarray shape (n,)
其中x是(n,)ndarray,p是維度(n,)的任意向量,而args是具有固定參數的元組。
bounds:sequence 或 Bounds, 可選參數L-BFGS-B,TNC,SLSQP和trust-constr方法的變量界限。有兩種方法可以指定范圍:
Instance of Bounds class.
Sequence of (min, max) pairs for each element in x. None
is used to specify no bound.
constraints:{Constraint, dict} 或 List of {Constraint, dict}, 可選參數約束定義(僅適用于COBYLA,SLSQP和trust-constr)。 “ trust-constr”的約束定義為指定優化問題約束的單個對象或對象列表??捎玫募s束是:
COBYLA,SLSQP的約束定義為詞典列表。每個帶有字段的字典:
typestrConstraint type:‘eq’ for equality, ‘ineq’ for inequality.
funcallableThe function defining the constraint.
jaccallable, optionalThe Jacobian of fun (only for SLSQP).
argssequence, optionalExtra arguments to be passed to the function and Jacobian.
等式約束表示約束函數結果為零,而不等式表示約束函數結果為非負數。請注意,COBYLA僅支持不平等約束。
tol:float, 可選參數終止公差。要進行詳細控制,請使用solver-specific選項。
options:dict, 可選參數求解器選項字典。所有方法都接受以下通用選項:
maxiterintMaximum number of iterations to perform. Depending on the
method each iteration may use several function evaluations.
dispboolSet to True to print convergence messages.
有關method-specific選項,請參見show_options。
callback:callable, 可選參數每次迭代后調用。對于“ trust-constr”,該調用帶有簽名:
callback(xk, OptimizeResult state) -> bool
其中xk是當前參數向量。和state是一個OptimizeResult對象,其字段與返回字段相同。如果回調返回True,則算法執行終止。對于所有其他方法,簽名為:
callback(xk)
其中xk是當前參數向量。
返回值:
res:優化結果優化結果表示為OptimizeResult Object 。重要屬性是:x解決方案數組,success布爾值標志,指示優化程序是否成功退出,以及message描述終止的原因??吹絆ptimizeResult用于其他屬性的描述。
注意:
本節介紹可以通過‘method’參數選擇的可用求解器。默認方法是BFGS。
無約束最小化
方法Nelder-Mead使用單純形算法[1],[2]。該算法在許多應用中都很健壯。但是,如果可以信任導數的數值計算,則使用一階和/或二階導數信息的其他算法通??赡軙?#xff0c;因為它們的性能更好。
方法鮑威爾是鮑威爾方法的修改[3],[4]這是共軛方向法。它沿著方向集的每個向量(選項和信息中的direc字段)執行順序的一維最小化,并在主最小化循環的每次迭代時更新。函數不必是可微的,并且不采用任何導數。
方法CG使用Polak和Ribiere的非線性共軛梯度算法,這是Fletcher-Reeves方法的一種變種,在[5]第120-122頁。僅使用一階導數。
方法BFGS使用Broyden,Fletcher,Goldfarb和Shanno(BFGS)的quasi-Newton方法[5]pp。136.它僅使用一階導數。事實證明,BFGS即使對于非平滑優化也具有良好的性能。此方法還返回Hessian逆的近似值,存儲為OptimizeResult對象中的hess_inv。
方法Newton-CG使用Newton-CG算法[5]168頁(也稱為截斷牛頓法)。它使用CG方法來計算搜索方向。另請參見TNC方法,用于使用類似算法最小化box-constrained。適用于large-scale問題。
方法狗腿使用dog-leg trust-region算法[5]無限制的最小化。該算法需要梯度和Hessian。此外,Hessian必須是正定的。
方法trust-ncg使用牛頓共軛梯度trust-region算法[5]無限制的最小化。該算法需要梯度和Hessian或計算給定向量的Hessian乘積的函數。適用于large-scale問題。
方法trust-krylov使用牛頓GLTR trust-region算法[14],[15]無限制的最小化。該算法需要梯度和Hessian或計算給定向量的Hessian乘積的函數。適用于large-scale問題。在不確定的問題上,與trust-ncg方法相比,它通常需要較少的迭代,建議將其用于中等和large-scale問題。
方法trust-exact是用于無約束最小化的trust-region方法,其中幾乎完全解決了二次子問題[13]。此算法需要漸變和Hessian(不需要為正定)。在許多情況下,牛頓法收斂性較小,對于medium-size小問題最推薦。
Bound-Constrained最小化
方法L-BFGS-B使用L-BFGS-B算法[6],[7]用于約束約束的最小化。
方法TNC使用截斷的牛頓算法[5],[8]最小化帶有變量的函數。該算法使用梯度信息。它也被稱為牛頓Conjugate-Gradient。它與上述的Newton-CG方法不同,因為它包裝了C實現,并允許為每個變量指定上限和下限。
約束最小化
方法COBYLA使用線性逼近約束優化(COBYLA)方法[9],[10],[11]。該算法基于目標函數和每個約束的線性近似。該方法包裝了該算法的FORTRAN實現。約束函數‘fun’可以返回單個數字或數字數組或數字列表。
方法SLSQP使用順序最小二乘編程來最小化具有界限,相等和不等式約束的任意組合的多個變量的函數。該方法包裝了Dieter Kraft最初實現的SLSQP Optimization子例程。[12]。請注意,包裝器通過將無限值轉換為大的浮動值來處理范圍內的無限值。
方法trust-constr是用于約束優化的trust-region算法。它根據問題定義在兩種實現方式之間切換。它是SciPy中實現的最通用的約束最小化算法,最適合large-scale問題。對于等式約束問題,它是Byrd-Omojokun Trust-Region SQP方法的實現,如[17]和在[5],第549.當同樣施加不平等約束時,它也適用于trust-region內部點方法,該方法在[16]。反過來,此內點算法通過引入松弛變量并為障礙參數逐漸減小的值解決一 Series equality-constrained障礙問題,從而解決了不等式約束。前面描述的等式約束SQP方法用于隨著迭代次數越來越接近解決方案而以提高的準確度來解決子問題。
Finite-Difference選項
方法trust-constr可以使用三種finite-difference方案({'2-point','3-point',‘cs’})對梯度和Hessian進行近似。方案‘cs’可能是最準確的,但它需要具有正確處理復雜輸入并在復雜平面中可微分的函數。方案“ 3點”比“方案2點”更準確,但是需要兩倍的操作量。
自定義最小化器
傳遞自定義最小化方法可能很有用,例如,在使用這種方法的前端時,例如scipy.optimize.basinhopping或其他 Library 。您可以簡單地將callable作為method參數。
可調用的稱為method(fun, x0, args, **kwargs, **options)其中kwargs對應于傳遞給的任何其他參數minimize(例如回調,粗體等等),但選項dict除外,其內容也成對地作為方法參數傳遞。此外,如果jac已作為bool類型傳遞,則jac和fun會受到干擾,以便fun僅返回函數值,而jac會轉換為返回Jacobian函數的函數。該方法應返回OptimizeResult Object 。
提供的可調用方法必須能夠接受(并可能忽略)任意參數;接受的參數集minimize可能會在將來的版本中擴展,然后將這些參數傳遞給該方法。您可以在scipy.optimize教程中找到一個示例。
0.11.0版中的新函數。
參考文獻:
Nelder,J A和R Mead。 1965年。一種用于函數最小化的單純形方法。計算機雜志7:308-13。
Wright M. H.,1996年。直接搜索方法:在1995年的“數值分析”中被輕蔑,現在受到尊重:1995年的鄧迪兩年一次的數值分析會議論文集(編者D F Griffiths和G A Watson)。 Addison Wesley Longman,英國哈洛。 191-208。
Powell,M J D. 1964年。一種無需計算導數即可找到多個變量的最小值的有效方法。計算機雜志7:155-162。
按W,S A Teukolsky,W T Vetterling和B P Flannery。數字食譜(任何版本),劍橋大學出版社。
5(1,2,3,4,5,6,7,8)
Nocedal,J和S J Wright。 2006。數值優化。紐約施普林格。
伯德,R H和P Lu和J. Nocedal。 1995。有限約束算法的約束約束優化。 SIAM科學與統計計算雜志16(5):1190-1208。
Zhu,C和R H Byrd和J Nocedal。 1997。L-BFGS-B:算法778:L-BFGS-B,用于大規模約束優化的FORTRAN例程。數學軟件上的ACM交易23(4):550-560。
納什(Nash),SG。Newton-Type通過Lanczos方法最小化。 1984年。SIAM數值分析雜志21:770-778。
Powell,M JD。一種直接搜索優化方法,通過線性插值對目標函數和約束函數進行建模。 1994年?!秲灮蛿抵捣治龅倪M展》,編輯。 S. Gomez和J-P Hennart,Kluwer Academic(Dordrecht),51-67。
Powell M JD。用于優化計算的直接搜索算法。 1998.Acta Numerica 7:287-336。
Powell M JD。沒有導數的優化算法的觀點。 2007.劍橋大學技術報告DAMTP 2007 /NA03
Kraft,D。用于順序二次編程的軟件包。 1988年。代表DFVLR-FB 88-28,DLR德國航空航天中心-德國科隆飛行力學研究所。
Conn,A. R.,Gould,N.I.和Toint,P. L.信任區域方法。 2000。暹羅。第169-200頁。
F. Lenders,C。Kirches,A。Potschka:“ trlib:GLTR方法的vector-free實現,用于迭代解決信任區問題”,https://arxiv.org/abs/1611.04718
N. Gould,S。Lucidi,M。Roma,P。Toint:“使用Lanczos方法解決Trust-Region子問題”,SIAM J. Optim。,9(2),504-525,(1999)。
伯德(Richard H.),理查德·H·巴爾(Mary E. 1999。用于large-scale非線性編程的內點算法。 SIAM優化雜志9.4:877-900。
Lalee,Marucha,Jorge Nocedal和Todd Plantega。 1998年。關于large-scale等式約束優化的算法的實現。 SIAM Journal on Optimization 8.3:682-706。
例子:
讓我們考慮最小化Rosenbrock函數的問題。此函數(及其相應的派生)在以下位置實現rosen(分別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]])
接下來,考慮一個具有多個約束的最小化問題(即示例16.4)。[5])。目標函數是:
>>> 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)。
總結
以上是生活随笔為你收集整理的python实例 优化目标函数_python scipy optimize.minimize用法及代码示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付系统详解:清结算系统
- 下一篇: Python爬取链家成都二手房源信息