SciPy, optimasi

SciPy, optimasi

SciPy (dibaca sai pie) mangrupakeun pakét aplikasi matematik dumasar kana extension Numpy Python. Kalayan SciPy, sési Python interaktif anjeun janten élmu data lengkep sareng lingkungan prototyping sistem anu kompleks sareng MATLAB, IDL, Octave, R-Lab, sareng SciLab. Dinten abdi hoyong ngobrol sakeudeung ngeunaan kumaha carana make sababaraha algoritma optimasi well-dipikawanoh dina pakét scipy.optimize. Leuwih lengkep jeung up-to-date pitulung dina ngagunakeun fungsi salawasna bisa dimeunangkeun ku pitulung () paréntah atawa maké Shift + Tab.

perkenalan

Pikeun ngahemat diri anjeun sareng pamiarsa tina milarian sareng maca sumber primér, tautan kana déskripsi metode bakal utamina dina Wikipedia. Sakumaha aturan, inpormasi ieu cekap pikeun ngartos metodeu sacara umum sareng kaayaan pikeun aplikasina. Pikeun ngartos hakekat metode matematika, tuturkeun tautan kana publikasi anu langkung otoritatif, anu tiasa dipendakan dina tungtung unggal tulisan atanapi dina mesin pencari karesep anjeun.

Janten, modul scipy.optimize kalebet palaksanaan prosedur ieu:

  1. Ngaminimalkeun sarat jeung sarat fungsi skalar sababaraha variabel (minim) ngagunakeun rupa-rupa algoritma (Nelder-Mead simpléks, BFGS, Newton conjugate gradién, COBYLA и SLSQP)
  2. Optimasi global (contona: baskom, diff_evolution)
  3. Ngaminimalkeun residual MNC (least_squares) sareng algoritma pas kurva nganggo kuadrat pangleutikna nonlinier (curve_fit)
  4. Ngaminimalkeun fungsi skalar tina hiji variabel (minim_scalar) sareng milarian akar (root_scalar)
  5. Pemecah multidimensional tina sistem persamaan (root) ngagunakeun rupa-rupa algoritma (hibrid Powell, Levenberg-Marquardt atawa métode skala badag kayaning Newton-Krylov).

Dina artikel ieu kami baris nganggap ukur item munggaran ti sakabéh daptar ieu.

Ngaminimalkeun tanpa syarat tina fungsi skalar tina sababaraha variabel

Fungsi minimal tina pakét scipy.optimize nyadiakeun antarbeungeut umum pikeun ngarengsekeun masalah minimization kondisional jeung saratna fungsi skalar sababaraha variabel. Pikeun nunjukkeun kumaha éta jalanna, urang peryogi fungsi anu cocog tina sababaraha variabel, anu bakal urang ngaleutikan ku cara anu béda.

Pikeun tujuan ieu, fungsi Rosenbrock tina variabel N sampurna, anu bentukna:

SciPy, optimasi

Sanaos kanyataan yén fungsi Rosenbrock sareng matriks Jacobi sareng Hessian na (turunan kahiji sareng kadua, masing-masing) parantos didefinisikeun dina pakét scipy.optimize, urang bakal ngartikeunana sorangan.

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)

Pikeun kajelasan, hayu urang tarik dina 3D nilai fungsi Rosenbrock dua variabel.

Kode gambar

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

Nyaho sateuacanna yén minimum 0 di SciPy, optimasi, Hayu urang nempo conto kumaha nangtukeun nilai minimum tina fungsi Rosenbrock ngagunakeun rupa prosedur scipy.optimize.

Métode simpléks Nelder-Mead

Hayu aya titik awal x0 dina spasi 5 diménsi. Hayu urang manggihan titik minimum tina fungsi Rosenbrock pangdeukeutna ka eta ngagunakeun algoritma Nelder-Mead simpléks (algoritma ditetepkeun salaku nilai tina parameter metode):

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

Métode simpléks nyaéta cara pangbasajanna pikeun ngaminimalkeun fungsi anu didefinisikeun sacara eksplisit sareng cukup lancar. Teu ngabutuhkeun ngitung turunan hiji fungsi; cukup pikeun nangtukeun nilaina. Metoda Nelder-Mead mangrupakeun pilihan alus keur masalah minimization basajan. Nanging, kumargi henteu nganggo perkiraan gradién, panginten peryogi langkung lami pikeun milarian minimum.

