SciPy، اصلاح کول

SciPy، اصلاح کول

SciPy (د سای پای تلفظ شوی) د ریاضیاتو غوښتنلیک بسته ده چې د Numpy Python توسیع پراساس ده. د SciPy سره، ستاسو د متقابل پایتون سیشن ورته بشپړ ډیټا ساینس او ​​پیچلي سیسټم پروټوټایپ چاپیریال کیږي لکه MATLAB، IDL، Octave، R-Lab، او SciLab. نن زه غواړم په لنډ ډول د scipy.optimize بسته کې د ځینې مشهور اصلاح کولو الګوریتم کارولو څرنګوالي په اړه وغږیږم. د فنکشن کارولو په اړه نور تفصيلي او تازه مرستې تل د help() کمانډ یا د Shift+Tab په کارولو سره ترلاسه کیدی شي.

پېژندنه

د دې لپاره چې خپل ځان او لوستونکي د لومړنیو سرچینو لټون او لوستلو څخه وژغورئ، د میتودونو توضیحاتو لینکونه به په عمده توګه په ویکیپیډیا کې وي. د یوې قاعدې په توګه، دا معلومات په عمومي شرایطو کې د میتودونو او د دوی د غوښتنلیک شرایطو د پوهیدو لپاره کافي دي. د ریاضیاتي میتودونو په ماهیت پوهیدو لپاره ، د نورو مستند خپرونو لینکونو تعقیب کړئ ، کوم چې د هرې مقالې په پای کې یا ستاسو د خوښې لټون انجن کې موندل کیدی شي.

نو، د scipy.optimize ماډل د لاندې پروسیجرونو پلي کول شامل دي:

  1. د مختلفو الګوریتمونو په کارولو سره د څو متغیرونو (لږ تر لږه) د سکالر افعال مشروط او غیر مشروط کمول (نیلډر میډ سمپلیکس، BFGS، نیوټن کنجیټ ګریډینټ، کوبیلا и SLSQP)
  2. نړیوال اصلاح (د مثال په توګه: بیسن شاپنګ, توپیر_تقسیم)
  3. د پاتې شونو کمول MNC (لږترلږه مربع) او د منحنی فټینګ الګوریتمونه د غیر خطي لږترلږه مربع په کارولو سره (منحل_فټ)
  4. د یو متغیر (minim_scalar) د سکالر افعال کمول او د ریښو لټون کول (root_scalar)
  5. د مختلف الګوریتمونو په کارولو سره د معادلو سیسټم (روټ) څو اړخیز حل کونکي (هایبرډ پاول، Levenberg-Marquardt یا په لویه پیمانه میتودونه لکه نیوټن-کریلوف).

پدې مقاله کې به موږ د دې ټول لیست څخه یوازې لومړی توکي په پام کې ونیسو.

د څو متغیرونو د سکیلر فعالیت غیر مشروط کمول

د scipy.optimize کڅوړې څخه لږترلږه فعالیت د څو متغیرونو د سکالر افعالونو مشروط او غیر مشروط کمولو ستونزې حل کولو لپاره عمومي انٹرفیس چمتو کوي. د دې ښودلو لپاره چې دا څنګه کار کوي، موږ به د څو متغیرونو مناسب فعالیت ته اړتیا ولرو، کوم چې موږ به په مختلفو لارو کم کړو.

د دې موخو لپاره، د N متغیرونو Rosenbrock فعالیت کامل دی، کوم چې دا بڼه لري:

SciPy، اصلاح کول

د دې حقیقت سره سره چې د روزنبروک فعالیت او د هغې جیکوبي او هیسین میټریکونه (په ترتیب سره لومړی او دوهم مشتق) لا دمخه په 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)

د وضاحت لپاره، راځئ چې په 3D کې د دوه متغیرونو د روزنبروک فعالیت ارزښتونه رسم کړو.

