SciPy, kukhathamiritsa ndi mikhalidwe

SciPy, kukhathamiritsa ndi mikhalidwe

SciPy (yotchulidwa kuti sai pie) ndi phukusi la masamu lomwe limaphatikizaponso malaibulale a C ndi Fortran. SciPy imatembenuza gawo lanu la Python lolumikizana kukhala malo asayansi athunthu monga MATLAB, IDL, Octave, R, kapena SciLab.

M'nkhaniyi, tiwona njira zoyambira za masamu - kuthetsa mavuto okhazikika okhazikika pa ntchito ya scalar yamitundu ingapo pogwiritsa ntchito phukusi la scipy.optimize. Ma algorithms okhathamiritsa osasunthika adakambidwa kale nkhani yomaliza. Thandizo latsatanetsatane komanso laposachedwa pazantchito za scipy litha kupezeka nthawi zonse pogwiritsa ntchito lamulo la help(), Shift+Tab kapena mu zolemba zovomerezeka.

Mau oyamba

Mawonekedwe wamba kuti athe kuthana ndi zovuta zonse zokhazikika komanso zosagwirizana mu phukusi la scipy.optimize limaperekedwa ndi ntchitoyi. minimize(). Komabe, zimadziwika kuti palibe njira yapadziko lonse yothetsera mavuto onse, kotero kusankha njira yokwanira, monga nthawi zonse, imagwera pamapewa a wofufuza.
Kukhathamiritsa koyenera kumatchulidwa pogwiritsa ntchito mfundo ya ntchito minimize(..., method="").
Kukhathamiritsa kokhazikika kwa ntchito yamitundu ingapo, kukhazikitsa njira zotsatirazi zilipo:

  • trust-constr - fufuzani zochepa zapafupi m'dera lodalirika. Nkhani ya Wiki, Nkhani ya Habre;
  • SLSQP - Mapulogalamu otsatizana a quadratic okhala ndi zopinga, njira ya Newtonian yothetsera dongosolo la Lagrange. Nkhani ya Wiki.
  • TNC - Newton Constrained, chiwerengero chochepa cha kubwereza, chabwino kwa ntchito zopanda mzere ndi chiwerengero chachikulu cha mitundu yosiyana. Nkhani ya Wiki.
  • L-BFGS-B - njira yochokera ku gulu la Broyden-Fletcher-Goldfarb-Shanno, yomwe idakhazikitsidwa ndikuchepetsa kukumbukira kukumbukira chifukwa chotsitsa pang'ono ma vectors kuchokera ku matrix a Hessian. Nkhani ya Wiki, Nkhani ya Habre.
  • COBYLA - MARE Constrained Optimization By Linear Approximation, kukhathamiritsa kocheperako ndikuyerekeza kwa mzere (popanda kuwerengera kwa gradient). Nkhani ya Wiki.

Kutengera njira yosankhidwa, mikhalidwe ndi zoletsa zothetsera vutoli zimayikidwa mosiyanasiyana:

  • kalasi chinthu Bounds kwa njira L-BFGS-B, TNC, SLSQP, trust-constr;
  • mndandanda (min, max) kwa njira zomwezo L-BFGS-B, TNC, SLSQP, trust-constr;
  • chinthu kapena mndandanda wa zinthu LinearConstraint, NonlinearConstraint kwa COBYLA, SLSQP, trust-constr njira;
  • dikishonale kapena mndandanda wamadikishonale {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} kwa COBYLA, njira za SLSQP.

Ndondomeko yankhani:
1) Ganizirani za kugwiritsidwa ntchito kwa algorithm yokhazikika mdera la trust (njira = "trust-constr") yokhala ndi zopinga zomwe zafotokozedwa ngati zinthu. Bounds, LinearConstraint, NonlinearConstraint ;
2) Ganizirani madongosolo otsatizana pogwiritsa ntchito njira ya masikweya (njira = "SLSQP") yokhala ndi zoletsa zomwe zafotokozedwa mumtanthauzira mawu. {'type', 'fun', 'jac', 'args'};
3) Unikani chitsanzo cha kukhathamiritsa kwa zinthu zopangidwa pogwiritsa ntchito chitsanzo cha situdiyo yapaintaneti.

Conditional kukhathamiritsa njira="trust-constr"

Kukhazikitsa njira trust-constr kutengera Mtengo wa EQSQP pamavuto okhala ndi zopinga za mawonekedwe ofanana ndi kupitilira TRIP kwa mavuto okhala ndi zopinga mu mawonekedwe a kusagwirizana. Njira zonsezi zimagwiritsidwa ntchito ndi ma aligorivimu kuti apeze zochepa zakumaloko mdera la chidaliro ndipo ndizoyenera kuthana ndi mavuto akulu.

