SciPy፣ ማመቻቸት

SciPy፣ ማመቻቸት

SciPy (sai pai ይባላል) በNumpy Python ቅጥያ ላይ የተመሰረተ የሂሳብ መተግበሪያ ጥቅል ነው። በ SciPy፣ በይነተገናኝ የፓይዘን ክፍለ ጊዜ እንደ MATLAB፣ IDL፣ Octave፣ R-Lab እና SciLab ተመሳሳይ የተሟላ የውሂብ ሂደት እና ውስብስብ የፕሮቶታይፕ አካባቢ ይሆናል። ዛሬ በ scipy.optimize ጥቅል ውስጥ አንዳንድ የታወቁ የማመቻቸት ስልተ ቀመሮችን እንዴት ተግባራዊ ማድረግ እንዳለብኝ በአጭሩ መናገር እፈልጋለሁ። ተግባራትን ስለመጠቀም የበለጠ ዝርዝር እና ወቅታዊ እገዛ ሁል ጊዜ የእገዛ() ትዕዛዝን በመጠቀም ወይም Shift+Tabን በመጠቀም ማግኘት ይቻላል።

መግቢያ

እራሴን እና አንባቢዎችን ከዋና ምንጮችን ከመፈለግ እና ከማንበብ ለማዳን ፣የዘዴዎች መግለጫዎች አገናኞች በዋነኛነት በዊኪፔዲያ ላይ ይሆናሉ። እንደ አንድ ደንብ, ይህ መረጃ በአጠቃላይ ዘዴዎች እና ለትግበራቸው ሁኔታዎችን ለመረዳት በቂ ነው. የሂሳብ ዘዴዎችን ምንነት ለመረዳት በእያንዳንዱ መጣጥፍ መጨረሻ ላይ ወይም በሚወዱት የፍለጋ ሞተር ውስጥ ወደሚገኙ የበለጠ ስልጣን ያላቸው ህትመቶች አገናኞችን እንከተላለን።

ስለዚህ፣ scpy.optimize ሞጁል የሚከተሉትን ሂደቶች መተግበርን ያጠቃልላል።

  1. የተለያዩ ስልተ ቀመሮችን (Nelder-Mead simplex፣ BFGS፣ Newton's conjugate gradients፣ ኮቢላ и SLSQP)
  2. ዓለም አቀፍ ማመቻቸት (ለምሳሌ፡- ተፋሰስ ማድረግ, ልዩነት_ዝግመተ ለውጥ)
  3. የቀረውን መቀነስ ኤምኤንሲ (ቢያንስ_ካሬዎች) እና ቀጥተኛ ያልሆኑ ቢያንስ የካሬዎች ኩርባ ተስማሚ ስልተ ቀመሮች (ከርቭ_ፊት)
  4. የአንድ ተለዋዋጭ (minim_scalar) scalar ተግባራትን መቀነስ እና ስር መፈለግ (root_scalar)
  5. የተለያዩ ስልተ ቀመሮችን (Hybrid Powell) በመጠቀም ሁለገብ እኩልታ ስርዓት ፈቺዎች (ስር) ሌቨንበርግ-ማርኳርድት ወይም እንደ ትልቅ መጠን ዘዴዎች ኒውተን-ክሪሎቭ).

በዚህ ጽሑፍ ውስጥ, ከዚህ ዝርዝር ውስጥ የመጀመሪያውን ንጥል ብቻ እንመለከታለን.

የበርካታ ተለዋዋጮች scalar ተግባርን ያለ ቅድመ ሁኔታ መቀነስ

ከ scipy.optimize ጥቅል የሚገኘው አነስተኛ ተግባር ሁኔታዊ እና ቅድመ ሁኔታ የለሽ የበርካታ ተለዋዋጮች scalar ተግባራትን ለመቀነስ የጋራ በይነገጽ ይሰጣል። አሠራሩን ለማሳየት የበርካታ ተለዋዋጮች ተስማሚ ተግባር ያስፈልገናል, ይህም በተለያየ መንገድ እንቀንሳለን.

ለእነዚህ ዓላማዎች፣ የ N ተለዋዋጮች የ Rosenbrock ተግባር ፍጹም ነው፣ እሱም ይመስላል፡-

SciPy፣ ማመቻቸት

የ Rosenbrock ተግባር እና Jacobi እና Hesse ማትሪክስ (የመጀመሪያው እና ሁለተኛ ተዋጽኦዎች, በቅደም) አስቀድሞ scipy.optimize ጥቅል ውስጥ የተገለጹ ቢሆንም, እኛ እራሳችንን እንገልጸዋለን.

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)

