SciPy, nokwenza kahle

SciPy, nokwenza kahle

I-SciPy (ebizwa ngokuthi i-sai pie) iyiphakheji yohlelo lokusebenza lwezibalo esekelwe kusandiso se-Numpy Python. Nge-SciPy, iseshini yakho ye-Python esebenzisanayo iba isayensi yedatha efanayo ephelele kanye nemvelo eyinkimbinkimbi ye-prototyping yesistimu njenge-MATLAB, i-IDL, i-Octave, i-R-Lab, ne-SciLab. Namuhla ngifuna ukukhuluma kafushane mayelana nendlela yokusebenzisa amanye ama-algorithms wokuthuthukisa awaziwayo kuphakheji ye-scipy.optimize. Usizo olunemininingwane eminingi nolwakamuva ekusebenziseni imisebenzi lungatholakala kusetshenziswa umyalo wosizo() noma kusetshenziswa u-Shift+Tab.

Isingeniso

Ukuze uzisindise wena nabafundi ekucingeni nasekufundeni imithombo eyinhloko, izixhumanisi ezichaza izindlela zizoba kakhulu ku-Wikipedia. Njengomthetho, lolu lwazi lwanele ukuqonda izindlela ngokwemibandela evamile kanye nemibandela yokusetshenziswa kwazo. Ukuze uqonde ingqikithi yezindlela zezibalo, landela izixhumanisi eziya ekushicilelweni okugunyaziwe, okungatholakala ekupheleni kwesihloko ngasinye noma enjinini yakho yokusesha eyintandokazi.

Ngakho-ke, imojuli ye-scipy.optimize ihlanganisa ukuqaliswa kwezinqubo ezilandelayo:

  1. Ukunciphisa okunemibandela nokungenamibandela kwemisebenzi ye-scalar yokuguquguquka okuningana (okuncane) kusetshenziswa ama-algorithms ahlukahlukene (Nelder-Mead simplex, BFGS, Newton conjugate gradients, I-COBYLA ΠΈ I-SLSQP)
  2. Ukuthuthukisa umhlaba wonke (isibonelo: i-basinhopping, diff_evolution)
  3. Ukunciphisa izinsalela I-MNC (izikwele_ezincane) kanye nama-algorithms okulinganisa ijika kusetshenziswa izikwele ezingaqondile (curve_fit)
  4. Ukunciphisa imisebenzi ye-scalar yokuhluka okukodwa (minim_scalar) nokusesha izimpande (root_scalar)
  5. Abaxazululi be-Multidimensional system of equations (impande) besebenzisa ama-algorithms ahlukahlukene (i-hybrid Powell, I-Levenberg-Marquardt noma izindlela ezinkulu ezifana Newton-Krylov).

Kulesi sihloko sizocubungula kuphela into yokuqala kulo lonke uhlu.

Ukwehliswa okungenamibandela komsebenzi we-scalar wokuhlukahluka okuningana

Umsebenzi omncane ovela kuphakheji ye-scipy.optimize unikeza ukusebenzelana okuvamile kokuxazulula izinkinga zokunciphisa ezinemibandela nezingenamibandela zemisebenzi yesikali yokuhlukahlukana okuningana. Ukukhombisa ukuthi isebenza kanjani, sizodinga umsebenzi ofanelekile weziguquguqukayo ezimbalwa, esizozinciphisa ngezindlela ezahlukahlukene.

Ngalezi zinhloso, umsebenzi we-Rosenbrock we-N oguquguqukayo uphelele, onefomu:

SciPy, nokwenza kahle

Naphezu kweqiniso lokuthi umsebenzi we-Rosenbrock kanye no-matrices we-Jacobi no-Hessian (okuphuma kokuphuma kokuqala nokwesibili, ngokulandelana) sekuchazwe kakade kuphakheji ye-scipy.optimize, sizozichaza ngokwethu.

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)

Ukuze uthole ukucaca, ake sidwebe ku-3D amanani omsebenzi we-Rosenbrock wokuguquguquka okubili.

Ikhodi yomdwebo

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, nokwenza kahle

Ukwazi kusengaphambili ukuthi ubuncane bungu-0 at SciPy, nokwenza kahle, ake sibheke izibonelo zendlela yokunquma inani elincane lomsebenzi we-Rosenbrock kusetshenziswa izinqubo ezihlukahlukene ze-scipy.optimize.

Indlela ye-Nelder-Mead simplex

Makube nephuzu lokuqala x0 esikhaleni esinezinhlangothi ezi-5. Ake sithole iphuzu elincane lomsebenzi we-Rosenbrock eliseduze kakhulu nalo sisebenzisa i-algorithm I-Nelder-Mead simplex (i-algorithm icaciswe njengevelu yepharamitha yendlela):

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

