Tha SciPy (air fhuaimneachadh sai pie) na phasgan tagraidh matamataigeach stèidhichte air an leudachadh Numpy Python. Le SciPy, bidh an seisean Python eadar-ghnìomhach agad gu bhith mar an aon saidheans dàta iomlan agus àrainneachd prototyping siostam iom-fhillte ri MATLAB, IDL, Octave, R-Lab, agus SciLab. An-diugh tha mi airson bruidhinn goirid mu mar a chleachdas tu cuid de algorithms optimization ainmeil anns a ’phacaid scipy.optimize. Gheibhear cuideachadh nas mionaidiche agus nas ùire mu bhith a’ cleachdadh ghnìomhan a’ cleachdadh an àithne cuideachaidh () no a’ cleachdadh Shift + Tab.
Ro-ràdh
Gus thu fhèin agus luchd-leughaidh a shàbhaladh bho bhith a’ lorg agus a’ leughadh prìomh thùsan, bidh ceanglaichean gu tuairisgeulan de dhòighean-obrach gu ìre mhòr air Wikipedia. Mar riaghailt, tha am fiosrachadh seo gu leòr gus tuigse fhaighinn air na dòighean coitcheann agus na cumhaichean airson an cleachdadh. Gus brìgh dhòighean matamataigeach a thuigsinn, lean na ceanglaichean gu foillseachaidhean nas ùghdarrasail, a gheibhear aig deireadh gach artaigil no anns an einnsean sgrùdaidh as fheàrr leat.
Mar sin, tha am modal scipy.optimize a’ toirt a-steach buileachadh nam modhan a leanas:
Lùghdachadh cumhach agus gun chumhachan air gnìomhan sgalar grunn chaochladairean (as ìsle) a’ cleachdadh diofar algoirmean (Nelder-Mead simplex, BFGS, caiseadan co-chuingealaichte Newton, COBILA и SLSQP)
A 'lùghdachadh na tha air fhàgail MNC (as lugha_squares) agus algoirmean uidheamachadh lùb a’ cleachdadh na ceàrnagan as lugha (curve_fit)
A’ lughdachadh gnìomhan sgalar aon chaochladair (minim_scalar) agus a’ lorg freumhaichean (root_scalar)
Fuasgladairean ioma-thaobhach de shiostam co-aontaran (freumh) a’ cleachdadh diofar algoirmean (hybrid Powell, Levenberg-Marquardt no dòighean mòra leithid Newton-Krylov).
San artaigil seo cha bheachdaich sinn ach air a’ chiad rud bhon liosta iomlan seo.
Lùghdachadh gun chumhachan air gnìomh sgalar grunn chaochladairean
Tha an gnìomh as ìsle bhon phasgan scipy.optimize a’ toirt seachad eadar-aghaidh coitcheann airson fuasgladh fhaighinn air duilgheadasan lughdachadh cumhach agus gun chumhachan de ghnìomhan sgalar grunn chaochladairean. Gus sealltainn mar a tha e ag obair, bidh feum againn air gnìomh iomchaidh de ghrunn chaochladairean, a lughdaicheas sinn ann an diofar dhòighean.
Airson na h-adhbharan sin, tha gnìomh Rosenbrock de chaochladairean N foirfe, aig a bheil an fhoirm:
A dh 'aindeoin gu bheil gnìomh Rosenbrock agus na matrices Jacobi agus Hessian (a' chiad agus an dàrna toradh, fa leth) air am mìneachadh mar-thà anns a 'phacaid scipy.optimize, mìnichidh sinn sinn fhìn.
Airson soilleireachd, tarraingidh sinn a-steach 3D luachan gnìomh Rosenbrock de dhà chaochladair.
Còd tarraing
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
# Настраиваем 3D график
fig = plt.figure(figsize=[15, 10])
ax = fig.gca(projection='3d')
# Задаем угол обзора
ax.view_init(45, 30)
# Создаем данные для графика
X = np.arange(-2, 2, 0.1)
Y = np.arange(-1, 3, 0.1)
X, Y = np.meshgrid(X, Y)
Z = rosen(np.array([X,Y]))
# Рисуем поверхность
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm)
plt.show()
A bhith mothachail ro-làimh gur e 0 aig an ìre as ìsle , leig dhuinn sùil a thoirt air eisimpleirean air mar a cho-dhùineas tu an luach as ìsle de ghnìomh Rosenbrock a’ cleachdadh diofar mhodhan scipy.optimize.
Modh sìmplidh Nelder-Mead
Biodh puing tòiseachaidh x0 ann ann an àite 5-mheudach. Feuch an lorg sinn a’ phuing as ìsle den ghnìomh Rosenbrock as fhaisge air a’ cleachdadh an algairim Nelder-Mead simplex (tha an algairim air a shònrachadh mar luach paramadair an dòigh):
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 339
Function evaluations: 571
[1. 1. 1. 1. 1.]
Is e an dòigh simplex an dòigh as sìmplidh air gnìomh a tha air a mhìneachadh gu soilleir agus gu math rèidh a lughdachadh. Chan fheum e toraidhean gnìomh obrachadh a-mach; tha e gu leòr airson a luachan a shònrachadh a-mhàin. Tha an dòigh Nelder-Mead na dheagh roghainn airson duilgheadasan lughdachadh sìmplidh. Ach, leis nach eil e a’ cleachdadh tuairmsean caisead, dh’ fhaodadh gun toir e nas fhaide an ìre as ìsle a lorg.
Modh Powell
Is e algorithm optimization eile anns nach eil ach na luachan gnìomh air an tomhas Dòigh-obrach Powell. Gus a chleachdadh, feumaidh tu modh = 'powell' a shuidheachadh anns a 'ghnìomh as ìsle.
Gus co-ghluasad nas luaithe fhaighinn gu fuasgladh, am modh-obrach BFGS a’ cleachdadh caisead an gnìomh amas. Faodar an caisead a shònrachadh mar ghnìomh no obrachadh a-mach a’ cleachdadh eadar-dhealachaidhean ciad òrdugh. Ann an suidheachadh sam bith, mar as trice bidh modh BFGS a 'feumachdainn nas lugha de ghlaidhean gnìomh na an dòigh simplex.
Lorg sinn toradh gnìomh Rosenbrock ann an cruth anailis:
Tha an abairt seo dligheach airson derivatives de gach caochladair ach a-mhàin a’ chiad agus an tè mu dheireadh, a tha air am mìneachadh mar:
Nach toir sinn sùil air a’ ghnìomh Python a bhios a’ tomhas a’ chaise seo:
def rosen_der (x):
xm = x [1: -1]
xm_m1 = x [: - 2]
xm_p1 = x [2:]
der = np.zeros_like (x)
der [1: -1] = 200 * (xm-xm_m1 ** 2) - 400 * (xm_p1 - xm ** 2) * xm - 2 * (1-xm)
der [0] = -400 * x [0] * (x [1] -x [0] ** 2) - 2 * (1-x [0])
der [-1] = 200 * (x [-1] -x [-2] ** 2)
return der
Tha gnìomh àireamhachaidh caisead air a shònrachadh mar luach paramadair jac den ghnìomh as ìsle, mar a chithear gu h-ìosal.
res = minimize(rosen, x0, method='BFGS', jac=rosen_der, options={'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 25
Function evaluations: 30
Gradient evaluations: 30
[1.00000004 1.0000001 1.00000021 1.00000044 1.00000092]
Algorithm caisead conjugate (Newton)
Algorithm caiseadan conjugate Newton Is e dòigh Newton atharraichte a th’ ann.
Tha dòigh Newton stèidhichte air a bhith a’ tuairmseachadh gnìomh ann an sgìre ionadail le polynomial den dàrna ìre:
far a bheil Is e matrix an dàrna derivatives ( Hessian matrix , Hessian ).
Ma tha an Hessian dearbhach dearbhach, gheibhear an ìre as lugha gu h-ionadail den ghnìomh seo le bhith a’ co-aontar caisead neoni na cruth ceithir-cheàrnach ri neoni. Is e an toradh an abairt:
Tha an Hessian inverse air a thomhas a’ cleachdadh an dòigh caisead conjugate. Tha eisimpleir de bhith a’ cleachdadh an dòigh seo gus gnìomh Rosenbrock a lughdachadh air a thoirt seachad gu h-ìosal. Gus an dòigh Newton-CG a chleachdadh, feumaidh tu gnìomh a shònrachadh a nì àireamhachadh an Hessian.
Tha gnìomh Hessian an Rosenbrock ann an cruth anailis co-ionann ri:
far a bheil и , a 'mìneachadh a' mhaitrix .
Tha na h-eileamaidean neo-neoni eile den mhaitrix co-ionann ri:
Mar eisimpleir, ann an àite còig-thaobhach N = 5, tha am matrix Hessian airson gnìomh Rosenbrock ann an cruth còmhlan:
Còd a bhios ag obrachadh a-mach an Hessian seo còmhla ri còd airson gnìomh Rosenbrock a lughdachadh a’ cleachdadh an dòigh caisead conjugate (Newton):
def rosen_hess(x):
x = np.asarray(x)
H = np.diag(-400*x[:-1],1) - np.diag(400*x[:-1],-1)
diagonal = np.zeros_like(x)
diagonal[0] = 1200*x[0]**2-400*x[1]+2
diagonal[-1] = 200
diagonal[1:-1] = 202 + 1200*x[1:-1]**2 - 400*x[2:]
H = H + np.diag(diagonal)
return H
res = minimize(rosen, x0, method='Newton-CG',
jac=rosen_der, hess=rosen_hess,
options={'xtol': 1e-8, 'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 24
Function evaluations: 33
Gradient evaluations: 56
Hessian evaluations: 24
[1. 1. 1. 0.99999999 0.99999999]
Eisimpleir le mìneachadh air gnìomh toraidh an Hessian agus vectar neo-riaghailteach
Ann an duilgheadasan san t-saoghal fhìor, faodaidh coimpiutaireachd agus stòradh matrix Hessian gu lèir a bhith feumach air mòran ùine agus goireasan cuimhne. Anns a 'chùis seo, chan eil feum air matrix Hessian fhèin a shònrachadh, oir chan fheum am modh lughdachadh ach vectar co-ionann ri toradh an Hessian le vectar neo-riaghailteach eile. Mar sin, bho shealladh àireamhachd, tha e mòran nas fheàrr a bhith a’ mìneachadh gnìomh sa bhad a thilleas toradh toradh an Hessian le vectar neo-riaghailteach.
Beachdaich air gnìomh hess, a bheir am vectar lughdachadh mar a’ chiad argamaid, agus vectar neo-riaghailteach mar an dàrna argamaid (còmhla ri argamaidean eile mun ghnìomh ri lughdachadh). Anns a ’chùis againn, chan eil e glè dhoirbh obrachadh a-mach toradh gnìomh Hessian of the Rosenbrock le vectar neo-riaghailteach. Ma tha p na vectar neo-riaghailteach, an uairsin an toradh tha am foirm aige:
Tha an gnìomh a bhios a’ tomhas toradh an Hessian agus vectar neo-riaghailteach air a thoirt seachad mar luach na h-argamaid hessp chun a’ ghnìomh as lugha:
def rosen_hess_p(x, p):
x = np.asarray(x)
Hp = np.zeros_like(x)
Hp[0] = (1200*x[0]**2 - 400*x[1] + 2)*p[0] - 400*x[0]*p[1]
Hp[1:-1] = -400*x[:-2]*p[:-2]+(202+1200*x[1:-1]**2-400*x[2:])*p[1:-1]
-400*x[1:-1]*p[2:]
Hp[-1] = -400*x[-2]*p[-2] + 200*p[-1]
return Hp
res = minimize(rosen, x0, method='Newton-CG',
jac=rosen_der, hessp=rosen_hess_p,
options={'xtol': 1e-8, 'disp': True})
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 24
Function evaluations: 33
Gradient evaluations: 56
Hessian evaluations: 66
Algorithm sgìre earbsa caisead conjugate (Newton)
Faodaidh droch shuidheachadh matrix Hessian agus stiùireadh sgrùdaidh ceàrr adhbhrachadh gu bheil algairim caisead co-chuingealaichte Newton neo-èifeachdach. Ann an leithid de shuidheachaidhean, thathar a 'toirt seachad roghainn modh sgìre earbsa (sgìre earbsa) a’ ceangal caisead Newton.
Eisimpleir leis a’ mhìneachadh air matrix Hessian:
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 20
Function evaluations: 21
Gradient evaluations: 20
Hessian evaluations: 0
[1. 1. 1. 1. 1.]
Seòrsa de dhòighean Krylov
Coltach ris an dòigh earbsa-ncg, tha dòighean seòrsa Krylov gu math freagarrach airson fuasgladh fhaighinn air duilgheadasan mòra oir chan eil iad a’ cleachdadh ach toraidhean matrix-vector. Is e an rud as cudromaiche dhaibh fuasgladh fhaighinn air duilgheadas ann an sgìre misneachd a tha cuingealaichte le fo-àite Krylov a tha air a thionndadh. Airson duilgheadasan mì-chinnteach, tha e nas fheàrr an dòigh seo a chleachdadh, leis gu bheil e a ’cleachdadh àireamh nas lugha de dh’ ath-aithrisean neo-loidhneach mar thoradh air an àireamh nas lugha de thoraidhean matrix-vector gach fo-thrioblaid, an taca ris an dòigh earbsa-ncg. A bharrachd air an sin, lorgar am fuasgladh don fho-thrioblaid ceithir-cheàrnach ann an dòigh nas cruinne na bhith a’ cleachdadh modh trust-ncg.
Eisimpleir leis a’ mhìneachadh air matrix Hessian:
res = minimize(rosen, x0, method='trust-krylov',
jac=rosen_der, hess=rosen_hess,
options={'gtol': 1e-8, 'disp': True})
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 19
Function evaluations: 20
Gradient evaluations: 20
Hessian evaluations: 18
print(res.x)
[1. 1. 1. 1. 1.]
Eisimpleir le gnìomh toraidh an Hessian agus vectar neo-riaghailteach:
res = minimize(rosen, x0, method='trust-krylov',
jac=rosen_der, hessp=rosen_hess_p,
options={'gtol': 1e-8, 'disp': True})
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 19
Function evaluations: 20
Gradient evaluations: 20
Hessian evaluations: 0
print(res.x)
[1. 1. 1. 1. 1.]
Algorithm airson fuasgladh tuairmseach anns an roinn misneachd
Tha a h-uile modh (Newton-CG, trust-ncg agus trust-krylov) gu math freagarrach airson fuasgladh fhaighinn air duilgheadasan mòra (le mìltean de chaochladairean). Tha seo air sgàth gu bheil an algairim caisead conjugate bunasach a’ ciallachadh gu bheil tuairmse tuairmseach air a’ mhaitrix Hessian inverse. Tha am fuasgladh air a lorg gu ath-aithriseach, gun leudachadh soilleir air an Hessian. Leis nach fheum thu ach gnìomh a mhìneachadh airson toradh Hessian agus vectar neo-riaghailteach, tha an algairim seo gu sònraichte math airson a bhith ag obair le matrices gann (còmhlan trastain). Bheir seo seachad cosgaisean cuimhne ìosal agus sàbhalaidhean mòra ùine.
Airson duilgheadasan meadhanach mòr, chan eil cosgais stòradh agus factar an Hessian deatamach. Tha seo a’ ciallachadh gu bheil e comasach fuasgladh fhaighinn ann an nas lugha de dh’ ath-aithrisean, a’ fuasgladh dhuilgheadasan roinn an urrais cha mhòr dìreach. Gus seo a dhèanamh, thèid cuid de cho-aontaran neo-loidhneach fhuasgladh gu ath-aithriseach airson gach fo-thrioblaid ceithir-cheàrnach. Mar as trice bidh fuasgladh mar seo a 'feumachdainn 3 no 4 lobhadh Cholesky de mhaitris Hessian. Mar thoradh air an sin, bidh an dòigh-obrach a’ tighinn còmhla ann an nas lugha de dh’ ath-aithrisean agus a’ feumachdainn nas lugha de àireamhachadh gnìomh amas na dòighean roinn misneachd eile a chaidh a chuir an gnìomh. Chan eil an algairim seo a’ toirt a-steach ach a bhith a’ dearbhadh matrix iomlan Hessian agus chan eil e a’ toirt taic don chomas gnìomh toraidh an Hessian agus vectar neo-riaghailteach a chleachdadh.
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 13
Function evaluations: 14
Gradient evaluations: 13
Hessian evaluations: 14
array([1., 1., 1., 1., 1.])
Is dòcha gun stad sinn an sin. Anns an ath artaigil feuchaidh mi ris na rudan as inntinniche innse mu lughdachadh cumhach, cleachdadh lughdachadh ann a bhith a’ fuasgladh dhuilgheadasan tuairmseachaidh, a’ lughdachadh gnìomh aon chaochladair, lughdachaidhean neo-riaghailteach, agus lorg freumhan siostam de cho-aontaran a’ cleachdadh an scipy.optimize paca.