Métode Powell

Algoritma optimasi anu sanés ngan ukur nilai fungsi anu diitung nyaéta métode Powell urang. Pikeun ngagunakeun éta, anjeun kedah nyetél metode = 'powell' dina fungsi minimal.

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

Algoritma Broyden-Fletcher-Goldfarb-Shanno (BFGS).

Pikeun meunangkeun konvergénsi gancang ka solusi, prosedur BFGS ngagunakeun gradién tina fungsi obyektif. Gradién bisa dieusian salaku fungsi atawa diitung ngagunakeun béda urutan kahiji. Dina sagala hal, métode BFGS ilaharna merlukeun pangsaeutikna panggero fungsi ti métode simpléks.

Hayu urang manggihan turunan tina fungsi Rosenbrock dina formulir analitik:

SciPy, optimasi

SciPy, optimasi

Éksprési ieu valid pikeun turunan sadaya variabel iwal ti mimiti jeung panungtung, nu dihartikeun salaku:

SciPy, optimasi

SciPy, optimasi

Hayu urang tingali fungsi Python anu ngitung gradién ieu:

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

Fungsi itungan gradién dieusian salaku nilai parameter jac tina fungsi minimum, ditémbongkeun saperti di handap ieu.

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]

Algoritma gradién conjugate (Newton)

algoritma gradién conjugate Newton mangrupakeun métode Newton dirobah.
Métode Newton dumasar kana ngadeukeutan hiji fungsi di wewengkon lokal ku polinomial tina gelar kadua:

SciPy, optimasi

di mana SciPy, optimasi nyaéta matriks turunan kadua (matriks Hessian, Hessian).
Lamun Hessian positif definite, mangka minimum lokal fungsi ieu bisa kapanggih ku equating gradién nol tina formulir kuadrat jeung nol. Hasilna bakal ekspresi:

SciPy, optimasi

Hessian invers diitung ngagunakeun métode gradién conjugate. Conto ngagunakeun métode ieu pikeun ngaleutikan fungsi Rosenbrock dirumuskeun di handap. Pikeun ngagunakeun métode Newton-CG, anjeun kudu nangtukeun hiji fungsi nu ngitung Hessian.
Hessian tina fungsi Rosenbrock dina bentuk analitik sarua jeung:

SciPy, optimasi

SciPy, optimasi

di mana SciPy, optimasi и SciPy, optimasi, nangtukeun matriks SciPy, optimasi.

Unsur non-enol sésana tina matriks sarua jeung:

SciPy, optimasi

SciPy, optimasi

SciPy, optimasi

SciPy, optimasi

Contona, dina spasi lima diménsi N = 5, matriks Hessian pikeun fungsi Rosenbrock boga bentuk pita:

SciPy, optimasi

Kode anu ngitung Hessian ieu sareng kode pikeun ngaminimalkeun fungsi Rosenbrock nganggo metode gradién conjugate (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]

Conto kalayan definisi fungsi produk tina Hessian sareng véktor sawenang

Dina masalah dunya nyata, komputasi sareng nyimpen sakabéh matriks Hessian tiasa ngabutuhkeun waktos sareng sumber memori anu signifikan. Dina hal ieu, aya sabenerna teu kudu nangtukeun matrix Hessian sorangan, sabab prosedur minimization merlukeun ngan hiji vektor sarua jeung produk tina Hessian kalawan véktor wenang sejen. Ku kituna, tina sudut pandang komputasi, éta leuwih hade mun geuwat nangtukeun fungsi nu balik hasil produk tina Hessian kalawan véktor arbitrary.

Pertimbangkeun fungsi hess, anu nyandak véktor ngaminimalkeun salaku argumen kahiji, sareng véktor sawenang salaku argumen kadua (sareng argumen fungsi anu sanés pikeun diminimalkeun). Dina hal urang, ngitung produk Hessian tina fungsi Rosenbrock kalawan véktor sawenang teu hésé pisan. Lamun p mangrupa véktor wenang, lajeng produk SciPy, optimasi ngabogaan wangun:

SciPy, optimasi

Fungsi anu ngitung produk tina Hessian sareng véktor sawenang-wenang disalurkeun salaku nilai argumen hessp kana fungsi ngaminimalkeun:

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

Algoritma wewengkon kapercayaan gradién conjugate (Newton)

Pengkondisian matriks Hessian anu goréng sareng arah pamilarian anu salah tiasa nyababkeun algoritma gradién konjugat Newton henteu efektif. Dina kasus kawas, leuwih sering dipake tinimbang dibikeun ka métode wewengkon kapercayaan (wilayah kapercayaan) conjugate gradién Newton.

Conto jeung harti matriks 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.]

Conto jeung fungsi produk tina Hessian jeung véktor arbitrary:

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

métode tipe Krylov

Kawas metodeu trust-ncg, métode tipe Krylov cocog pikeun ngarengsekeun masalah skala badag sabab ngan ngagunakeun produk matrix-vektor. Intina maranéhanana nyaéta pikeun ngajawab masalah di wewengkon kapercayaan diwatesan ku subspace Krylov truncated. Pikeun masalah anu henteu pasti, langkung saé ngagunakeun metode ieu, sabab ngagunakeun jumlah iterasi nonlinier anu langkung alit kusabab jumlah produk matriks-vektor anu langkung alit per submasalah, dibandingkeun sareng metode trust-ncg. Sajaba ti éta, solusi pikeun subproblem kuadrat kapanggih leuwih akurat ti ngagunakeun métode trust-ncg.
Conto jeung harti matriks 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.]

Conto jeung fungsi produk tina Hessian jeung véktor arbitrary:

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

Algoritma pikeun solusi perkiraan di daérah kapercayaan

Sadaya metode (Newton-CG, trust-ncg sareng trust-krylov) cocog pikeun ngarengsekeun masalah skala ageung (kalayan rébuan variabel). Ieu alatan kanyataan yén algoritma gradién conjugate dasarna nunjukkeun perkiraan determinasi matriks Hessian tibalik. Leyuran ieu kapanggih iteratively, tanpa perluasan eksplisit tina Hessian. Kusabab anjeun ngan perlu nangtukeun hiji fungsi pikeun produk tina Hessian sarta vektor sawenang, algoritma ieu hususna alus pikeun gawé bareng sparse (band diagonal) matrices. Ieu nyadiakeun waragad memori lemah sareng tabungan waktos signifikan.

Pikeun masalah ukuran sedeng, biaya nyimpen sareng ngafaktorkeun Hessian henteu kritis. Ieu ngandung harti yén kasebut nyaéta dimungkinkeun pikeun ménta solusi dina iterasi pangsaeutikna, ngarengsekeun subproblems wewengkon trust ampir persis. Jang ngalampahkeun ieu, sababaraha persamaan nonlinier direngsekeun iteratively pikeun tiap subproblem kuadrat. Solusi sapertos kitu biasana ngabutuhkeun 3 atanapi 4 dékomposisi Cholesky tina matriks Hessian. Hasilna, métode konvergen dina iterasi pangsaeutikna sarta merlukeun pangsaeutikna itungan fungsi obyektif ti métode wewengkon kapercayaan lianna dilaksanakeun. Algoritma ieu ngan ngalibatkeun nangtukeun matriks Hessian lengkep sareng henteu ngadukung kamampuan ngagunakeun fungsi produk Hessian sareng véktor sawenang-wenang.

Conto kalayan ngaminimalkeun fungsi 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.])

Urang meureun bakal eureun di dinya. Dina artikel salajengna kuring bakal nyobian nyaritakeun hal-hal anu paling pikaresepeun ngeunaan minimisasi kondisional, aplikasi ngaminimalkeun dina ngarengsekeun masalah perkiraan, ngaminimalkeun fungsi hiji variabel, ngaminimalkeun sawenang-wenang, sareng milarian akar sistem persamaan nganggo scipy.optimize. pakét.

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

sumber: www.habr.com

Mésér hosting anu dipercaya pikeun situs anu gaduh panyalindungan DDoS, server VPS VDS 🔥 Meser hosting situs wéb anu tiasa dipercaya nganggo panyalindungan DDoS, server VPS VDS | ProHoster