SciPy، اصلاح

SciPy، اصلاح

SciPy (تلفظ سائي پائي) ھڪڙو رياضياتي ايپليڪيشن پيڪيج آھي جيڪو Numpy Python ايڪسٽينشن تي ٻڌل آھي. SciPy سان، توهان جو انٽرويو پٿون سيشن ساڳيو مڪمل ڊيٽا سائنس ۽ پيچيده سسٽم پروٽوٽائپنگ ماحول بڻجي ويندو آهي جيئن MATLAB، IDL، Octave، R-Lab، ۽ SciLab. اڄ آئون مختصر طور تي ڳالهائڻ چاهيان ٿو ته scipy.optimize پيڪيج ۾ ڪجهه مشهور اصلاحي الگورتھم ڪيئن استعمال ڪجي. وڌيڪ تفصيلي ۽ تازه ترين مدد فنکشن استعمال ڪرڻ تي هميشه حاصل ڪري سگهجي ٿي مدد () ڪمانڊ استعمال ڪندي يا استعمال ڪندي Shift+Tab.

تعارف

پاڻ کي ۽ پڙهندڙن کي بنيادي ماخذ ڳولڻ ۽ پڙهڻ کان بچائڻ لاءِ، طريقن جي وضاحت جا لنڪ خاص طور تي وڪيپيڊيا تي هوندا. ضابطي جي طور تي، هي معلومات عام اصطلاحن ۾ طريقن ۽ انهن جي درخواست جي شرطن کي سمجهڻ لاء ڪافي آهي. رياضياتي طريقن جي جوهر کي سمجهڻ لاءِ، وڌيڪ مستند اشاعتن جي لنڪ جي پيروي ڪريو، جيڪي هر مضمون جي آخر ۾ يا توهان جي پسنديده سرچ انجڻ ۾ ملي سگهن ٿيون.

تنهن ڪري، scipy.optimize ماڊل شامل آهن هيٺين طريقيڪار تي عمل درآمد:

  1. مختلف الگورتھم استعمال ڪندي ڪيترن ئي متغيرن جي اسڪيلر افعال جي مشروط ۽ غير مشروط گھٽتائي (نيلڊر-ميڊ ساديڪس، BFGS، نيوٽن ڪنجوگيٽ گريڊيئنٽس، ڪوبيلا и SLSQP)
  2. عالمي اصلاح (مثال طور: basinhopping, diff_evolution)
  3. گھٽ ۾ گھٽ بقايا MNC (least_squares) ۽ وکر فٹنگ الگورتھم استعمال ڪندي غير لڪير گھٽ ۾ گھٽ چوڪن (وکر_فٽ)
  4. ھڪڙي متغير (minim_scalar) جي اسڪيلر افعال کي گھٽائڻ ۽ جڙ جي ڳولا (root_scalar)
  5. مختلف الگورتھم (هائبرڊ پاول، Levenberg-Marquardt يا وڏي پيماني تي طريقن جهڙوڪ نيوٽن-ڪريلوف).

هن آرٽيڪل ۾ اسان هن سڄي فهرست مان صرف پهرين شيء تي غور ڪنداسين.

ڪيترن ئي متغيرن جي اسڪالر فنڪشن جي غير مشروط گھٽتائي

scipy.optimize پيڪيج مان گھٽ ۾ گھٽ فنڪشن ڪيترن ئي متغيرن جي اسڪيلر افعال جي مشروط ۽ غير مشروط گھٽ ۾ گھٽ مسئلن کي حل ڪرڻ لاءِ عام انٽرفيس مهيا ڪري ٿو. اهو ڏيکارڻ لاءِ ته اهو ڪيئن ڪم ڪري ٿو، اسان کي ڪيترن ئي متغيرن جي هڪ مناسب فنڪشن جي ضرورت پوندي، جنهن کي اسين مختلف طريقن سان گھٽ ڪنداسين.

انهن مقصدن لاء، N variables جو Rosenbrock فنڪشن مڪمل آهي، جنهن جو فارم آهي:

SciPy، اصلاح

ان حقيقت جي باوجود ته Rosenbrock فنڪشن ۽ ان جي Jacobi ۽ Hessian matrices (پهريون ۽ ٻيو نڪتل، ترتيب سان) اڳ ۾ ئي وضاحت ڪئي وئي آهي 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 ۾ ٻن متغيرن جي Rosenbrock فنڪشن جا قدر ٺاھيون.

