SciPy, optimization

SciPy, optimization

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:

  1. 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)
  2. Optimization cruinne (mar eisimpleir: lagan-laighe, diofar_ mean-fhàs)
  3. 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)
  4. A’ lughdachadh gnìomhan sgalar aon chaochladair (minim_scalar) agus a’ lorg freumhaichean (root_scalar)
  5. 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:

SciPy, optimization

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.

import numpy as np

def rosen(x):
    """The Rosenbrock function"""
    return np.sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0, axis=0)

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()

SciPy, optimization

A bhith mothachail ro-làimh gur e 0 aig an ìre as ìsle SciPy, optimization, 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):

from scipy.optimize import minimize
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead',
    options={'xtol': 1e-8, 'disp': True})
print(res.x)

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.

x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='powell',
    options={'xtol': 1e-8, 'disp': True})
print(res.x)

Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 19
         Function evaluations: 1622
[1. 1. 1. 1. 1.]

Algorithm Broyden-Fletcher-Goldfarb-Shanno (BFGS).

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:

SciPy, optimization

SciPy, optimization

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:

SciPy, optimization

SciPy, optimization

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:

SciPy, optimization

far a bheil SciPy, optimization 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:

SciPy, optimization

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:

SciPy, optimization

SciPy, optimization

far a bheil SciPy, optimization и SciPy, optimization, a 'mìneachadh a' mhaitrix SciPy, optimization.

Tha na h-eileamaidean neo-neoni eile den mhaitrix co-ionann ri:

SciPy, optimization

SciPy, optimization

SciPy, optimization

SciPy, optimization

Mar eisimpleir, ann an àite còig-thaobhach N = 5, tha am matrix Hessian airson gnìomh Rosenbrock ann an cruth còmhlan:

SciPy, optimization

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 SciPy, optimization tha am foirm aige:

SciPy, optimization

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:

res = minimize(rosen, x0, method='trust-ncg',
               jac=rosen_der, hess=rosen_hess,
               options={'gtol': 1e-8, 'disp': True})
print(res.x)

Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 20
         Function evaluations: 21
         Gradient evaluations: 20
         Hessian evaluations: 19
[1. 1. 1. 1. 1.]

Eisimpleir le gnìomh toraidh an Hessian agus vectar neo-riaghailteach:

res = minimize(rosen, x0, method='trust-ncg', 
                jac=rosen_der, hessp=rosen_hess_p, 
                options={'gtol': 1e-8, 'disp': True})
print(res.x)

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.

Eisimpleir le lùghdachadh air gnìomh Rosenbrock:

res = minimize(rosen, x0, method='trust-exact',
               jac=rosen_der, hess=rosen_hess,
               options={'gtol': 1e-8, 'disp': True})
res.x

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.

Source: https://docs.scipy.org/doc/scipy/reference/

Source: www.habr.com

Cuir beachd ann