د انځور کولو کوډ

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 طرزالعملونو په کارولو سره د روزنبروک فنکشن لږترلږه ارزښت ټاکلو مثالونو ته وګورو.

د Nelder-Mad simplex میتود

اجازه راکړئ چې په 0 ابعادي ځای کې x5 لومړنی ټکی وي. راځئ چې د الګوریتم په کارولو سره دې ته نږدې د روزنبروک فنکشن لږترلږه نقطه ومومئ Nelder-Med simplex (الګوریتم د میتود پیرامیټر ارزښت په توګه مشخص شوی):

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

سمپلیکس میتود د واضح تعریف شوي او په کافي اندازه اسانه فعالیت کمولو لپاره ترټولو ساده لاره ده. دا د فعالیت مشتق محاسبه کولو ته اړتیا نلري؛ دا یوازې د دې ارزښتونو مشخص کولو لپاره کافي دي. د Nelder-Mead میتود د ساده کمولو ستونزو لپاره غوره انتخاب دی. په هرصورت، ځکه چې دا د تدریجي اټکلونو څخه کار نه اخلي، دا ممکن د لږ تر لږه موندلو لپاره ډیر وخت ونیسي.

د پاول طریقه

د اصلاح کولو بل الګوریتم په کوم کې چې یوازې د فعالیت ارزښتونه محاسبه کیږي د پاول طریقه. د دې کارولو لپاره ، تاسو اړتیا لرئ میتود = 'پاول' په لږترلږه فعالیت کې تنظیم کړئ.

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

د تدریجي محاسبې فعالیت د minim فنکشن د jac پیرامیټر ارزښت په توګه مشخص شوی، لکه څنګه چې لاندې ښودل شوي.

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]

کنجیټ ګریډینټ الګوریتم (نیوټن)

الګوریتم د نیوټن کنجوګیټ ګریډینټ د نیوټن بدل شوی میتود دی.
د نیوټن طریقه د دویمې درجې د پولینومیل په واسطه په سیمه ایزه سیمه کې د نږدې فعالیت پر بنسټ والړ ده:

SciPy، اصلاح کول

چې SciPy، اصلاح کول د دوهم مشتق میټریکس (Hessian matrix, Hessian) دی.
که هیسیان مثبت ثابت وي، نو د دې فعالیت سیمه ایز حد د څلور اړخیز شکل صفر تدریجي صفر ته په مساوي کولو سره موندل کیدی شي. پایله به دا بیان وي:

SciPy، اصلاح کول

متضاد هیسیان د کنجوګیټ تدریجي میتود په کارولو سره محاسبه کیږي. د روزنبروک فعالیت کمولو لپاره د دې میتود کارولو مثال لاندې ورکړل شوی. د نیوټن-CG میتود کارولو لپاره، تاسو باید یو فنکشن مشخص کړئ چې د هیسین حساب کوي.
په تحلیلي بڼه کې د روزنبروک فعالیت هیسان مساوي دی:

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]

د Hessian د محصول د فعالیت تعریف او د خپل سري ویکتور یوه بیلګه

د ریښتیني نړۍ ستونزو کې ، د ټول هیسین میټریکس کمپیوټر کول او ذخیره کول د پام وړ وخت او حافظې سرچینو ته اړتیا لري. په دې حالت کې، په حقیقت کې هیڅ اړتیا نشته چې د هیسین میټرکس مشخص کړي، ځکه چې د کمولو کړنلاره یوازې یو ویکتور ته اړتیا لري چې د هیسین محصول سره مساوي وي د بل خپلسري ویکتور سره. په دې توګه، د محاسبې له نظره، دا خورا غوره ده چې سمدستي یو فنکشن تعریف کړئ چې د خپل سري ویکتور سره د Hessian د محصول پایله بیرته راولي.

د هیس فنکشن په پام کې ونیسئ، کوم چې د کوچني کولو ویکتور د لومړي دلیل په توګه اخلي، او یو تیري ویکتور د دویم دلیل په توګه (د فنکشن د نورو دلیلونو سره چې باید کم شي). زموږ په قضیه کې، د خپل سري ویکتور سره د Rosenbrock فنکشن د Hessian محصول محاسبه کول خورا ستونزمن ندي. که 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