ግልፅ ለማድረግ ፣ የሁለት ተለዋዋጮችን የ Rosenbrock ተግባር እሴቶችን በ 3 ዲ ውስጥ እንሳል።

የመስጠት ኮድ

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፣ ማመቻቸት

ዝቅተኛው 0 በ መሆኑን አስቀድመን ማወቅ SciPy፣ ማመቻቸት, የተለያዩ scipy.optimize ሂደቶችን በመጠቀም Rosenbrock ተግባር ዝቅተኛ ዋጋ ለመወሰን እንዴት ምሳሌዎችን እንመልከት.

ቀለል ያለ ዘዴ የኔልደር-ሜድ (ኔልደር-ሜድ)

ባለ 0-ልኬት ቦታ ላይ የመጀመሪያ ነጥብ x5 ይሁን። አልጎሪዝምን በመጠቀም በአቅራቢያው ያለውን የ Rosenbrock ተግባር ዝቅተኛውን ነጥብ ያግኙ ኔልደር-ሜድ ሲምፕሌክስ (ስልተ ቀመር እንደ የስልት መለኪያው እሴት ተገልጿል):

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

ሲምፕሌክስ ዘዴ በግልፅ የተቀመጠ እና በትክክል ለስላሳ ተግባርን ለመቀነስ ቀላሉ መንገድ ነው። የተግባሩ ተዋጽኦዎችን ስሌት አያስፈልገውም, እሴቶቹን ብቻ መግለጽ በቂ ነው. የኔልደር-ሜድ ዘዴ ለቀላል ዝቅተኛ ችግሮች ጥሩ ምርጫ ነው. ሆኖም፣ ቀስ በቀስ ግምቶችን ስለማይጠቀም፣ ዝቅተኛውን ለማግኘት ብዙ ጊዜ ሊወስድ ይችላል።

የፓውል ዘዴ

የተግባር እሴቶች ብቻ የሚሰሉበት ሌላው የማመቻቸት ስልተ ቀመር ነው። የፓውል ዘዴ. እሱን ለመጠቀም ዘዴ = 'ፓዌል' በትንሹ ተግባር ውስጥ ማዘጋጀት ያስፈልግዎታል።

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

Broyden-Fletcher-Goldfarb-Shanno (BFGS) አልጎሪዝም

ከመፍትሔው ጋር ፈጣን ውህደት ለማግኘት, የአሰራር ሂደቱ BFGS የዓላማ ተግባር ቅልመትን ይጠቀማል። ቅልመት እንደ ተግባር ሊገለጽ ወይም የመጀመሪያ ደረጃ ልዩነቶችን በመጠቀም ሊሰላ ይችላል። ያም ሆነ ይህ፣ የBFGS ዘዴ አብዛኛውን ጊዜ ከቀላል ዘዴ ያነሰ የተግባር ጥሪዎችን ይፈልጋል።

የ Rosenbrock ተግባርን በትንታኔ መልክ እንፈልግ፡-

SciPy፣ ማመቻቸት

SciPy፣ ማመቻቸት

ይህ አገላለጽ ከመጀመሪያው እና የመጨረሻው ካልሆነ በስተቀር ለሁሉም ተለዋዋጮች ተዋጽኦዎች የሚሰራ ነው፡

SciPy፣ ማመቻቸት

SciPy፣ ማመቻቸት

ይህን ቅልመት የሚያሰላ የ Python ተግባርን እንይ፡-

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

የግራዲየንት ስሌት ተግባር ከታች እንደሚታየው ዝቅተኛው ተግባር የጃክ መለኪያ እሴት ሆኖ ተገልጿል.

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]

የተዋሃደ ግራዲየንት (ኒውተን) አልጎሪዝም

አልጎሪዝም የኒውቶኒያ conjugate gradients የተሻሻለ የኒውተን ዘዴ ነው።
የኒውተን ዘዴ የተመሰረተው በአካባቢው አካባቢ ያለውን ተግባር በሁለተኛ ዲግሪ ፖሊኖሚል በመገመት ላይ ነው።

SciPy፣ ማመቻቸት

የት SciPy፣ ማመቻቸት የሁለተኛ ተዋጽኦዎች ማትሪክስ ነው (ሄሲያን ማትሪክስ፣ ሄሲያን)።
ሄሲያን አወንታዊ ከሆነ፣ የዚህ ተግባር አካባቢያዊ ዝቅተኛው የኳድራቲክ ቅርጽ ዜሮ ቅልመትን ከዜሮ ጋር በማመሳሰል ሊገኝ ይችላል። ውጤቱ መግለጫ ነው፡-

SciPy፣ ማመቻቸት

