SciPy, ipsum

SciPy, ipsum

SciPy (pronuntiatum sai pie) est schedula mathematicae applicata in extensione Numpy Pythonis. Cum SciPy, sessionis tuae Pythonis interactiva eadem notitia plenaria fit scientiarum et complexorum ratio prototypationis ambitus cum MATLAB, IDL, Octava, R-Lab, et SciLab. Hodie breviter loqui volo quomodo algorithmis in scipy.optimize nota optimae notae utaris. Plus detailed et up-ad-date auxilium adhibitis functionibus semper obtineri potest utens adiutorium () mandatum vel utens Shift+Tab.

introduction

Ut te et lectorem serves ab inquisitione et lectione prima fontium, nexus cum descriptionibus methodorum in Vicipaedia principaliter erunt. Pro regula haec notitia sufficiens est ad intelligendas modos generales terminos et conditiones earum applicationis. Ad cognoscendam rationem methodorum mathematicarum, nexus sequere ad publicationes auctoritatives magis, quae in fine cuiusque articuli vel in indagatio tua inquisitionis inveniri possunt.

Sic, scipy.optimize modulus exsecutionem includit processus sequentis:

  1. Conditionalis et sine exceptione minimizatio functionum scalarium plurium variabilium variabilium (minimum) utens variis algorithmis (Nelder-Mead simplex, BFGS, Newton gradientibus coniugatis; COBYLA и SLSQP)
  2. Optimization Global (exempli gratia: basinhopping, diff_evolution)
  3. Minima residuals MNC (Least_squares) et curvam decet algorithms uti nonlinearibus minus quadratis (curve_fit)
  4. Functiones scalares minimae unius variabilis (minim_scalaris) et radices quaerentes (root_scalar)
  5. Solventium multidimensionalium systematis aequationum (radix) variis algorithmis utentibus (hybrid Powell; Levenberg-Marquardt aut magnis modis ut Newton-Krylov).

In hoc articulo primum solum ex toto hoc indice tractabimus.

Minutionem absolutam functionis scalaris plurium variabilium

Munus minimum a scipy.optimize sarcina praebet instrumentum generale ad solvendas difficultates conditionales et absolutas minimizationes functionum scalarium plurium variabilium. Ad demonstrandum quomodo operatur, apta functione plurium variabilium indigebimus, quae diversimode extenuentur.

Ad haec, Rosenbrock munus variabilium N variabilium perfectum est, quae formam habet;

SciPy, ipsum

Quamvis Rosenbrock munus ac matrices eius Jacobi et Hessiani (derivationes primae et secundae respective) in scipy.optimize sarcina iam definitae sint, nos ipsum definiemus.

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)

Ad evidentiam, ducamus in 3D valores functionis Rosenbrock duarum variabilium.

Drawing codice

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, ipsum

Sciens ante quod minimum est 0 at SciPy, ipsum, inspiciamus exempla quomodo determinare valorem minimi muneris Rosenbrock variis scipy.optimize procedendi utendi.

Nelder-Mead simplex methodus

Sit punctum initiale x0 in spatio 5 dimensionis. Invenimus punctum minimum munus Rosenbrock proximum ei utendo algorithmo Nelder-Mead simplex (Algorithmus specificatur valor methodi parametri);

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.]

Methodus simplex est via simplicissima ad munus explicitum et satis lenis extenuandum. Non eget derivationibus functionis computandis, sed tantum bona sua satis est specificare. Methodus Nelder-Mead est bona electio pro simplicibus quaestionibus minimizationis. Cum autem non utitur aestimationes clivosas, potest capere diutius minimum invenire.

Powell modum

Alius algorithmus optimizatio in qua solum valores functiones computantur Powell methodus. Utamur, debes methodum = 'powell' in minimo functione ponere.

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.]

Broyden-Fletcher-Goldfarb-Shanno (BFGS) algorithmus

Ad obtinendam citius concursum ad solutionem procedendi BFGS clivo utitur ad munus obiectivum. Clivus specificari potest ut functio vel computata differentiarum ordinis primi. Utcumque, methodus BFGS typice postulat functionem pauciorem quam methodus simplex vocat.

Inveniamus derivativam functionis Rosenbrock in forma analytica:

SciPy, ipsum

SciPy, ipsum

Haec dictio valet pro derivatis omnium variabilium praeter primam et ultimam, quae definiuntur:

SciPy, ipsum

SciPy, ipsum

Intueamur munus Pythonis qui hanc clivum reputet:

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

Munus calculi gradientis specificatur ut valor parametri jacti muneris minimi, ut infra ostendetur.

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]

Algorithmus Conjugatus (Newton)

algorithm Gradientes Newtoni coniugatum Newtoni modus est modificatio.
Methodus Newtoni fundata est accedens functioni in area locali per polynomiam secundi gradus;

SciPy, ipsum

quibus SciPy, ipsum est matrix secundarum derivationum (matrix Hessica, Hessian).
Si Hessian positivus sit definitus, loci minimum huius functionis inveniri potest per aequationem zephyris formae quadratae nulla. Eveniet ut dictumst;