Indlela ye-simplex iyindlela elula yokunciphisa umsebenzi ochazwe ngokucacile futhi obushelelezi. Akudingi ukubalwa kokuphuma kokunye komsebenzi; kwanele ukucacisa amanani awo kuphela. Indlela ye-Nelder-Mead iyisinqumo esihle sezinkinga ezilula zokunciphisa. Nokho, njengoba ingasebenzisi izilinganiso zegradient, kungase kuthathe isikhathi eside ukuthola ubuncane.

Indlela kaPowell

Enye i-algorithm yokuthuthukisa lapho kubalwa khona kuphela amanani omsebenzi Indlela kaPowell. Ukuze uyisebenzise, ​​udinga ukusetha indlela = 'powell' kumsebenzi omncane.

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

I-algorithm ye-Broyden-Fletcher-Goldfarb-Shanno (BFGS).

Ukuthola ukuhlangana ngokushesha kwisixazululo, inqubo I-BFGS isebenzisa igrediyenti yomsebenzi wenhloso. Igradient ingacaciswa njengomsebenzi noma ibalwe kusetshenziswa umehluko we-oda lokuqala. Kunoma ikuphi, indlela ye-BFGS ngokuvamile idinga izingcingo zokusebenza ezimbalwa kunendlela ye-simplex.

Ake sithole okuphuma kokunye komsebenzi we-Rosenbrock ngendlela yokuhlaziya:

SciPy, nokwenza kahle

SciPy, nokwenza kahle

Lesi sisho sivumeleke kokuphuma kokunye kuzo zonke izinhlobo ngaphandle kweyokuqala neyokugcina, echazwa ngokuthi:

SciPy, nokwenza kahle

SciPy, nokwenza kahle

Ake sibheke umsebenzi wePython obala le gradient:

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

Umsebenzi wokubala we-gradient ucaciswe njengevelu yepharamitha ye-jac yomsebenzi omncane, njengoba kukhonjisiwe ngezansi.

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]

I-Conjugate gradient algorithm (Newton)

I-Algorithm I-Newton's conjugate gradients indlela kaNewton eguquliwe.
Indlela ka-Newton isuselwe ekulinganiseni umsebenzi endaweni yendawo nge-polynomial yedigri yesibili:

SciPy, nokwenza kahle

kuphi SciPy, nokwenza kahle i-matrix yokuphuma kwesibili (i-matrix ye-Hessian, i-Hessian).
Uma i-Hessian iyiphozithivu eqinisekile, khona-ke ubuncane bendawo balo msebenzi bungatholwa ngokufanisa igradient enguziro yefomu le-quadratic kuya kuziro. Umphumela uzoba inkulumo ethi:

SciPy, nokwenza kahle

I-Hessian ephambene ibalwa kusetshenziswa indlela ye-conjugate gradient. Isibonelo sokusebenzisa le ndlela ukunciphisa umsebenzi we-Rosenbrock sinikezwe ngezansi. Ukuze usebenzise indlela ye-Newton-CG, kufanele ucacise umsebenzi obala i-Hessian.
I-Hessian yomsebenzi we-Rosenbrock ngendlela yokuhlaziya ilingana ne:

SciPy, nokwenza kahle

SciPy, nokwenza kahle

kuphi SciPy, nokwenza kahle ΠΈ SciPy, nokwenza kahle, chaza i-matrix SciPy, nokwenza kahle.

Izinto ezisele ezingezona uziro ze-matrix zilingana nalokhu:

SciPy, nokwenza kahle

SciPy, nokwenza kahle

SciPy, nokwenza kahle

SciPy, nokwenza kahle

Isibonelo, endaweni enezinhlangothi ezinhlanu N = 5, i-matrix ye-Hessian yomsebenzi we-Rosenbrock inohlobo lwebhendi:

SciPy, nokwenza kahle

Ikhodi ebala le-Hessian kanye nekhodi yokunciphisa umsebenzi we-Rosenbrock kusetshenziswa indlela ye-conjugate gradient (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]

Isibonelo esinencazelo yomsebenzi womkhiqizo we-Hessian kanye ne-vector engaqondakali

Ezinkingeni zomhlaba wangempela, ukusebenzisa ikhompuyutha nokugcina yonke i-matrix ye-Hessian kungadinga isikhathi esibalulekile nezinsiza zenkumbulo. Kulokhu, empeleni asikho isidingo sokucacisa i-matrix ye-Hessian ngokwayo, ngoba inqubo yokunciphisa idinga kuphela i-vector elingana nomkhiqizo we-Hessian nenye i-vector engafanele. Ngakho-ke, ngokombono wokubala, kungcono kakhulu ukuchaza ngokushesha umsebenzi obuyisela umphumela womkhiqizo we-Hessian nge-vector engaqondakali.