ተገላቢጦሹ ሄሲያን የሚሰላው በኮንጁጌት ግራዲየንት ዘዴ ነው። የ Rosenbrock ተግባርን ለመቀነስ ይህንን ዘዴ የመጠቀም ምሳሌ ከዚህ በታች ቀርቧል። የኒውተን-ሲጂ ዘዴን ለመጠቀም ሄሲያንን የሚያሰላ ተግባር መግለፅ አለብዎት።
የ Rosenbrock ተግባር ሄሲያን በትንተና መልክ እኩል ነው፡-

SciPy፣ ማመቻቸት

SciPy፣ ማመቻቸት

የት SciPy፣ ማመቻቸት и SciPy፣ ማመቻቸት, ማትሪክስ ይግለጹ SciPy፣ ማመቻቸት.

የተቀሩት ዜሮ ያልሆኑ የማትሪክስ አባሎች እኩል ናቸው፡

SciPy፣ ማመቻቸት

SciPy፣ ማመቻቸት

SciPy፣ ማመቻቸት

SciPy፣ ማመቻቸት

ለምሳሌ፣ ባለ አምስት አቅጣጫዊ ቦታ N = 5፣ የሄሲያን ማትሪክስ ለ Rosenbrock ተግባር የባንድ ቅርጽ አለው።

SciPy፣ ማመቻቸት

ይህንን ሄሲያንን የሚያሰላው ኮድ እና የሮዘንብሮክን ተግባር የመቀነሻ ኮድ (ኒውተን) ዘዴን በመጠቀም፡-

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]

የሄሲያን ምርት ተግባር እና የዘፈቀደ ቬክተር ትርጉም ያለው ምሳሌ

በእውነተኛ ችግሮች ውስጥ የጠቅላላው የሄሲያን ማትሪክስ ስሌት እና ማከማቻ ከፍተኛ ጊዜ እና የማስታወስ ሀብቶችን ሊፈልግ ይችላል። በዚህ ጉዳይ ላይ የሄሲያን ማትሪክስ እራሱን መግለጽ አያስፈልግም, ምክንያቱም የመቀነሱ ሂደት ከሄሲያን ምርት ጋር እኩል የሆነ ቬክተር ከሌላ የዘፈቀደ ቬክተር ጋር ብቻ ይፈልጋል። ስለዚህ ከስሌት እይታ አንጻር የሄሲያንን ምርት በዘፈቀደ ቬክተር የሚመልስ ተግባርን ወዲያውኑ መግለፅ የበለጠ ተመራጭ ነው።

የመቀነስ ቬክተርን እንደ መጀመሪያው መከራከሪያው እና የዘፈቀደ ቬክተርን እንደ ሁለተኛው መከራከሪያ የሚወስደውን የሂስ ተግባርን (ከሌሎች ንግግሮች ጋር ለመቀነስ ለተግባሩ ከሚቀርቡት ክርክሮች ጋር) ግምት ውስጥ ያስገቡ። በእኛ ሁኔታ, የሄሲያን ኦቭ ሮዘንብሮክ ተግባርን በዘፈቀደ ቬክተር ለማስላት በጣም አስቸጋሪ አይደለም. ከሆነ p የዘፈቀደ ቬክተር ነው, ከዚያም ምርቱ SciPy፣ ማመቻቸት መምሰል:

SciPy፣ ማመቻቸት

የሄሲያንን እና የዘፈቀደ ቬክተርን ምርት የሚያሰላው ተግባር እንደ ሂስፕ ነጋሪ እሴት ወደ ዝቅተኛ ተግባር ተላልፏል፡-

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

የታመነ ክልል አልጎሪዝም ለተጣመሩ ግሬዲየሮች (ኒውተን)

የሄሲያን ማትሪክስ ደካማ ሁኔታ እና የተሳሳቱ የፍለጋ አቅጣጫዎች የኒውተን የተዋሃደ ቅልመት ስልተ-ቀመር ውጤታማ እንዳይሆን ሊያደርግ ይችላል። በእንደዚህ ዓይነት ሁኔታዎች, ምርጫ ተሰጥቷል የእምነት ክልል ዘዴ (የታማኝነት-ክልል) የኒውቶኒያ conjugate gradients.

ከሄሲያን ማትሪክስ ትርጉም ጋር ምሳሌ፡-

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

ከሄሲያን ምርት ተግባር እና የዘፈቀደ ቬክተር ጋር ምሳሌ፡-

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

የ Krylovsky አይነት ዘዴዎች