Kapangidwe ka masamu avuto lopeza zochepa mu mawonekedwe wamba:

SciPy, kukhathamiritsa ndi mikhalidwe

SciPy, kukhathamiritsa ndi mikhalidwe

SciPy, kukhathamiritsa ndi mikhalidwe

Kwa zopinga zokhwima zofanana, malire apansi amaikidwa mofanana ndi apamwamba SciPy, kukhathamiritsa ndi mikhalidwe.
Kwa kuletsa kwa njira imodzi, malire apamwamba kapena otsika amaikidwa np.inf ndi chizindikiro chofanana.
Zikhale zofunikira kupeza ntchito yocheperako yodziwika ya Rosenbrock yamitundu iwiri:

SciPy, kukhathamiritsa ndi mikhalidwe

Pachifukwa ichi, zoletsa zotsatirazi zimayikidwa pamatanthauzidwe ake:

SciPy, kukhathamiritsa ndi mikhalidwe

SciPy, kukhathamiritsa ndi mikhalidwe

SciPy, kukhathamiritsa ndi mikhalidwe

SciPy, kukhathamiritsa ndi mikhalidwe

SciPy, kukhathamiritsa ndi mikhalidwe

SciPy, kukhathamiritsa ndi mikhalidwe

Kwa ife, pali yankho lapadera pa mfundoyi SciPy, kukhathamiritsa ndi mikhalidwe, zomwe ziletso zoyamba ndi zinayi zokha ndizovomerezeka.
Tiyeni tidutse zoletsa kuchokera pansi mpaka pamwamba ndikuwona momwe tingawalembe mu scipy.
Zoletsa SciPy, kukhathamiritsa ndi mikhalidwe ΠΈ SciPy, kukhathamiritsa ndi mikhalidwe tiyeni tifotokoze pogwiritsa ntchito chinthu cha Bounds.

from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])

Zoletsa SciPy, kukhathamiritsa ndi mikhalidwe ΠΈ SciPy, kukhathamiritsa ndi mikhalidwe Tiyeni tilembe motsatira mzere:

SciPy, kukhathamiritsa ndi mikhalidwe

Tiyeni tifotokoze zolepheretsa izi ngati chinthu cha LinearConstraint:

import numpy as np
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])

Ndipo pamapeto pake zoletsa zopanda mzere mu mawonekedwe a matrix:

SciPy, kukhathamiritsa ndi mikhalidwe

Timatanthawuza matrix a Jacobian pazovuta izi komanso kuphatikiza kwa mzere wa matrix a Hessian okhala ndi vector yokhazikika. SciPy, kukhathamiritsa ndi mikhalidwe:

SciPy, kukhathamiritsa ndi mikhalidwe

SciPy, kukhathamiritsa ndi mikhalidwe

Tsopano titha kufotokozera zoletsa zopanda malire ngati chinthu NonlinearConstraint:

from scipy.optimize import NonlinearConstraint

def cons_f(x):
     return [x[0]**2 + x[1], x[0]**2 - x[1]]

def cons_J(x):
     return [[2*x[0], 1], [2*x[0], -1]]

def cons_H(x, v):
     return v[0]*np.array([[2, 0], [0, 0]]) + v[1]*np.array([[2, 0], [0, 0]])

nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=cons_H)

Ngati kukula kwake kuli kwakukulu, matrices amathanso kufotokozedwa mu mawonekedwe ochepa:

from scipy.sparse import csc_matrix

def cons_H_sparse(x, v):
     return v[0]*csc_matrix([[2, 0], [0, 0]]) + v[1]*csc_matrix([[2, 0], [0, 0]])

nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1,
                                            jac=cons_J, hess=cons_H_sparse)

kapena ngati chinthu LinearOperator:

from scipy.sparse.linalg import LinearOperator

def cons_H_linear_operator(x, v):
    def matvec(p):
        return np.array([p[0]*2*(v[0]+v[1]), 0])
    return LinearOperator((2, 2), matvec=matvec)

nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1,
                                jac=cons_J, hess=cons_H_linear_operator)

Powerengera matrix a Hessian SciPy, kukhathamiritsa ndi mikhalidwe zimafuna khama kwambiri, mukhoza kugwiritsa ntchito kalasi HessianUpdateStrategy. Njira zotsatirazi zilipo: BFGS ΠΈ SR1.

from scipy.optimize import BFGS

nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=BFGS())

The Hessian imatha kuwerengedwanso pogwiritsa ntchito kusiyana komaliza:

nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = cons_J, hess = '2-point')

