SciPy (izrunā sai pīrāgs) ir matemātikas pakotne, kas balstīta uz numpy, kas ietver arī C un Fortran bibliotēkas. SciPy pārvērš jūsu interaktīvo Python sesiju par pilnīgu datu zinātnes vidi, piemēram, MATLAB, IDL, Octave, R vai SciLab.
Šajā rakstā mēs apskatīsim matemātiskās programmēšanas pamatmetodes – nosacītās optimizācijas uzdevumu risināšanu vairāku mainīgo skalārai funkcijai, izmantojot pakotni scipy.optimize. Neierobežoti optimizācijas algoritmi jau ir apspriesti pēdējais raksts. Detalizētāku un jaunāko palīdzību par scipy funkcijām vienmēr var iegūt, izmantojot komandu help(), Shift+Tab vai oficiālā dokumentācija.
Ievads
Kopēju interfeisu gan nosacītu, gan neierobežotu optimizācijas problēmu risināšanai pakotnē scipy.optimize nodrošina funkcija minimize(). Taču zināms, ka nav universālas metodes visu problēmu risināšanai, tāpēc adekvātas metodes izvēle, kā vienmēr, gulstas uz pētnieka pleciem.
Atbilstošais optimizācijas algoritms tiek norādīts, izmantojot funkcijas argumentu minimize(..., method="").
Vairāku mainīgo funkcijas nosacītai optimizācijai ir pieejamas šādas metodes:
SLSQP — secīga kvadrātiskā programmēšana ar ierobežojumiem, Ņūtona metode Lagranža sistēmas risināšanai. Wiki raksts.
TNC - Saīsināts Ņūtons Ierobežots, ierobežots iterāciju skaits, piemērots nelineārām funkcijām ar lielu skaitu neatkarīgu mainīgo. Wiki raksts.
L-BFGS-B — Broyden–Fletcher–Goldfarb–Shanno komandas metode, kas ieviesta ar samazinātu atmiņas patēriņu, jo vektoru daļēja ielāde no Hesenes matricas. Wiki raksts, raksts par Habrē.
COBYLA — MARE ierobežota optimizācija ar lineāru tuvināšanu, ierobežota optimizācija ar lineāru tuvinājumu (bez gradienta aprēķina). Wiki raksts.
Atkarībā no izvēlētās metodes problēmas risināšanas nosacījumi un ierobežojumi tiek noteikti atšķirīgi:
klases objekts Bounds metodēm L-BFGS-B, TNC, SLSQP, trust-constr;
saraksts (min, max) tām pašām metodēm L-BFGS-B, TNC, SLSQP, trust-constr;
objekts vai objektu saraksts LinearConstraint, NonlinearConstraint COBYLA, SLSQP, uzticības-constr metodēm;
vārdnīca vai vārdnīcu saraksts {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} COBYLA, SLSQP metodēm.
Raksta izklāsts:
1) Apsveriet iespēju izmantot nosacītu optimizācijas algoritmu uzticamības reģionā (method=”trust-constr”) ar ierobežojumiem, kas norādīti kā objekti. Bounds, LinearConstraint, NonlinearConstraint ;
2) Apsveriet secīgu programmēšanu, izmantojot mazāko kvadrātu metodi (metode = "SLSQP") ar ierobežojumiem, kas norādīti vārdnīcas veidā. {'type', 'fun', 'jac', 'args'};
3) Analizējiet ražoto produktu optimizācijas piemēru, izmantojot tīmekļa studijas piemēru.
Nosacījuma optimizācijas metode = "trust-constr"
Metodes ieviešana trust-constr balstoties uz EQSQP problēmām ar vienlīdzības formas ierobežojumiem un tālāk CEĻOJUMS problēmām ar ierobežojumiem nevienlīdzības veidā. Abas metodes realizē algoritmi lokālā minimuma atrašanai ticamības reģionā, un tās ir labi piemērotas liela mēroga problēmām.
Vispārīgā formā minimuma atrašanas problēmas matemātiskais formulējums:
Stingriem vienlīdzības ierobežojumiem apakšējā robeža ir iestatīta vienāda ar augšējo robežu .
Vienvirziena ierobežojumam ir iestatīta augšējā vai apakšējā robeža np.inf ar atbilstošo zīmi.
Ļaujiet mums atrast zināmās Rozenbroka funkcijas minimumu no diviem mainīgajiem:
Šajā gadījumā tās definīcijas domēnam ir noteikti šādi ierobežojumi:
Mūsu gadījumā šajā punktā ir unikāls risinājums , kam ir spēkā tikai pirmais un ceturtais ierobežojums.
Iziesim cauri ierobežojumiem no apakšas uz augšu un paskatīsimies, kā varam tos rakstīt scipy valodā.
Ierobežojumi и definēsim to, izmantojot objektu Robežas.
Jakoba matricu ierobežojumiem var arī aprēķināt, izmantojot ierobežotas atšķirības. Tomēr šajā gadījumā Hesenes matricu nevar aprēķināt, izmantojot ierobežotas atšķirības. Hessian ir jādefinē kā funkcija vai jāizmanto HessianUpdateStrategy klase.
Alternatīvi, optimizējamās funkcijas pirmo un otro atvasinājumu var tuvināt. Piemēram, Hesenes vērtību var tuvināt, izmantojot funkciju SR1 (kvaziņūtona tuvinājums). Gradientu var tuvināt ar ierobežotām atšķirībām.
from scipy.optimize import SR1
res = minimize(rosen, x0, method='trust-constr', jac="2-point", hess=SR1(),
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
Nosacītā optimizācijas metode = SLSQP
SLSQP metode ir paredzēta, lai atrisinātu problēmas, kas saistītas ar funkcijas minimizēšanu šādā formā:
Kur и — izteiksmju indeksu kopas, kas apraksta ierobežojumus vienādību vai nevienlīdzību veidā. — apakšējo un augšējo robežu kopas funkcijas definīcijas jomā.
Lineārie un nelineārie ierobežojumi ir aprakstīti vārdnīcu veidā ar taustiņiem type, fun и jac.
ineq_cons = {'type': 'ineq',
'fun': lambda x: np.array ([1 - x [0] - 2 * x [1],
1 - x [0] ** 2 - x [1],
1 - x [0] ** 2 + x [1]]),
'jac': lambda x: np.array ([[- 1.0, -2.0],
[-2 * x [0], -1.0],
[-2 * x [0], 1.0]])
}
eq_cons = {'type': 'eq',
'fun': lambda x: np.array ([2 * x [0] + x [1] - 1]),
'jac': lambda x: np.array ([2.0, 1.0])
}
Optimization terminated successfully. (Exit mode 0)
Current function value: 0.34271757499419825
Iterations: 4
Function evaluations: 5
Gradient evaluations: 4
[0.41494475 0.1701105 ]
Optimizācijas piemērs
Saistībā ar pāreju uz piekto tehnoloģisko struktūru, aplūkosim ražošanas optimizāciju, izmantojot tīmekļa studijas piemēru, kas mums nes nelielus, bet stabilus ienākumus. Iedomāsimies sevi kā kambīzes direktoru, kas ražo trīs veidu produktus:
x0 - izvietošanas lapu pārdošana, no 10 tr.
x1 - korporatīvās mājas lapas, no 20 tr.
x2 - interneta veikali, no 30 tr.
Mūsu draudzīgajā komandā ir četri juniori, divi vidējie un viens vecākais. Viņu ikmēneša darba laika fonds:
jūnijā: 4 * 150 = 600 чел * час,
vidus: 2 * 150 = 300 чел * час,
Senors: 150 чел * час.
Ļaujiet pirmajam pieejamajam junioram pavadīt (0, 1, 2) stundas vienas vietnes (x10, x20, x30) izstrādei un izvietošanai, vidējais - (7, 15, 20), vecākais - (5, 10, 15). ) savas dzīves labākā laika stundas.
Tāpat kā jebkurš parasts direktors, mēs vēlamies maksimāli palielināt ikmēneša peļņu. Pirmais solis uz panākumiem ir mērķa funkcijas pierakstīšana value kā ienākumu summa no saražotās produkcijas mēnesī:
Un visbeidzot, pats rožainākais pieņēmums ir tas, ka zemās cenas un augstās kvalitātes dēļ pie mums nepārtraukti stāv rinda ar apmierinātiem klientiem. Mēneša ražošanas apjomus varam izvēlēties paši, pamatojoties uz ierobežotās optimizācijas problēmas risināšanu ar scipy.optimize:
Noapaļosim brīvi līdz veseliem skaitļiem un aprēķināsim airētāju mēneša slodzi ar optimālu produktu sadalījumu x = (8, 6, 3) :
jūnijā: 8 * 10 + 6 * 20 + 3 * 30 = 290 чел * час;
vidus: 8 * 7 + 6 * 15 + 3 * 20 = 206 чел * час;
Senors: 8 * 5 + 6 * 10 + 3 * 15 = 145 чел * час.
Secinājums: lai režisors saņemtu savu pelnīto maksimumu, ir optimāli mēnesī izveidot 8 galvenās lapas, 6 vidēja lieluma vietnes un 3 veikalus. Šajā gadījumā senioram jāar, nepaskatoties no mašīnas, vidus slodze būs aptuveni 2/3, junioriem mazāka par pusi.
Secinājums
Rakstā ir izklāstīti pamata paņēmieni darbam ar paketi scipy.optimize, ko izmanto, lai atrisinātu nosacītās minimizēšanas problēmas. Personīgi es lietoju scipy tīri akadēmiskiem nolūkiem, tāpēc minētajam piemēram ir tik komisks raksturs.
Daudz teoriju un virtuālu piemēru var atrast, piemēram, I.L.Akuļiha grāmatā “Matemātiskā programmēšana piemēros un problēmās”. Vairāk hardcore pieteikumu scipy.optimize lai izveidotu 3D struktūru no attēlu kopas (raksts par Habrē) var apskatīties scipy-pavārgrāmata.
Galvenais informācijas avots ir docs.scipy.orgtiem, kas vēlas piedalīties šīs un citu sadaļu tulkošanā scipy Laipni lūdzam GitHub.
Paldies mefistofi par dalību izdevuma sagatavošanā.