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:
- Ukunciphisa okunemibandela nokungenamibandela kwemisebenzi ye-scalar yokuguquguquka okuningana (okuncane) kusetshenziswa ama-algorithms ahlukahlukene (Nelder-Mead simplex, BFGS, Newton conjugate gradients,
I-COBYLA ΠΈI-SLSQP ) - Ukuthuthukisa umhlaba wonke (isibonelo:
i-basinhopping ,diff_evolution ) - Ukunciphisa izinsalela
I-MNC (izikwele_ezincane) kanye nama-algorithms okulinganisa ijika kusetshenziswa izikwele ezingaqondile (curve_fit) - Ukunciphisa imisebenzi ye-scalar yokuhluka okukodwa (minim_scalar) nokusesha izimpande (root_scalar)
- Abaxazululi be-Multidimensional system of equations (impande) besebenzisa ama-algorithms ahlukahlukene (i-hybrid Powell,
I-Levenberg-Marquardt noma izindlela ezinkulu ezifanaNewton-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:
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()
Ukwazi kusengaphambili ukuthi ubuncane bungu-0 at , 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
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
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
Ake sithole okuphuma kokunye komsebenzi we-Rosenbrock ngendlela yokuhlaziya:
Lesi sisho sivumeleke kokuphuma kokunye kuzo zonke izinhlobo ngaphandle kweyokuqala neyokugcina, echazwa ngokuthi:
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
Indlela ka-Newton isuselwe ekulinganiseni umsebenzi endaweni yendawo nge-polynomial yedigri yesibili:
kuphi 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:
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:
kuphi ΠΈ , chaza i-matrix .
Izinto ezisele ezingezona uziro ze-matrix zilingana nalokhu:
Isibonelo, endaweni enezinhlangothi ezinhlanu N = 5, i-matrix ye-Hessian yomsebenzi we-Rosenbrock inohlobo lwebhendi:
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 inefomu:
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
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:
Source: www.habr.com