SciPy (د سای پای تلفظ شوی) د ریاضیاتو غوښتنلیک بسته ده چې د Numpy Python توسیع پراساس ده. د SciPy سره، ستاسو د متقابل پایتون سیشن ورته بشپړ ډیټا ساینس او پیچلي سیسټم پروټوټایپ چاپیریال کیږي لکه MATLAB، IDL، Octave، R-Lab، او SciLab. نن زه غواړم په لنډ ډول د scipy.optimize بسته کې د ځینې مشهور اصلاح کولو الګوریتم کارولو څرنګوالي په اړه وغږیږم. د فنکشن کارولو په اړه نور تفصيلي او تازه مرستې تل د help() کمانډ یا د Shift+Tab په کارولو سره ترلاسه کیدی شي.
پېژندنه
د دې لپاره چې خپل ځان او لوستونکي د لومړنیو سرچینو لټون او لوستلو څخه وژغورئ، د میتودونو توضیحاتو لینکونه به په عمده توګه په ویکیپیډیا کې وي. د یوې قاعدې په توګه، دا معلومات په عمومي شرایطو کې د میتودونو او د دوی د غوښتنلیک شرایطو د پوهیدو لپاره کافي دي. د ریاضیاتي میتودونو په ماهیت پوهیدو لپاره ، د نورو مستند خپرونو لینکونو تعقیب کړئ ، کوم چې د هرې مقالې په پای کې یا ستاسو د خوښې لټون انجن کې موندل کیدی شي.
نو، د scipy.optimize ماډل د لاندې پروسیجرونو پلي کول شامل دي:
- د مختلفو الګوریتمونو په کارولو سره د څو متغیرونو (لږ تر لږه) د سکالر افعال مشروط او غیر مشروط کمول (نیلډر میډ سمپلیکس، BFGS، نیوټن کنجیټ ګریډینټ،
کوبیلا иSLSQP ) - نړیوال اصلاح (د مثال په توګه:
بیسن شاپنګ ,توپیر_تقسیم ) - د پاتې شونو کمول
MNC (لږترلږه مربع) او د منحنی فټینګ الګوریتمونه د غیر خطي لږترلږه مربع په کارولو سره (منحل_فټ) - د یو متغیر (minim_scalar) د سکالر افعال کمول او د ریښو لټون کول (root_scalar)
- د مختلف الګوریتمونو په کارولو سره د معادلو سیسټم (روټ) څو اړخیز حل کونکي (هایبرډ پاول،
Levenberg-Marquardt یا په لویه پیمانه میتودونه لکهنیوټن-کریلوف ).
پدې مقاله کې به موږ د دې ټول لیست څخه یوازې لومړی توکي په پام کې ونیسو.
د څو متغیرونو د سکیلر فعالیت غیر مشروط کمول
د scipy.optimize کڅوړې څخه لږترلږه فعالیت د څو متغیرونو د سکالر افعالونو مشروط او غیر مشروط کمولو ستونزې حل کولو لپاره عمومي انٹرفیس چمتو کوي. د دې ښودلو لپاره چې دا څنګه کار کوي، موږ به د څو متغیرونو مناسب فعالیت ته اړتیا ولرو، کوم چې موږ به په مختلفو لارو کم کړو.
د دې موخو لپاره، د N متغیرونو Rosenbrock فعالیت کامل دی، کوم چې دا بڼه لري:
د دې حقیقت سره سره چې د روزنبروک فعالیت او د هغې جیکوبي او هیسین میټریکونه (په ترتیب سره لومړی او دوهم مشتق) لا دمخه په 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()
دمخه پوهیدل چې لږترلږه په 0 کې دی ، راځئ چې د مختلف scipy.optimize طرزالعملونو په کارولو سره د روزنبروک فنکشن لږترلږه ارزښت ټاکلو مثالونو ته وګورو.
د Nelder-Mad simplex میتود
اجازه راکړئ چې په 0 ابعادي ځای کې x5 لومړنی ټکی وي. راځئ چې د الګوریتم په کارولو سره دې ته نږدې د روزنبروک فنکشن لږترلږه نقطه ومومئ
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) الګوریتم
د حل لپاره د ګړندۍ همغږۍ ترلاسه کولو لپاره ، کړنلاره
راځئ چې د Rosenbrock فعالیت مشتق په تحلیلي بڼه ومومئ:
دا بیان د ټولو متغیرونو د مشتقاتو لپاره د اعتبار وړ دی پرته له لومړي او وروستي ، کوم چې په لاندې ډول تعریف شوي:
راځئ چې د 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]
کنجیټ ګریډینټ الګوریتم (نیوټن)
الګوریتم
د نیوټن طریقه د دویمې درجې د پولینومیل په واسطه په سیمه ایزه سیمه کې د نږدې فعالیت پر بنسټ والړ ده:
چې د دوهم مشتق میټریکس (Hessian matrix, Hessian) دی.
که هیسیان مثبت ثابت وي، نو د دې فعالیت سیمه ایز حد د څلور اړخیز شکل صفر تدریجي صفر ته په مساوي کولو سره موندل کیدی شي. پایله به دا بیان وي:
متضاد هیسیان د کنجوګیټ تدریجي میتود په کارولو سره محاسبه کیږي. د روزنبروک فعالیت کمولو لپاره د دې میتود کارولو مثال لاندې ورکړل شوی. د نیوټن-CG میتود کارولو لپاره، تاسو باید یو فنکشن مشخص کړئ چې د هیسین حساب کوي.
په تحلیلي بڼه کې د روزنبروک فعالیت هیسان مساوي دی:
چې и ، میټریکس تعریف کړئ .
د میټریکس پاتې غیر صفر عناصر سره مساوي دي:
د مثال په توګه، په یو پنځه اړخیزه ځای کې N = 5، د Rosenbrock فعالیت لپاره هیسیان میټریکس د بډ بڼه لري:
کوډ چې د دې هیسین سره حساب کوي د کوډ سره د روزنبروک فنکشن کمولو لپاره د کنجیټ ګریډینټ (نیوټن) میتود په کارولو سره:
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 یو خپلسري ویکتور دی، بیا محصول داسې ښکاري لکه چې:
هغه فنکشن چې د هیسین محصول محاسبه کوي او د ارټریټ ویکتور کمولو فنکشن ته د هیسپ دلیل ارزښت په توګه لیږدول کیږي:
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 په کارولو سره د مساواتو سیسټم ریښې موندل. بسته
سرچینه:
سرچینه: www.habr.com