ڊرائنگ ڪوڊ

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 فنڪشن جي گھٽ ۾ گھٽ قيمت جو تعين ڪجي.

Nelder-Mead simplex طريقو

اچو ته 0-dimensional اسپيس ۾ شروعاتي پوائنٽ x5 هجي. اچو ته الورورٿم استعمال ڪندي ان جي ويجهو Rosenbrock فنڪشن جو گهٽ ۾ گهٽ نقطو ڳوليو 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 طريقو عام طور تي سادوڪس طريقي جي ڀيٽ ۾ گهٽ فنڪشن ڪالن جي ضرورت آهي.

اچو ته 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]

ڪنجوگيٽ گريجوئيٽ الگورتھم (نيوٽن)

الورورٿم نيوٽن جي ڪنجوگيٽ گراڊينٽ هڪ تبديل ٿيل نيوٽن جو طريقو آهي.
نيوٽن جو طريقو هڪ مقامي علائقي ۾ هڪ فنڪشن کي ٻئي درجي جي هڪ پولينوميل ذريعي لڳ ڀڳ ڪرڻ تي ٻڌل آهي:

SciPy، اصلاح

جتي SciPy، اصلاح ٻئي نڪتن جو ميٽرڪس آهي (هيسين ميٽرڪس، هيسين).
جيڪڏهن هيسين مثبت آهي، ته پوءِ هن فنڪشن جو مقامي گهٽ ۾ گهٽ ڳولهي سگهجي ٿو صفر جي برابر ڪرڻ سان چوگرد فارم جي صفر گرڊيئينٽ کي صفر. نتيجو ظاهر ٿيندو:

SciPy، اصلاح

inverse Hessian حساب ڪيو ويو آهي conjugate gradient طريقي سان. Rosenbrock فنڪشن کي گھٽائڻ لاء ھن طريقي کي استعمال ڪرڻ جو ھڪڙو مثال ھيٺ ڏنل آھي. نيوٽن-سي جي جي طريقي کي استعمال ڪرڻ لاء، توهان کي هڪ فنڪشن بيان ڪرڻ گهرجي جيڪو هيسين جي حساب سان.
تجزياتي شڪل ۾ Rosenbrock فنڪشن جو هيسين برابر آهي:

SciPy، اصلاح

SciPy، اصلاح

جتي SciPy، اصلاح и SciPy، اصلاح، ميٽرڪس جي وضاحت ڪريو SciPy، اصلاح.

ميٽرڪس جا باقي غير صفر عناصر برابر آهن:

SciPy، اصلاح

SciPy، اصلاح

SciPy، اصلاح

SciPy، اصلاح

مثال طور، هڪ پنج-dimensional خلا ۾ N = 5، Rosenbrock فنڪشن لاء هيسين ميٽرڪس هڪ بئنڊ جي صورت ۾ آهي:

SciPy، اصلاح

ڪوڊ جيڪو حساب ڪري ٿو هي هيسين ڪوڊ سان گڏ Rosenbrock فنڪشن کي گھٽائڻ لاءِ conjugate gradient (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]

هيسين جي پيداوار جي فنڪشن جي تعريف سان هڪ مثال ۽ هڪ ثالث ویکٹر

حقيقي دنيا جي مسئلن ۾، سڄي هيسين ميٽرڪس کي ڪمپيوٽنگ ۽ محفوظ ڪرڻ لاء اهم وقت ۽ ياداشت جي وسيلن جي ضرورت هوندي آهي. انهي صورت ۾، اصل ۾ هيسين ميٽرڪس پاڻ کي بيان ڪرڻ جي ڪا ضرورت ناهي، ڇاڪاڻ ته گھٽ ۾ گھٽ ڪرڻ جي عمل کي صرف ھڪ ویکٹر جي ضرورت آھي ھسين جي پيداوار جي برابر ھڪ ٻئي صوابديدي ویکٹر سان. اهڙيءَ طرح، هڪ حسابي نقطي نظر کان، اهو تمام گهڻو بهتر آهي ته فوري طور تي هڪ فنڪشن جو تعين ڪيو وڃي جيڪو هيسين جي پيداوار جي نتيجي کي هڪ خودمختيار ویکٹر سان موٽائي.

