SciPy (تلفظ سائي پائي) ھڪڙو رياضياتي ايپليڪيشن پيڪيج آھي جيڪو Numpy Python ايڪسٽينشن تي ٻڌل آھي. SciPy سان، توهان جو انٽرويو پٿون سيشن ساڳيو مڪمل ڊيٽا سائنس ۽ پيچيده سسٽم پروٽوٽائپنگ ماحول بڻجي ويندو آهي جيئن MATLAB، IDL، Octave، R-Lab، ۽ SciLab. اڄ آئون مختصر طور تي ڳالهائڻ چاهيان ٿو ته scipy.optimize پيڪيج ۾ ڪجهه مشهور اصلاحي الگورتھم ڪيئن استعمال ڪجي. وڌيڪ تفصيلي ۽ تازه ترين مدد فنکشن استعمال ڪرڻ تي هميشه حاصل ڪري سگهجي ٿي مدد () ڪمانڊ استعمال ڪندي يا استعمال ڪندي Shift+Tab.
تعارف
پاڻ کي ۽ پڙهندڙن کي بنيادي ماخذ ڳولڻ ۽ پڙهڻ کان بچائڻ لاءِ، طريقن جي وضاحت جا لنڪ خاص طور تي وڪيپيڊيا تي هوندا. ضابطي جي طور تي، هي معلومات عام اصطلاحن ۾ طريقن ۽ انهن جي درخواست جي شرطن کي سمجهڻ لاء ڪافي آهي. رياضياتي طريقن جي جوهر کي سمجهڻ لاءِ، وڌيڪ مستند اشاعتن جي لنڪ جي پيروي ڪريو، جيڪي هر مضمون جي آخر ۾ يا توهان جي پسنديده سرچ انجڻ ۾ ملي سگهن ٿيون.
تنهن ڪري، scipy.optimize ماڊل شامل آهن هيٺين طريقيڪار تي عمل درآمد:
مختلف الگورتھم استعمال ڪندي ڪيترن ئي متغيرن جي اسڪيلر افعال جي مشروط ۽ غير مشروط گھٽتائي (نيلڊر-ميڊ ساديڪس، BFGS، نيوٽن ڪنجوگيٽ گريڊيئنٽس، ڪوبيلا и SLSQP)
هن آرٽيڪل ۾ اسان هن سڄي فهرست مان صرف پهرين شيء تي غور ڪنداسين.
ڪيترن ئي متغيرن جي اسڪالر فنڪشن جي غير مشروط گھٽتائي
scipy.optimize پيڪيج مان گھٽ ۾ گھٽ فنڪشن ڪيترن ئي متغيرن جي اسڪيلر افعال جي مشروط ۽ غير مشروط گھٽ ۾ گھٽ مسئلن کي حل ڪرڻ لاءِ عام انٽرفيس مهيا ڪري ٿو. اهو ڏيکارڻ لاءِ ته اهو ڪيئن ڪم ڪري ٿو، اسان کي ڪيترن ئي متغيرن جي هڪ مناسب فنڪشن جي ضرورت پوندي، جنهن کي اسين مختلف طريقن سان گھٽ ڪنداسين.
انهن مقصدن لاء، N variables جو Rosenbrock فنڪشن مڪمل آهي، جنهن جو فارم آهي:
ان حقيقت جي باوجود ته Rosenbrock فنڪشن ۽ ان جي Jacobi ۽ Hessian matrices (پهريون ۽ ٻيو نڪتل، ترتيب سان) اڳ ۾ ئي وضاحت ڪئي وئي آهي scipy.optimize پيڪيج ۾، اسان پاڻ ان جي وضاحت ڪنداسين.
وضاحت لاءِ، اچو ته 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()
اڳ ۾ ڄاڻو ته گهٽ ۾ گهٽ آهي 0 تي ، اچو ته مثالن تي نظر وجهون ته ڪيئن مختلف scipy.optimize طريقا استعمال ڪندي Rosenbrock فنڪشن جي گھٽ ۾ گھٽ قيمت جو تعين ڪجي.
Nelder-Mead simplex طريقو
اچو ته 0-dimensional اسپيس ۾ شروعاتي پوائنٽ x5 هجي. اچو ته الورورٿم استعمال ڪندي ان جي ويجهو Rosenbrock فنڪشن جو گهٽ ۾ گهٽ نقطو ڳوليو Nelder-Med simplex (الورورٿم بيان ڪيو ويو آهي طريقي جي قيمت جي طور تي):
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 339
Function evaluations: 571
[1. 1. 1. 1. 1.]
ساديڪس جو طريقو واضح طور تي بيان ڪيل ۽ مناسب طور تي هموار فنڪشن کي گھٽائڻ جو آسان طريقو آهي. اهو ضروري ناهي ته ڪنهن فنڪشن جي نڪتن جي حساب سان؛ اهو صرف ان جي قيمتن کي بيان ڪرڻ لاء ڪافي آهي. Nelder-Mead طريقو سادي گھٽائڻ جي مسئلن لاء سٺو انتخاب آھي. تنهن هوندي، جيئن ته اهو تدريسي تخمينو استعمال نٿو ڪري، اهو گهٽ ۾ گهٽ ڳولڻ ۾ گهڻي وقت وٺي سگھي ٿو.
پائوڊر جو طريقو
هڪ ٻيو اصلاحي الورورٿم جنهن ۾ صرف فنڪشن جا قدر ڳڻيا ويندا آهن پاول جو طريقو. ان کي استعمال ڪرڻ لاءِ، توھان کي مقرر ڪرڻو پوندو طريقو = 'پاول' گھٽ ۾ گھٽ فنڪشن ۾.
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 فنڪشن جو نڪتل تجزياتي شڪل ۾ ڳوليون:
هي اظهار سڀني متغيرن جي نڪتن لاءِ صحيح آهي سواءِ پهرئين ۽ آخري جي، جن کي هن ريت بيان ڪيو ويو آهي:
اچو ته 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]
ڪنجوگيٽ گريجوئيٽ الگورتھم (نيوٽن)
الورورٿم نيوٽن جي ڪنجوگيٽ گراڊينٽ هڪ تبديل ٿيل نيوٽن جو طريقو آهي.
نيوٽن جو طريقو هڪ مقامي علائقي ۾ هڪ فنڪشن کي ٻئي درجي جي هڪ پولينوميل ذريعي لڳ ڀڳ ڪرڻ تي ٻڌل آهي:
جتي ٻئي نڪتن جو ميٽرڪس آهي (هيسين ميٽرڪس، هيسين).
جيڪڏهن هيسين مثبت آهي، ته پوءِ هن فنڪشن جو مقامي گهٽ ۾ گهٽ ڳولهي سگهجي ٿو صفر جي برابر ڪرڻ سان چوگرد فارم جي صفر گرڊيئينٽ کي صفر. نتيجو ظاهر ٿيندو:
inverse Hessian حساب ڪيو ويو آهي conjugate gradient طريقي سان. Rosenbrock فنڪشن کي گھٽائڻ لاء ھن طريقي کي استعمال ڪرڻ جو ھڪڙو مثال ھيٺ ڏنل آھي. نيوٽن-سي جي جي طريقي کي استعمال ڪرڻ لاء، توهان کي هڪ فنڪشن بيان ڪرڻ گهرجي جيڪو هيسين جي حساب سان.
تجزياتي شڪل ۾ Rosenbrock فنڪشن جو هيسين برابر آهي:
جتي и ، ميٽرڪس جي وضاحت ڪريو .
ميٽرڪس جا باقي غير صفر عناصر برابر آهن:
مثال طور، هڪ پنج-dimensional خلا ۾ N = 5، Rosenbrock فنڪشن لاء هيسين ميٽرڪس هڪ بئنڊ جي صورت ۾ آهي:
ڪوڊ جيڪو حساب ڪري ٿو هي هيسين ڪوڊ سان گڏ 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 هڪ خودمختيار ویکٹر آهي، پوء پيداوار فارم آهي:
اهو فنڪشن جيڪو حساب ڪري ٿو 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
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 چوليسڪي ٺهڻ جي ضرورت آهي. نتيجي طور، طريقو ٿورڙي ورجائي ۾ بدلجي ٿو ۽ ٻين لاڳو ٿيل اعتماد واري علائقي جي طريقن جي ڀيٽ ۾ گھٽ مقصدي فنڪشن جي حسابن جي ضرورت آهي. هي الگورٿم صرف مڪمل هيسين ميٽرڪس جو تعين ڪرڻ ۾ شامل آهي ۽ هيسين جي پراڊڪٽ فنڪشن کي استعمال ڪرڻ جي صلاحيت کي سپورٽ نٿو ڪري ۽ هڪ صوابديدي ویکٹر.