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