ھيس فنڪشن تي غور ڪريو، جيڪو گھٽ ۾ گھٽ ڪرڻ واري ویکٹر کي پھرئين دليل طور وٺندو آھي، ۽ ھڪڙي ارگيٽري ويڪٽر کي ٻئي دليل جي طور تي (گھٽڻ لاءِ فنڪشن جي ٻين دليلن سان گڏ). اسان جي حالت ۾، روزنبروڪ فنڪشن جي هيسين جي پيداوار کي ڳڻپيوڪر ويڪٽر سان حساب ڪرڻ تمام ڏکيو ناهي. جيڪڏهن p هڪ خودمختيار ویکٹر آهي، پوء پيداوار SciPy، اصلاح فارم آهي:

SciPy، اصلاح

اهو فنڪشن جيڪو حساب ڪري ٿو Hessian جي پيداوار ۽ هڪ صوابديدي ویکٹر کي هيسپ دليل جي قدر جي طور تي منظور ڪيو ويو ڪم کي گھٽ ڪرڻ لاءِ:

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 gradient اعتماد واري علائقي الگورتھم (نيوٽن)

هيسين ميٽرڪس جي خراب ڪنڊيشننگ ۽ غلط ڳولا جون هدايتون نيوٽن جي ڪنجوگيٽ گريڊيئنٽ الگورٿم کي غير اثرائتو بڻائي سگھي ٿي. اهڙين حالتن ۾، ترجيح ڏني وئي آهي اعتماد واري علائقي جو طريقو (اعتماد-علائقي) نيوٽن گريڊيئنٽس جوڙڻ.

هيسين ميٽرڪس جي تعريف سان مثال:

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 قسم جا طريقا

اعتماد-اين سي جي طريقي وانگر، ڪريلوف قسم جا طريقا وڏي پئماني تي مسئلا حل ڪرڻ لاءِ موزون آهن ڇو ته اهي صرف ميٽرڪس-ویکٹر پروڊڪٽس استعمال ڪندا آهن. انهن جو جوهر اهو آهي ته هڪ اعتماد واري علائقي ۾ هڪ مسئلو حل ڪرڻ لاءِ محدود ڪريلوف سب اسپيس طرفان. غير يقيني مسئلن لاء، اهو بهتر آهي ته هي طريقو استعمال ڪيو وڃي، ڇاڪاڻ ته اهو اعتماد-اين سي جي طريقي جي مقابلي ۾، في سب پروبلم ميٽرڪس-ویکٹر پراڊڪٽس جي ننڍڙي تعداد جي ڪري، غير لائنر تکرارن جو ننڍڙو تعداد استعمال ڪري ٿو. ان کان علاوه، quadratic subproblem جو حل trust-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) وڏي پئماني تي مسئلا حل ڪرڻ لاءِ موزون آهن (هزارين متغيرن سان). اهو هن حقيقت جي ڪري آهي ته هيٺيون ڪنجوگيٽ گريجوئيٽ الگورٿم انورس هيسين ميٽرڪس جي لڳ ڀڳ طئي ڪرڻ جو مطلب آهي. هيسئن جي واضح توسيع کان سواءِ، اهو حل ڳولهيو وڃي ٿو. جيئن ته توهان کي صرف هيسين جي پيداوار لاءِ هڪ فنڪشن جي وضاحت ڪرڻ جي ضرورت آهي ۽ هڪ صوابديدي ویکٹر، هي الگورٿم خاص طور تي اسپارس (بينڊ ڊاگونل) ميٽرڪس سان ڪم ڪرڻ لاءِ سٺو آهي. هي گهٽ ياداشت جي قيمت ۽ اهم وقت جي بچت فراهم ڪري ٿو.

وچولي درجي جي مسئلن لاء، هيسين کي اسٽوريج ۽ فيڪٽر ڪرڻ جي قيمت نازڪ ناهي. هن جو مطلب اهو آهي ته اهو ممڪن آهي ته گهٽ ۾ گهٽ ورهاڱي ۾ حل حاصل ڪرڻ، ڀروسي واري علائقي جي ذيلي مسئلن کي حل ڪرڻ لڳ ڀڳ بلڪل. هن کي ڪرڻ لاء، ڪجهه غير لڪير مساواتن کي حل ڪيو وڃي ٿو بار بار هر هڪ ذيلي ذيلي مسئلي لاء. اهڙي حل کي عام طور تي هيسين ميٽرڪس جي 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/

جو ذريعو: www.habr.com

تبصرو شامل ڪريو