Matrix a Jacobian pazoletsa amathanso kuwerengedwa pogwiritsa ntchito kusiyana komaliza. Komabe, mu nkhani iyi matrix a Hessian sangathe kuwerengedwa pogwiritsa ntchito kusiyana kochepa. Hessian iyenera kufotokozedwa ngati ntchito kapena kugwiritsa ntchito gulu la HessianUpdateStrategy.

nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = '2-point', hess = BFGS ())

Yankho la vuto la kukhathamiritsa likuwoneka motere:

from scipy.optimize import minimize
from scipy.optimize import rosen, rosen_der, rosen_hess, rosen_hess_prod

x0 = np.array([0.5, 0])
res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hess=rosen_hess,
                constraints=[linear_constraint, nonlinear_constraint],
                options={'verbose': 1}, bounds=bounds)
print(res.x)

`gtol` termination condition is satisfied.
Number of iterations: 12, function evaluations: 8, CG iterations: 7, optimality: 2.99e-09, constraint violation: 1.11e-16, execution time: 0.033 s.
[0.41494531 0.17010937]

Ngati ndi kotheka, ntchito yowerengera Hessian imatha kufotokozedwa pogwiritsa ntchito kalasi ya LinearOperator

def rosen_hess_linop(x):
    def matvec(p):
        return rosen_hess_prod(x, p)
    return LinearOperator((2, 2), matvec=matvec)

res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hess=rosen_hess_linop,
                 constraints=[linear_constraint, nonlinear_constraint],
                 options={'verbose': 1}, bounds=bounds)

print(res.x)

kapena chopangidwa ndi Hessian ndi vekitala yosagwirizana kudzera pa parameter hessp:

res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hessp=rosen_hess_prod,
                constraints=[linear_constraint, nonlinear_constraint],
                options={'verbose': 1}, bounds=bounds)
print(res.x)

Kapenanso, zotumphukira zoyamba ndi zachiwiri za ntchito yomwe ikukonzedwanso zitha kuyerekezedwa. Mwachitsanzo, Hessian ikhoza kuyerekezedwa pogwiritsa ntchito ntchitoyi SR1 (kuyerekeza kwa Newtonian). Ma gradient amatha kufananizidwa ndi kusiyana komaliza.

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)

Conditional kukhathamiritsa njira="SLSQP"

Njira ya SLSQP idapangidwa kuti ithetse mavuto ochepetsa ntchito mu mawonekedwe:

SciPy, kukhathamiritsa ndi mikhalidwe

SciPy, kukhathamiritsa ndi mikhalidwe

SciPy, kukhathamiritsa ndi mikhalidwe

SciPy, kukhathamiritsa ndi mikhalidwe

Kumeneko SciPy, kukhathamiritsa ndi mikhalidwe ΠΈ SciPy, kukhathamiritsa ndi mikhalidwe - magulu a zizindikiro zofotokozera zoletsa mu mawonekedwe a kufanana kapena kusagwirizana. SciPy, kukhathamiritsa ndi mikhalidwe - ma seti a malire apansi ndi apamwamba a dera la tanthauzo la ntchitoyi.

Zoletsa zofananira komanso zopanda mzere zimafotokozedwa ngati madikishonale okhala ndi makiyi 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])
          }

Kusaka kocheperako kumachitika motere:

x0 = np.array([0.5, 0])
res = minimize(rosen, x0, method='SLSQP', jac=rosen_der,
               constraints=[eq_cons, ineq_cons], options={'ftol': 1e-9, 'disp': True},
               bounds=bounds)

print(res.x)

Optimization terminated successfully.    (Exit mode 0)
            Current function value: 0.34271757499419825
            Iterations: 4
            Function evaluations: 5
            Gradient evaluations: 4
[0.41494475 0.1701105 ]

Kukhathamiritsa Chitsanzo

Pokhudzana ndi kusintha kwa kamangidwe ka teknoloji yachisanu, tiyeni tiwone kukhathamiritsa kwa kupanga pogwiritsa ntchito chitsanzo cha studio ya intaneti, yomwe imatibweretsera ndalama zochepa koma zokhazikika. Tiyerekeze kuti ndinu wotsogolera gulu lankhondo lomwe limapanga mitundu itatu ya zinthu:

  • x0 - kugulitsa masamba ofikira, kuchokera ku 10 tr.
  • x1 - masamba amakampani, kuyambira 20 tr.
  • x2 - malo ogulitsa pa intaneti, kuyambira 30 tr.