د تدریجي اعتبار سیمه الګوریتم (نیوټن)

د هیسین میټرکس ضعیف حالت او د لټون غلط لارښوونې کولی شي د نیوټن د کنجیټ ګریډینټ الګوریتم غیر موثر کیدو لامل شي. په داسې قضیو کې، لومړیتوب ورکول کیږي د باور سیمه طریقه (د اعتماد سیمه) د نیوټن تدریجي تنظیم کول.

د هیسین میټرکس تعریف سره بیلګه:

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

Krylov ډوله میتودونه

د باور-ncg میتود په څیر، د کریلوف ډوله میتودونه د لوی پیمانه ستونزو د حل لپاره مناسب دي ځکه چې دوی یوازې د میټریکس ویکتور محصولات کاروي. د دوی جوهر د اعتماد په سیمه کې د ستونزې حل کول دي چې د کریلوف فرعي ځای لخوا محدود شوي. د ناڅرګندو ستونزو لپاره، دا غوره ده چې دا طریقه وکاروئ، ځکه چې دا د ټرسټ-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.]

د باور په سیمه کې د نږدې حل لپاره الګوریتم

ټول میتودونه (نیوټن-CG، اعتماد-ncg او اعتماد-کریلوف) د لوی پیمانه ستونزو د حل لپاره مناسب دي (د زرګونو متغیرونو سره). دا د دې حقیقت له امله دی چې د لاندې کنجګیټ تدریجي الګوریتم د معکوس هیسیان میټرکس اټکل اټکل کوي. حل په تکراري ډول موندل کیږي، پرته له دې چې د هیسین واضح پراخوالی. له دې امله چې تاسو یوازې د Hessian او د خپل سري ویکتور محصول لپاره د فنکشن تعریف کولو ته اړتیا لرئ، دا الګوریتم په ځانګړې توګه د سپارس (بنډ ډیګونال) میټریکونو سره کار کولو لپاره ښه دی. دا د حافظې ټیټ لګښتونه او د پام وړ وخت سپما چمتو کوي.

د منځنۍ کچې ستونزو لپاره، د هیسین ذخیره کولو او فاکتور کولو لګښت مهم ندی. دا پدې مانا ده چې دا ممکنه ده چې په لږو تکرارونو کې حل ترلاسه کړئ، د باور سیمې فرعي ستونزې تقریبا په سمه توګه حل کړئ. د دې کولو لپاره، ځینې غیر خطي معادلې د هرې څلور اړخیزې فرعي ستونزې لپاره په تکراري ډول حل کیږي. دا ډول محلول معمولا د هیسین میټرکس 3 یا 4 Cholesky تخریب ته اړتیا لري. د پایلې په توګه، میتود په لږو تکرارونو کې بدلیږي او د نورو پلي شوي باور سیمې میتودونو په پرتله لږ هدفي فعالیت محاسبې ته اړتیا لري. پدې الګوریتم کې یوازې د بشپړ هیسین میټریکس ټاکل شامل دي او د هیسیان محصول فعالیت او یو تیري ویکتور کارولو وړتیا ملاتړ نه کوي.

د روزنبروک فنکشن کمولو سره مثال:

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

موږ به شاید هلته ودریږو. په راتلونکې مقاله کې به زه هڅه وکړم چې د مشروط کمولو په اړه خورا په زړه پوري شیان ووایم ، د نږدې ستونزو په حل کې د لږترلږه کولو پلي کول ، د یو متغیر فعالیت کمول ، خپلسري minimizers ، او د scipy.optimize په کارولو سره د مساواتو سیسټم ریښې موندل. بسته

سرچینه: https://docs.scipy.org/doc/scipy/reference/

سرچینه: www.habr.com

Add a comment