እንደ እምነት-ncg ዘዴ, የ Krylov አይነት ዘዴዎች ማትሪክስ-ቬክተር ምርቶችን ብቻ ስለሚጠቀሙ መጠነ ሰፊ ችግሮችን ለመፍታት በጣም ተስማሚ ናቸው. የእነሱ ይዘት በተቆራረጠው የ Krylov subspace የተገደበ በራስ መተማመን ክልል ውስጥ ያለውን ችግር መፍታት ነው. እርግጠኛ ላልሆኑ ችግሮች፣ ይህ ዘዴ ከታማኝነት-ncg ዘዴ ጋር ሲወዳደር አነስተኛ መስመር-ያልሆኑ ድግግሞሾችን ስለሚጠቀም በእያንዳንዱ ንዑስ ችግር ማትሪክስ-ቬክተር ምርቶችን መጠቀም የተሻለ ነው። በተጨማሪም, የኳድራቲክ ንዑስ ችግር መፍትሄ ከእምነት-ncg ዘዴ የበለጠ በትክክል ተገኝቷል.
ከሄሲያን ማትሪክስ ትርጉም ጋር ምሳሌ፡-

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

ከሄሲያን ምርት ተግባር እና የዘፈቀደ ቬክተር ጋር ምሳሌ፡-

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

በአስተማማኝ ክልል ውስጥ ለግምታዊ መፍትሄ አልጎሪዝም

ሁሉም ዘዴዎች (Newton-CG, trust-ncg እና trust-krylov) ትላልቅ ችግሮችን ለመፍታት (በሺዎች የሚቆጠሩ ተለዋዋጮች) በጣም ተስማሚ ናቸው. ይህ የሆነበት ምክንያት የስር conjugate ቅልመት ስልተ ቀመር የተገላቢጦሽ የሄሲያን ማትሪክስ ግምታዊ ግኝትን ስለሚያመለክት ነው። የሄሲያን ግልጽ የሆነ መስፋፋት ሳይኖር መፍትሄው በተደጋጋሚ ተገኝቷል. ምክንያቱም ለሄሲያን ምርት እና የዘፈቀደ ቬክተር ተግባርን መግለጽ ብቻ ስለሚያስፈልገው ይህ ስልተ ቀመር በተለይ ከስፓርስ (ዲያግናል ባንድ) ማትሪክስ ጋር ለመስራት ጥሩ ነው። ይህ ዝቅተኛ የማህደረ ትውስታ ወጪዎችን እና ጉልህ የሆነ የጊዜ ቁጠባዎችን ያቀርባል.

በመካከለኛ ደረጃ ችግሮች ውስጥ, ሄሲያንን የማከማቸት እና የማምረት ዋጋ ወሳኝ አይደለም. ይህ ማለት በራስ የመተማመን ክልል ውስጥ ያሉ ችግሮችን በትክክል በመፍታት በጥቂት ድግግሞሽ ውስጥ መፍትሄ ማግኘት ይቻላል ። ይህንን ለማድረግ፣ አንዳንድ መስመር-ያልሆኑ እኩልታዎች ለእያንዳንዱ ኳድራቲክ ንዑስ ችግር ተደጋጋሚ በሆነ መልኩ ተፈተዋል። እንዲህ ዓይነቱ መፍትሔ ብዙውን ጊዜ የ Cholesky Hessian ማትሪክስ 3 ወይም 4 መስፋፋትን ይጠይቃል. በውጤቱም, ዘዴው በጥቂት ድግግሞሽዎች ውስጥ ይሰበሰባል እና ከሌሎች የተተገበሩ የእምነት-ክልላዊ ዘዴዎች ያነሰ ተጨባጭ ተግባር ስሌት ያስፈልገዋል. ይህ አልጎሪዝም የሚያመለክተው ሙሉውን የሄሲያን ማትሪክስ ፍቺ ብቻ ነው እና የሄሲያንን ምርት እና የዘፈቀደ ቬክተርን ተግባር የመጠቀም ችሎታን አይደግፍም።

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

በዚህ ላይ, ምናልባት, እናቆማለን. በሚቀጥለው መጣጥፍ ስለ ሁኔታዊ ቅነሳ ፣የግምት ችግሮችን ለመፍታት የመቀነስ አተገባበር ፣የአንድ ተለዋዋጭ ተግባርን በመቀነስ ፣የዘፈቀደ ትንንሾችን በመቀነስ እና scipy.optimizeን በመጠቀም የእኩልታዎች ስርዓትን ለማግኘት በጣም አስደሳች የሆኑትን ለመንገር እሞክራለሁ። ጥቅል.

ምንጭ: https://docs.scipy.org/doc/scipy/reference/

ምንጭ: hab.com

አስተያየት ያክሉ