Cabangela umsebenzi we-hess, othatha i-vector yokunciphisa njenge-agumenti yokuqala, kanye nevektha engafanele njenge-agumenti yesibili (kanye namanye ama-agumenti omsebenzi okufanele ancishiswe). Esimweni sethu, ukubala umkhiqizo we-Hessian womsebenzi we-Rosenbrock nge-vector engafanele akunzima kakhulu. Uma p iyivektha engafanele, bese kuba umkhiqizo SciPy, nokwenza kahle inefomu:

SciPy, nokwenza kahle

Umsebenzi obala umkhiqizo we-Hessian kanye nevektha engafanele uphasiswe njengevelu ye-agumenti ye-hessp kumsebenzi wokunciphisa:

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

I-Conjugate gradient trust region algorithm (Newton)

Isimo esingesihle se-matrix ye-Hessian nezikhombisi-ndlela zokusesha ezingalungile kungabangela i-algorithm ye-conjugate gradient ka-Newton ukuthi ingasebenzi. Ezimweni ezinjalo, ukukhetha kunikezwa indlela yesifunda sokuthembela (isifunda-sethemba) hlanganisa ama-gradients ka-Newton.

Isibonelo ngencazelo ye-matrix ye-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.]

Isibonelo ngomsebenzi womkhiqizo we-Hessian kanye ne-vector engafanele:

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

Izindlela zohlobo lwe-Krylov

Njengendlela ye-trust-ncg, izindlela zohlobo lwe-Krylov zifaneleka kahle ekuxazululeni izinkinga ezinkulu ngoba zisebenzisa imikhiqizo ye-matrix-vector kuphela. Ingqikithi yabo iwukuxazulula inkinga endaweni yokuzethemba ekhawulelwe indawo engaphansi encishisiwe ye-Krylov. Ngezinkinga ezingaqinisekile, kungcono ukusebenzisa le ndlela, njengoba isebenzisa inombolo encane yokuphindaphinda okungaqondile ngenxa yenani elincane lemikhiqizo ye-matrix-vector ngenkinga ngayinye, uma kuqhathaniswa nendlela ye-trust-ncg. Ngaphezu kwalokho, isixazululo se-quadratic subproblem sitholakala sinembe kakhulu kunokusebenzisa indlela ye-trust-ncg.
Isibonelo ngencazelo ye-matrix ye-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.]

Isibonelo ngomsebenzi womkhiqizo we-Hessian kanye ne-vector engafanele:

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

I-algorithm yesixazululo esilinganiselwe endaweni yokuqiniseka

Zonke izindlela (i-Newton-CG, i-trust-ncg ne-trust-krylov) ifaneleka kahle ekuxazululeni izinkinga ezinkulu (ngezinkulungwane zezinto eziguquguqukayo). Lokhu kungenxa yokuthi i-algorithm ye-conjugate gradient eyisisekelo isho ukuzimisela okulinganiselwe kwe-matrix ye-Hessian ephambene. Isixazululo sitholakala ngokuphindaphindiwe, ngaphandle kokunwetshwa okucacile kwe-Hessian. Njengoba udinga kuphela ukuchaza umsebenzi womkhiqizo we-Hessian kanye ne-vector engaqondakali, le-algorithm ilungele ukusebenza ngamatrices angenalutho (i-band diagonal). Lokhu kunikeza izindleko eziphansi zenkumbulo nokonga kwesikhathi okubalulekile.

Ezinkingeni ezimaphakathi, izindleko zokugcina kanye nokwenza i-Hessian azibalulekile. Lokhu kusho ukuthi kungenzeka ukuthola isixazululo ngokuphindaphinda okumbalwa, ukuxazulula izinkinga ezingaphansi kwesifunda sokuthembana cishe ngqo. Ukwenza lokhu, ezinye izibalo ezingezona umugqa zixazululwa ngokuphindaphindiwe ku-quadratic subproblem ngayinye. Isixazululo esinjalo ngokuvamile sidinga ukubola kwe-Cholesky oku-3 noma oku-4 kwe-matrix ye-Hessian. Njengomphumela walokho, indlela ihlangana ngokuphindaphinda okumbalwa futhi idinga izibalo zomsebenzi wenhloso ezimbalwa kunezinye izindlela zesifunda sokuzethemba ezisetshenzisiwe. Le-algorithm isho kuphela ukuzimisela kwe-matrix ye-Hessian ephelele futhi ayisekeli ikhono lokusebenzisa umsebenzi womkhiqizo we-Hessian kanye nevektha engaqondakali.

Isibonelo ngokunciphisa umsebenzi we-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.])

Cishe sizoma lapho. Esihlokweni esilandelayo ngizozama ukutshela izinto ezithakazelisa kakhulu mayelana nokunciphisa okunemibandela, ukusetshenziswa kokunciphisa ekuxazululeni izinkinga zokulinganisa, ukunciphisa umsebenzi wokuguquguquka okukodwa, izinciphisi ezingenangqondo, kanye nokuthola izimpande zesistimu yezibalo usebenzisa i-scipy.optimize. iphasela.

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

Source: www.habr.com

Engeza amazwana