SciPy, ipsum

Inversa Hessica computatur utendi methodo clivi coniugatae. Exemplum huius methodi utendi ad munus Rosenbrock obscurandum infra exhibetur. Uti methodo Newton-CG, functionem Hessicam computantem denotare debes.
Aequale functioni Hessiae Rosenbrock in forma analytica;

SciPy, ipsum

SciPy, ipsum

quibus SciPy, ipsum и SciPy, ipsum, Definire matrix SciPy, ipsum.

Reliqua non- nulla elementa matricis aequalia sunt;

SciPy, ipsum

SciPy, ipsum

SciPy, ipsum

SciPy, ipsum

Exempli gratia, in spatio quinque dimensiva N = 5, matrix Hessica pro Rosenbrock functionem formam cohortis habet;

SciPy, ipsum

Codex qui hunc Hessianum computat una cum codice ad munus Rosenbrock obscurandum utendi methodi coniugatae (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]

Exemplum de definitione producti functionis Hessici et vectoris arbitrarii

In quaestionibus reali-mundanis, computando et recondendo totam matrix Hessicam, tempus et facultates memoriae significantes requirere possunt. Hoc in casu, omnino opus non est ipsam matricem Hessicam denotare, quia modo procedendi minimization requirit vectorem aequalem facto Hessiae cum alio vectore arbitrario. Ita, ex ratione computativa, multo anteponenda est statim definire functionem quae redit effectus producti Hessici cum vectore arbitrario.

Considera hess munus, quod vector minimization accipit ut primum argumentum et vector arbitrarius ut secundum argumentum (una cum aliis argumentis functionis minimized). In casu nostro, calculando factum functionis Hessiae de Rosenbrock cum vectore arbitrario non est difficillimum. Si p arbitraria vector, deinde producto SciPy, ipsum formam habet;

SciPy, ipsum

Munus quod computans productum Hessiae et vectoris arbitrarii redditur ut valor argumenti hessp ad munus extenuandum;

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

Algorithmus (Newton)

Pauper conditio matricis Hessicae et directiones falsae inquisitionis causare potest algorithmum Neutoni coniugatum gradientem inefficacem esse. In huiusmodi casibus praeponitur confidunt regione modum Graduum conjugatorum Newton.

Exemplum cum definitione matricis Hessicae:

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.]

Exemplum de facto functionis Hessiae et vectoris arbitrarii;

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.]

Krylov generis modi

Sicut methodus fiduciaria, Krylov-type methodi bene aptae sunt ad solvendas difficultates magnas scalas, quia solum products matrix-vector utuntur. Essentia eorum est problema solvere in fiducia regionis Krylov subspatii finito. Pro incertis quaestionibus melius est hac methodo uti, quia utitur paucioribus iterationibus nonlinearis ob minorem numerum productorum matricis-vectoris per subproblem, comparatum ad modum fideicommissi. Praeterea solutio subprobli quadratici accuratius invenitur quam methodo fiduciaria adhibita.
Exemplum cum definitione matricis Hessicae:

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.]

Exemplum de facto functionis Hessiae et vectoris arbitrarii;

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.]

Algorithmus pro approximata solutione in regione fiduciae

Omnes methodi (Newton-CG, fiduciae-ncg-krylov) bene aptae sunt ad quaestiones magnas solvendas (mille variabilium). Hoc ob id quod algorithmus subiecti coniugati gradientis importat approximam determinationem matricis inversae Hessianae. Reperitur solutio itera- tive, sine expressa expansione Hessiae. Cum tantum opus sit munus definire ad vectorem Hessiani et arbitrarii producti, hoc algorithmus est imprimis bonum ad operandum matrices sparsae (band diagonales). Haec memoria humilis sumptus et significativa temporis compendia praebet.

Ad problematum medium amplissimum, sumptus condiendi et officinas Hessiae criticum non est. Hoc significat quod in paucioribus iterationibus solutionem obtineri potest, solvendo problemata fideicommissi regionis fere exacte. Ad hoc faciendum, nonnullae aequationes nonlineares itera- tive solvuntur pro unoquoque subprobrio quadratico. Talis solutio plerumque requirit 3 vel 4 compositiones cholesky matricis Hessiae. Quam ob rem methodus in pauciores iterationes convergat et munus obiectivum pauciores calculis requirit quam aliae rationes regionis fiduciae in effectum deductae. Hoc algorithmus solum determinat matricem Hessian integram et facultatem non sustinet utendi functione producti Hessiae et vectoris arbitrarii.

Exemplum cum minimizatione muneris 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.])

Verisimile nobis est ibi manere. In proximo articulo conabor referre maxime interesting res de minimizatione conditionali, applicatione minimizationis in solvendo problemata approximationis, extenuando functionem unius variabilis, arbitrarii minimientium, et radices systematis aequationum utentium scipy.optimize inveniendo. sarcina.

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

Source: www.habr.com

Add a comment