Gulu lathu logwira ntchito mwaubwenzi limaphatikizapo ana anayi, apakati awiri ndi wamkulu mmodzi. Ndalama zawo zogwirira ntchito pamwezi:

  • Juni: 4 * 150 = 600 Ρ‡Π΅Π» * час,
  • zapakati: 2 * 150 = 300 Ρ‡Π΅Π» * час,
  • sensa: 150 Ρ‡Π΅Π» * час.

Lolani woyamba kupezeka kuti awononge maola (0, 1, 2) pakupanga ndi kutumiza kwa tsamba limodzi lamtundu (x10, x20, x30), pakati - (7, 15, 20), wamkulu - (5, 10, 15) ) maola a nthawi yabwino kwambiri pa moyo wanu.

Monga wotsogolera aliyense wamba, tikufuna kukulitsa phindu la mwezi uliwonse. Chinthu choyamba kuti mupambane ndikulemba ntchito yomwe mukufuna value monga kuchuluka kwa ndalama zomwe zimaperekedwa pamwezi:

def value(x):
    return - 10*x[0] - 20*x[1] - 30*x[2]

Izi si zolakwika; pofufuza kuchuluka kwake, cholinga chake chimachepetsedwa ndi chizindikiro chosiyana.

Chotsatira ndikuletsa antchito athu kugwira ntchito mopitilira muyeso ndikukhazikitsa zoletsa pa nthawi yogwira ntchito:

SciPy, kukhathamiritsa ndi mikhalidwe

Chofanana ndi chiyani:

SciPy, kukhathamiritsa ndi mikhalidwe

ineq_cons = {'type': 'ineq',
             'fun': lambda x: np.array ([600 - 10 * x [0] - 20 * x [1] - 30 * x[2],
                                         300 - 7  * x [0] - 15 * x [1] - 20 * x[2],
                                         150 - 5  * x [0] - 10 * x [1] - 15 * x[2]])
            }

Choletsa ndichoti kutulutsa kwazinthu kuyenera kukhala kolimbikitsa:

bnds = Bounds ([0, 0, 0], [np.inf, np.inf, np.inf])

Ndipo potsiriza, lingaliro labwino kwambiri ndiloti chifukwa cha mtengo wotsika komanso khalidwe lapamwamba, mzere wa makasitomala okhutitsidwa nthawi zonse umatikonzera. Titha kusankha tokha ma voliyumu opanga pamwezi, kutengera kuthana ndi vuto la kukhathamiritsa scipy.optimize:

x0 = np.array([10, 10, 10])
res = minimize(value, x0, method='SLSQP', constraints=ineq_cons, bounds=bnds)
print(res.x)

[7.85714286 5.71428571 3.57142857]

Tiyeni tizungulire momasuka ku manambala athunthu ndikuwerengera kuchuluka kwa opalasa pamwezi ndikugawa koyenera kwazinthu x = (8, 6, 3) :

  • Juni: 8 * 10 + 6 * 20 + 3 * 30 = 290 Ρ‡Π΅Π» * час;
  • zapakati: 8 * 7 + 6 * 15 + 3 * 20 = 206 Ρ‡Π΅Π» * час;
  • sensa: 8 * 5 + 6 * 10 + 3 * 15 = 145 Ρ‡Π΅Π» * час.

Kutsiliza: kuti wotsogolera alandire kuchuluka kwake koyenera, ndikwabwino kupanga masamba 8 otsikira, masamba 6 amkatikati ndi masitolo 3 pamwezi. Pankhaniyi, wamkulu ayenera kulima popanda kuyang'ana mmwamba kuchokera ku makina, katundu wapakati adzakhala pafupifupi 2/3, juniors zosakwana theka.

Pomaliza

Nkhaniyi ikufotokoza njira zoyambira zogwirira ntchito ndi phukusi scipy.optimize, yogwiritsidwa ntchito kuthetsa mavuto ochepetsetsa. Ine ndekha ndimagwiritsa ntchito scipy chifukwa cha maphunziro basi, nchifukwa chake chitsanzo choperekedwacho chili choseketsa.

Malingaliro ambiri ndi zitsanzo zenizeni zingapezeke, mwachitsanzo, m'buku la I.L. Akulich "Mapulogalamu a masamu mu zitsanzo ndi mavuto." More hardcore application scipy.optimize kupanga mawonekedwe a 3D kuchokera pazithunzi (Nkhani ya Habre) ikhoza kuwonetsedwa mu scipy-cookbook.

Gwero lalikulu la chidziwitso ndi docs.scipy.orgamene akufuna kuthandizira kumasulira kwa zigawo izi ndi zina scipy Takulandilani ku GitHub.

Бпасибо mephistophees kuti agwire nawo ntchito yokonza zofalitsa.

Source: www.habr.com

Kuwonjezera ndemanga