سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

مقالو ڪيترن ئي طريقن تي بحث ڪري ٿو رياضياتي مساوات جو تعين ڪرڻ لاءِ هڪ سادي (جوڙيل) ريگريشن لائن.

هتي بحث ڪيل مساوات کي حل ڪرڻ جا سڀئي طريقا گهٽ ۾ گهٽ چوڪن جي طريقن تي ٻڌل آهن. اچو ته هيٺين طريقن کي بيان ڪريون:

  • تجزياتي حل
  • گريجوئيٽ نزول
  • Stochastic gradient نزول

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

مضمون ۾ ڏنل سڀئي ڪوڊ ٻوليءَ ۾ لکيل آهن سري لنڪس استعمال ڪندي جوپيوٽ نوٽ بڪ. ماخذ ڪوڊ ۽ فائل نموني ڊيٽا سان گڏ پوسٽ ٿيل آهن گيتب

مضمون جو وڌيڪ مقصد آهي ٻنهي شروعاتي ۽ انهن لاءِ جيڪي آهستي آهستي مصنوعي ذهانت - مشين لرننگ جي هڪ تمام وسيع حصي جي مطالعي ۾ مهارت حاصل ڪرڻ شروع ڪري چڪا آهن.

مواد کي بيان ڪرڻ لاء، اسان هڪ تمام سادي مثال استعمال ڪندا آهيون.

مثالي حالتون

اسان وٽ پنج قدر آھن جيڪي انحصار کي بيان ڪن ٿا Y от X (ٽيبل نمبر 1):

جدول نمبر 1 ”مثال جا شرط“

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

اسان فرض ڪنداسين ته قدر سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ سال جو مهينو آهي، ۽ سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ - آمدني هن مهيني. ٻين لفظن ۾، آمدني سال جي مهيني تي منحصر آهي، ۽ سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ - واحد نشاني جنهن تي آمدني منحصر آهي.

مثال ائين آهي، ٻنهي جي نقطي نظر کان، سال جي مهيني تي آمدني جي مشروط انحصار جي نقطي نظر کان، ۽ قدرن جي تعداد جي نقطي نظر کان - انهن مان تمام ٿورا آهن. بهرحال، اهڙي سادگي اهو ممڪن بڻائي سگهندي، جيئن اهي چون ٿا، وضاحت ڪرڻ لاء، هميشه آسانيء سان نه، اهو مواد جيڪو شروعاتي طور تي ملائي ٿو. ۽ انگن جي سادگي پڻ انهن کي اجازت ڏئي ٿي جيڪي ڪاغذ تي مثال حل ڪرڻ چاهيندا آهن بغير اهم مزدور خرچن جي.

اچو ته فرض ڪريون ته مثال ۾ ڏنل انحصار کي فارم جي سادي (جوڙيل) ريگريشن لائن جي رياضياتي مساوات سان چڱيءَ طرح اندازو لڳائي سگهجي ٿو:

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

جتي سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ اهو مهينو آهي جنهن ۾ آمدني حاصل ڪئي وئي هئي، سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ - مهيني جي مطابق آمدني، سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ تخميني لڪير جي رجعت جي گنجائش آهن.

نوٽ ڪريو ته coefficient سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ اڪثر ڪري اندازي مطابق لڪير جي سلپ يا گريجوئيٽ سڏيو ويندو آهي؛ رقم جي نمائندگي ڪري ٿو جنهن جي ذريعي سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ جڏهن اهو تبديل ٿئي ٿو سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ.

ظاھر آھي، مثال ۾ اسان جو ڪم آھي مساوات ۾ اھڙين ڪوئفينٽس کي چونڊڻ سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ, جنهن تي صحيح جوابن کان مهيني جي حساب سان اسان جي آمدني جي قيمتن جي انحراف، يعني. نموني ۾ پيش ڪيل قدر گهٽ ۾ گهٽ هوندا.

گھٽ ۾ گھٽ چورس طريقو

گھٽ ۾ گھٽ چوڪن جي طريقي جي مطابق، انحراف کي چورس ڪرڻ سان حساب ڪيو وڃي. هي ٽيڪنڪ توهان کي انحراف جي باہمي منسوخي کان بچڻ جي اجازت ڏئي ٿي جيڪڏهن اهي مخالف نشانيون آهن. مثال طور، جيڪڏهن هڪ صورت ۾، انحراف آهي +5 (پلس پنج)، ۽ ٻئي ۾ -5 (مائنس پنج)، پوءِ انحرافن جو مجموعو هڪ ٻئي کي رد ڪري ڇڏيندو ۽ رقم 0 (صفر) ٿي ويندي. اهو ممڪن آهي ته انحراف کي چورس نه ڪيو وڃي، پر ماڊيولس جي ملڪيت کي استعمال ڪرڻ ۽ پوء سڀ انحراف مثبت ٿي ويندا ۽ جمع ٿيندا. اسان هن نقطي تي تفصيل سان نه رهنداسين، پر صرف اهو ظاهر ڪنداسين ته حساب جي سهولت لاء، انحراف کي مربع ڪرڻ جو رواج آهي.

اھو اھو آھي جيڪو فارمولا ڏسڻ ۾ اچي ٿو جنھن سان اسين گھٽ ۾ گھٽ رقم جي چورس انحراف (غلطي) جو تعين ڪنداسين:

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

جتي سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ صحيح جوابن جي لڳ ڀڳ جو ڪم آھي (اھو آھي، آمدني جيڪو اسان ڳڻيو آھي)،

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ سچا جواب آهن (نموني ۾ مهيا ڪيل آمدني)،

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ نموني انڊيڪس آهي (مهيني جو تعداد جنهن ۾ انحراف طئي ڪيو ويو آهي)

اچو ته فنڪشن کي مختلف ڪريون، جزوي فرق جي مساواتن کي بيان ڪريون، ۽ تجزياتي حل ڏانهن وڃڻ لاءِ تيار ٿي وڃو. پر پهرين، اچو ته هڪ مختصر سير ڪريون ته تفريق ڇا آهي ۽ نڪتل جي جاميٽري معنيٰ کي ياد ڪريون.

تفاوت

تفريق هڪ فنڪشن جي نڪتل ڳولڻ جو عمل آهي.

derivative ڇا لاء استعمال ڪيو ويو آهي؟ هڪ فنڪشن جو نڪتل فنڪشن جي تبديلي جي شرح کي بيان ڪري ٿو ۽ اسان کي ان جي هدايت کي ٻڌائي ٿو. جيڪڏهن ڏنل نقطي تي نڪتل مثبت آهي، ته پوء ڪم وڌائي ٿو، ٻي صورت ۾، ڪم گھٽجي ٿو. ۽ جيتري قدر مطلق نڪتل جي قدر وڌيڪ هوندي، اوترو ئي اوترو فعلي قدرن جي تبديليءَ جي شرح، ان سان گڏوگڏ فنڪشن گراف جي سلپ اوترو وڌيڪ.

مثال طور، ڪارٽيزئن ڪوآرڊينيٽ سسٽم جي حالتن هيٺ، پوائنٽ M(0,0) تي نڪتل جو قدر برابر آهي. 25 + مطلب ته ڏنل نقطي تي، جڏهن قدر کي منتقل ڪيو ويندو آهي سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ ساڄي طرف روايتي يونٽ طرفان، قدر سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ 25 روايتي يونٽن کان وڌي ٿو. گراف تي اهو ڏسڻ ۾ اچي ٿو ته قدرن ۾ ڪافي تيز اڀار سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ ڏنل نقطي کان.

ٻيو مثال. نڪتل قدر برابر آهي -0,1 مطلب ته جڏهن بي گھر ٿيو سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ في هڪ روايتي يونٽ، قدر سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ صرف 0,1 روايتي يونٽ جي گھٽتائي. ساڳي ئي وقت، فنڪشن جي گراف تي، اسان هڪ مشڪل سان قابل ذڪر هيٺئين سلپ جو مشاهدو ڪري سگهون ٿا. هڪ جبل سان تشبيه ٺاهيندي، ائين لڳندو آهي ڄڻ ته اسان تمام آهستي آهستي ڪنهن جبل کان نرم لهر هيٺ لهي رهيا آهيون، اڳئين مثال جي برعڪس، جتي اسان کي تمام گهڻيون چوٽيون چڙهڻيون هيون :)

اهڙيء طرح، فنڪشن کي مختلف ڪرڻ کان پوء سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ اختلافن سان سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ، اسان 1st آرڊر جزوي فرق جي مساوات کي بيان ڪريون ٿا. مساواتن کي طئي ڪرڻ کان پوءِ، اسان کي ٻن مساواتن جو هڪ نظام ملندو، جنهن کي حل ڪرڻ سان اسان ڳڻپ جي اهڙن قدرن کي منتخب ڪري سگهنداسين. سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ، جنهن لاءِ ڏنل نقطن تي لاڳاپيل نڪتن جا قدر تمام، تمام ٿوري مقدار ۾ تبديل ٿيندا آهن، ۽ تجزياتي حل جي صورت ۾ بلڪل به تبديل نه ٿيندا آهن. ٻين لفظن ۾، مليل ڪوفيفينٽس تي غلطي جو ڪم گهٽ ۾ گهٽ پهچي ويندو، ڇاڪاڻ ته انهن نقطن تي جزوي نڪتل جا قدر صفر جي برابر هوندا.

تنهن ڪري، تفريق جي ضابطن جي مطابق، 1st آرڊر جي جزوي نڪتل مساوات جي کوٽائي جي حوالي سان سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ فارم وٺي ويندي:

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

1st آرڊر جزوي نڪتل مساوات جي حوالي سان سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ فارم وٺي ويندي:

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

نتيجي طور، اسان مساواتن جو ھڪڙو نظام حاصل ڪيو آھي جنھن ۾ ھڪڙو سادي تجزياتي حل آھي:

شروع{مساوات*}
شروعات{ڪيسز}
na + bsumlimits_{i=1}^nx_i — sumlimits_{i=1}^ny_i = 0

sumlimits_{i=1}^nx_i(a +bsumlimits_{i=1}^nx_i — sumlimits_{i=1}^ny_i) = 0
پڇاڙي
آخر{مساوات*}

مساوات کي حل ڪرڻ کان اڳ، اچو ته اڳ لوڊ ڪريون، چيڪ ڪريو ته لوڊ ڪرڻ صحيح آهي، ۽ ڊيٽا کي فارميٽ ڪريو.

ڊيٽا کي لوڊ ڪرڻ ۽ فارميٽ ڪرڻ

اهو ياد رکڻ گهرجي ته حقيقت اها آهي ته تجزياتي حل لاء، ۽ بعد ۾ گريجوئيٽ ۽ اسٽوچسٽڪ گريجوئيٽ نزول لاء، اسان ڪوڊ کي ٻن مختلف قسمن ۾ استعمال ڪنداسين: لائبريري استعمال ڪندي نياپي ۽ ان کي استعمال ڪرڻ کان سواء، پوء اسان کي مناسب ڊيٽا فارميٽنگ جي ضرورت پوندي (ڏسو ڪوڊ).

ڊيٽا لوڊ ڪرڻ ۽ پروسيسنگ ڪوڊ

# импортируем все нужные нам библиотеки
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math
import pylab as pl
import random

# графики отобразим в Jupyter
%matplotlib inline

# укажем размер графиков
from pylab import rcParams
rcParams['figure.figsize'] = 12, 6

# отключим предупреждения Anaconda
import warnings
warnings.simplefilter('ignore')

# загрузим значения
table_zero = pd.read_csv('data_example.txt', header=0, sep='t')

# посмотрим информацию о таблице и на саму таблицу
print table_zero.info()
print '********************************************'
print table_zero
print '********************************************'

# подготовим данные без использования NumPy

x_us = []
[x_us.append(float(i)) for i in table_zero['x']]
print x_us
print type(x_us)
print '********************************************'

y_us = []
[y_us.append(float(i)) for i in table_zero['y']]
print y_us
print type(y_us)
print '********************************************'

# подготовим данные с использованием NumPy

x_np = table_zero[['x']].values
print x_np
print type(x_np)
print x_np.shape
print '********************************************'

y_np = table_zero[['y']].values
print y_np
print type(y_np)
print y_np.shape
print '********************************************'

زير نظر

ھاڻي، اسان کان پوء، پھريون، ڊيٽا کي لوڊ ڪيو، ٻيو، لوڊ ڪرڻ جي صحيحيت کي جانچيو ۽ آخرڪار ڊيٽا کي فارميٽ ڪيو، اسان پھريون ويزنائيزيشن کي انجام ڏينداسين. هن جو طريقو اڪثر استعمال ڪيو ويندو آهي جوڙو لائبريريون سمنڊ جو ڪنارو. اسان جي مثال ۾، محدود تعداد جي ڪري، لائبريري استعمال ڪرڻ ۾ ڪو به مقصد ناهي سمنڊ جو ڪنارو. اسان باقاعده لائبريري استعمال ڪنداسين matplotlib ۽ صرف scatterplot کي ڏسو.

Scatterplot ڪوڊ

print 'График №1 "Зависимость выручки от месяца года"'

plt.plot(x_us,y_us,'o',color='green',markersize=16)
plt.xlabel('$Months$', size=16)
plt.ylabel('$Sales$', size=16)
plt.show()

چارٽ نمبر 1 ”سال جي مهيني تي آمدني جو انحصار“

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

تجزياتي حل

اچو ته سڀ کان وڌيڪ عام اوزار استعمال ڪريون سٿان ۽ مساوات جي سسٽم کي حل ڪريو:

شروع{مساوات*}
شروعات{ڪيسز}
na + bsumlimits_{i=1}^nx_i — sumlimits_{i=1}^ny_i = 0

sumlimits_{i=1}^nx_i(a +bsumlimits_{i=1}^nx_i — sumlimits_{i=1}^ny_i) = 0
پڇاڙي
آخر{مساوات*}

Cramer جي اصول موجب اسان ڳولينداسين عام تعين ڪندڙ، گڏو گڏ determinants جي ذريعي سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ ۽ پاران سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ، جنهن کان پوءِ، مقرر ڪندڙ کي ورهائيندي سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ عام تعين ڪندڙ تائين - ڳولهيو ڪوفيشيٽ سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ، ساڳيءَ طرح اسان کوٽائي ڳوليون ٿا سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ.

تجزياتي حل ڪوڊ

# определим функцию для расчета коэффициентов a и b по правилу Крамера
def Kramer_method (x,y):
        # сумма значений (все месяца)
    sx = sum(x)
        # сумма истинных ответов (выручка за весь период)
    sy = sum(y)
        # сумма произведения значений на истинные ответы
    list_xy = []
    [list_xy.append(x[i]*y[i]) for i in range(len(x))]
    sxy = sum(list_xy)
        # сумма квадратов значений
    list_x_sq = []
    [list_x_sq.append(x[i]**2) for i in range(len(x))]
    sx_sq = sum(list_x_sq)
        # количество значений
    n = len(x)
        # общий определитель
    det = sx_sq*n - sx*sx
        # определитель по a
    det_a = sx_sq*sy - sx*sxy
        # искомый параметр a
    a = (det_a / det)
        # определитель по b
    det_b = sxy*n - sy*sx
        # искомый параметр b
    b = (det_b / det)
        # контрольные значения (прооверка)
    check1 = (n*b + a*sx - sy)
    check2 = (b*sx + a*sx_sq - sxy)
    return [round(a,4), round(b,4)]

# запустим функцию и запишем правильные ответы
ab_us = Kramer_method(x_us,y_us)
a_us = ab_us[0]
b_us = ab_us[1]
print ' 33[1m' + ' 33[4m' + "Оптимальные значения коэффициентов a и b:"  + ' 33[0m' 
print 'a =', a_us
print 'b =', b_us
print

# определим функцию для подсчета суммы квадратов ошибок
def errors_sq_Kramer_method(answers,x,y):
    list_errors_sq = []
    for i in range(len(x)):
        err = (answers[0] + answers[1]*x[i] - y[i])**2
        list_errors_sq.append(err)
    return sum(list_errors_sq)

# запустим функцию и запишем значение ошибки
error_sq = errors_sq_Kramer_method(ab_us,x_us,y_us)
print ' 33[1m' + ' 33[4m' + "Сумма квадратов отклонений" + ' 33[0m'
print error_sq
print

# замерим время расчета
# print ' 33[1m' + ' 33[4m' + "Время выполнения расчета суммы квадратов отклонений:" + ' 33[0m'
# % timeit error_sq = errors_sq_Kramer_method(ab,x_us,y_us)

هتي اسان کي ڇا مليو آهي:

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

تنهن ڪري، کوٽائي جا قدر مليا آهن، مربع انحرافن جو مجموعو قائم ڪيو ويو آهي. اچو ته مليل ڪوفيفينٽس جي مطابق پکڙيل هسٽوگرام تي سڌي لڪير ٺاھيون.

ريگريشن لائن ڪوڊ

# определим функцию для формирования массива рассчетных значений выручки
def sales_count(ab,x,y):
    line_answers = []
    [line_answers.append(ab[0]+ab[1]*x[i]) for i in range(len(x))]
    return line_answers

# построим графики
print 'Грфик№2 "Правильные и расчетные ответы"'
plt.plot(x_us,y_us,'o',color='green',markersize=16, label = '$True$ $answers$')
plt.plot(x_us, sales_count(ab_us,x_us,y_us), color='red',lw=4,
         label='$Function: a + bx,$ $where$ $a='+str(round(ab_us[0],2))+',$ $b='+str(round(ab_us[1],2))+'$')
plt.xlabel('$Months$', size=16)
plt.ylabel('$Sales$', size=16)
plt.legend(loc=1, prop={'size': 16})
plt.show()

چارٽ نمبر 2 ”صحيح ۽ حسابي جواب“

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

توهان هر مهيني لاء انحراف گراف کي ڏسي سگهو ٿا. اسان جي صورت ۾، اسان ان مان ڪا خاص عملي قيمت حاصل نه ڪنداسين، پر اسان پنهنجي تجسس کي پورو ڪنداسين ته ڪيئن سادي لڪير ريگريشن مساوات سال جي مهيني تي آمدني جي انحصار کي بيان ڪري ٿي.

انحراف چارٽ ڪوڊ

# определим функцию для формирования массива отклонений в процентах
def error_per_month(ab,x,y):
    sales_c = sales_count(ab,x,y)
    errors_percent = []
    for i in range(len(x)):
        errors_percent.append(100*(sales_c[i]-y[i])/y[i])
    return errors_percent

# построим график
print 'График№3 "Отклонения по-месячно, %"'
plt.gca().bar(x_us, error_per_month(ab_us,x_us,y_us), color='brown')
plt.xlabel('Months', size=16)
plt.ylabel('Calculation error, %', size=16)
plt.show()

چارٽ نمبر 3 "انحراف،٪"

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

مڪمل ناهي، پر اسان پنهنجو ڪم مڪمل ڪيو.

اچو ته هڪ فنڪشن لکون، جنهن سان ڪوفيفينٽ جو تعين ڪجي سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ لائبريري استعمال ڪري ٿو نياپي, وڌيڪ واضح طور تي، اسان ٻه فنڪشن لکنداسين: هڪ استعمال ڪندي pseudoinverse matrix (عملي طور تي سفارش نه ڪئي وئي آهي، ڇاڪاڻ ته اهو عمل پيچيده ۽ غير مستحڪم آهي)، ٻيو هڪ ميٽرڪس مساوات استعمال ڪندي.

تجزياتي حل ڪوڊ (NumPy)

# для начала добавим столбец с не изменяющимся значением в 1. 
# Данный столбец нужен для того, чтобы не обрабатывать отдельно коэффицент a
vector_1 = np.ones((x_np.shape[0],1))
x_np = table_zero[['x']].values # на всякий случай приведем в первичный формат вектор x_np
x_np = np.hstack((vector_1,x_np))

# проверим то, что все сделали правильно
print vector_1[0:3]
print x_np[0:3]
print '***************************************'
print

# напишем функцию, которая определяет значения коэффициентов a и b с использованием псевдообратной матрицы
def pseudoinverse_matrix(X, y):
    # задаем явный формат матрицы признаков
    X = np.matrix(X)
    # определяем транспонированную матрицу
    XT = X.T
    # определяем квадратную матрицу
    XTX = XT*X
    # определяем псевдообратную матрицу
    inv = np.linalg.pinv(XTX)
    # задаем явный формат матрицы ответов
    y = np.matrix(y)
    # находим вектор весов
    return (inv*XT)*y

# запустим функцию
ab_np = pseudoinverse_matrix(x_np, y_np)
print ab_np
print '***************************************'
print

# напишем функцию, которая использует для решения матричное уравнение
def matrix_equation(X,y):
    a = np.dot(X.T, X)
    b = np.dot(X.T, y)
    return np.linalg.solve(a, b)

# запустим функцию
ab_np = matrix_equation(x_np,y_np)
print ab_np

اچو ته ڳڻپيوڪر کي طئي ڪرڻ تي خرچ ڪيل وقت جو مقابلو ڪريو سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ3 پيش ڪيل طريقن جي مطابق.

حساب ڪتاب جي وقت جي حساب لاء ڪوڊ

print ' 33[1m' + ' 33[4m' + "Время выполнения расчета коэффициентов без использования библиотеки NumPy:" + ' 33[0m'
% timeit ab_us = Kramer_method(x_us,y_us)
print '***************************************'
print
print ' 33[1m' + ' 33[4m' + "Время выполнения расчета коэффициентов с использованием псевдообратной матрицы:" + ' 33[0m'
%timeit ab_np = pseudoinverse_matrix(x_np, y_np)
print '***************************************'
print
print ' 33[1m' + ' 33[4m' + "Время выполнения расчета коэффициентов с использованием матричного уравнения:" + ' 33[0m'
%timeit ab_np = matrix_equation(x_np, y_np)

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

ڊيٽا جي هڪ ننڍڙي مقدار سان، هڪ "خود-لکيل" فنڪشن اڳيان اچي ٿو، جيڪو Cramer جي طريقي سان استعمال ڪندي ڪوفيڪٽس ڳولي ٿو.

ھاڻي توھان اڳتي ھلي سگھوٿا ٻين طريقن سان ڳولھڻ لاءِ سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ.

گريجوئيٽ نزول

پهرين، اچو ته وضاحت ڪريون ته گريجوئيٽ ڇا آهي. سادي لفظ ۾، گريجوئيٽ ھڪڙو ڀاڱو آھي جيڪو ھڪڙي فنڪشن جي وڌ ۾ وڌ واڌ جي طرف اشارو ڪري ٿو. هڪ جبل تي چڙهڻ سان تشبيهه سان، جتي ڏاڪڻ وارا منهن آهن جتي جبل جي چوٽي تي تمام گهڻي چڙهڻ آهي. جبل جي مثال کي ترقي ڪندي، اسان کي ياد آهي ته حقيقت ۾ اسان کي تمام تيز ترين نزول جي ضرورت آهي ته جيئن جلدي ممڪن طور هيٺئين حصي تائين پهچي وڃي، اهو آهي، گهٽ ۾ گهٽ - اها جڳهه جتي ڪم نه وڌو يا گهٽجي. هن نقطي تي نڪتل صفر جي برابر هوندو. تنهن ڪري، اسان کي هڪ گريجوئيٽ نه، پر هڪ antigradient جي ضرورت آهي. اينٽي گريجوئيٽ ڳولڻ لاءِ توهان کي صرف گريجوئيٽ کي ضرب ڪرڻ جي ضرورت آهي -1 (مائنس هڪ).

اچو ته ان حقيقت تي ڌيان ڏيون ته هڪ فنڪشن ۾ ڪيترائي منٽ ٿي سگهن ٿا، ۽ هيٺ ڏنل تجويز ڪيل الگورتھم استعمال ڪندي انهن مان هڪ ۾ داخل ٿيڻ کان پوءِ، اسان ٻي گهٽ ۾ گهٽ ڳولي نه سگهنداسين، جيڪا شايد مليل هڪ کان گهٽ هجي. اچو ته آرام ڪريون، هي اسان کي خطرو ناهي! اسان جي حالت ۾ اسان ھڪڙي ھڪڙي گھٽ ۾ گھٽ ڪم ڪري رھيا آھيون، اسان جي فنڪشن کان وٺي سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ گراف تي هڪ باقاعده پارابولا آهي. ۽ جيئن ته اسان سڀني کي اسان جي اسڪول جي رياضي جي ڪورس کان چڱي طرح ڄاڻڻ گهرجي، هڪ پارابولا صرف هڪ گهٽ ۾ گهٽ آهي.

ان کان پوءِ اسان کي معلوم ٿيو ته اسان کي گريڊيئنٽ جي ضرورت ڇو آهي، ۽ اهو پڻ ته گريڊيئنٽ هڪ ڀاڱو آهي، يعني هڪ ویکٹر جنهن ۾ ڏنل ڪوآرڊينيٽس آهن، جيڪي صحيح طور تي ساڳيا ڪوئفيسيٽ آهن. سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ اسان تدريسي نزول کي لاڳو ڪري سگھون ٿا.

شروع ڪرڻ کان اڳ، مان نزول الگورتھم بابت صرف چند جملا پڙهڻ جي صلاح ڏيان ٿو:

  • اسان pseudo-random انداز ۾ coefficients جي همراهن جو تعين ڪندا آهيون سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ. اسان جي مثال ۾، اسان صفر جي ويجهو ڪوئفائٽي جو تعين ڪنداسين. اهو هڪ عام رواج آهي، پر هر صورت ۾ ان جي پنهنجي مشق ٿي سگهي ٿي.
  • همراهن کان سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ پوائنٽ تي 1st آرڊر جزوي نڪتل جي قيمت کي گھٽايو سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ. تنهن ڪري، جيڪڏهن نڪتل مثبت آهي، پوء فنڪشن وڌائي ٿو. تنهن ڪري، نڪتل جي قدر کي گھٽائڻ سان، اسان ترقي جي مخالف سمت ۾، يعني، نزول جي طرف منتقل ڪنداسين. جيڪڏهن نڪتل ناڪاري آهي، ته پوءِ هن نقطي تي ڪم گهٽجي وڃي ٿو ۽ نڪتل جي قدر کي گھٽائڻ سان اسان نزول جي طرف هلون ٿا.
  • اسان ڪوآرڊينيٽ سان ساڳيو آپريشن ڪندا آهيون سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ: پوائنٽ تي جزوي نڪتل جي قيمت کي گھٽايو سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ.
  • گهٽ ۾ گهٽ ٽپو نه ڏيڻ ۽ اونهي خلا ۾ اڏامڻ لاءِ، اهو ضروري آهي ته قدم جي سائيز کي نزول جي هدايت ۾ مقرر ڪيو وڃي. عام طور تي، توهان هڪ پورو مضمون لکي سگهو ٿا ته ڪيئن قدم کي صحيح طريقي سان سيٽ ڪيو وڃي ۽ ان کي ڪيئن تبديل ڪجي نزول جي عمل دوران ڪمپيوٽر جي خرچن کي گهٽائڻ لاءِ. پر ھاڻي اسان جي اڳيان ھڪڙو مختلف ڪم آھي، ۽ اسان "پوڪ" جي سائنسي طريقي کي استعمال ڪندي قدم جي ماپ کي قائم ڪنداسين، يا جيئن اھي عام اصطلاح ۾ چوندا آھن، تجرباتي طور تي.
  • هڪ دفعو اسان کي ڏنل همراهن مان آهن سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ derivatives جي قدرن کي گھٽايو، اسان کي نوان ڪوآرڊينيٽس ملن ٿا سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ. اسان اڳ ۾ ئي حساب ڪيل همراهن مان ايندڙ قدم (ذخيرو) وٺون ٿا. ۽ اهڙيءَ طرح اهو چڪر وري وري شروع ٿئي ٿو، جيستائين گهربل ڪنورجنسي حاصل نه ٿئي.

سڀ! هاڻي اسان ماريانا خندق جي اونهي گھاٽي جي ڳولا ۾ وڃڻ لاءِ تيار آهيون. اچو ته شروع ڪريون.

تدريسي نزول لاءِ ڪوڊ

# напишем функцию градиентного спуска без использования библиотеки NumPy. 
# Функция на вход принимает диапазоны значений x,y, длину шага (по умолчанию=0,1), допустимую погрешность(tolerance)
def gradient_descent_usual(x_us,y_us,l=0.1,tolerance=0.000000000001):
    # сумма значений (все месяца)
    sx = sum(x_us)
    # сумма истинных ответов (выручка за весь период)
    sy = sum(y_us)
    # сумма произведения значений на истинные ответы
    list_xy = []
    [list_xy.append(x_us[i]*y_us[i]) for i in range(len(x_us))]
    sxy = sum(list_xy)
    # сумма квадратов значений
    list_x_sq = []
    [list_x_sq.append(x_us[i]**2) for i in range(len(x_us))]
    sx_sq = sum(list_x_sq)
    # количество значений
    num = len(x_us)
    # начальные значения коэффициентов, определенные псевдослучайным образом
    a = float(random.uniform(-0.5, 0.5))
    b = float(random.uniform(-0.5, 0.5))
    # создаем массив с ошибками, для старта используем значения 1 и 0
    # после завершения спуска стартовые значения удалим
    errors = [1,0]
    # запускаем цикл спуска
    # цикл работает до тех пор, пока отклонение последней ошибки суммы квадратов от предыдущей, не будет меньше tolerance
    while abs(errors[-1]-errors[-2]) > tolerance:
        a_step = a - l*(num*a + b*sx - sy)/num
        b_step = b - l*(a*sx + b*sx_sq - sxy)/num
        a = a_step
        b = b_step
        ab = [a,b]
        errors.append(errors_sq_Kramer_method(ab,x_us,y_us))
    return (ab),(errors[2:])

# запишем массив значений 
list_parametres_gradient_descence = gradient_descent_usual(x_us,y_us,l=0.1,tolerance=0.000000000001)


print ' 33[1m' + ' 33[4m' + "Значения коэффициентов a и b:" + ' 33[0m'
print 'a =', round(list_parametres_gradient_descence[0][0],3)
print 'b =', round(list_parametres_gradient_descence[0][1],3)
print


print ' 33[1m' + ' 33[4m' + "Сумма квадратов отклонений:" + ' 33[0m'
print round(list_parametres_gradient_descence[1][-1],3)
print



print ' 33[1m' + ' 33[4m' + "Количество итераций в градиентном спуске:" + ' 33[0m'
print len(list_parametres_gradient_descence[1])
print

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

اسان ماريانا خندق جي بلڪل هيٺان ٽپو ڏنو ۽ اتي اسان کي سڀ ساڳيا کوٽائي قدر مليا سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ، جنهن جي توقع ڪئي پئي وڃي.

اچو ته هڪ ٻيو غوطه وٺون، صرف هن وقت، اسان جي گہرے سمنڊ جي گاڏي ٻين ٽيڪنالاجين سان ڀريل هوندي، يعني هڪ لائبريري. نياپي.

تدريسي نزول لاءِ ڪوڊ (NumPy)

# перед тем определить функцию для градиентного спуска с использованием библиотеки NumPy, 
# напишем функцию определения суммы квадратов отклонений также с использованием NumPy
def error_square_numpy(ab,x_np,y_np):
    y_pred = np.dot(x_np,ab)
    error = y_pred - y_np
    return sum((error)**2)

# напишем функцию градиентного спуска с использованием библиотеки NumPy. 
# Функция на вход принимает диапазоны значений x,y, длину шага (по умолчанию=0,1), допустимую погрешность(tolerance)
def gradient_descent_numpy(x_np,y_np,l=0.1,tolerance=0.000000000001):
    # сумма значений (все месяца)
    sx = float(sum(x_np[:,1]))
    # сумма истинных ответов (выручка за весь период)
    sy = float(sum(y_np))
    # сумма произведения значений на истинные ответы
    sxy = x_np*y_np
    sxy = float(sum(sxy[:,1]))
    # сумма квадратов значений
    sx_sq = float(sum(x_np[:,1]**2))
    # количество значений
    num = float(x_np.shape[0])
    # начальные значения коэффициентов, определенные псевдослучайным образом
    a = float(random.uniform(-0.5, 0.5))
    b = float(random.uniform(-0.5, 0.5))
    # создаем массив с ошибками, для старта используем значения 1 и 0
    # после завершения спуска стартовые значения удалим
    errors = [1,0]
    # запускаем цикл спуска
    # цикл работает до тех пор, пока отклонение последней ошибки суммы квадратов от предыдущей, не будет меньше tolerance
    while abs(errors[-1]-errors[-2]) > tolerance:
        a_step = a - l*(num*a + b*sx - sy)/num
        b_step = b - l*(a*sx + b*sx_sq - sxy)/num
        a = a_step
        b = b_step
        ab = np.array([[a],[b]])
        errors.append(error_square_numpy(ab,x_np,y_np))
    return (ab),(errors[2:])

# запишем массив значений 
list_parametres_gradient_descence = gradient_descent_numpy(x_np,y_np,l=0.1,tolerance=0.000000000001)

print ' 33[1m' + ' 33[4m' + "Значения коэффициентов a и b:" + ' 33[0m'
print 'a =', round(list_parametres_gradient_descence[0][0],3)
print 'b =', round(list_parametres_gradient_descence[0][1],3)
print


print ' 33[1m' + ' 33[4m' + "Сумма квадратов отклонений:" + ' 33[0m'
print round(list_parametres_gradient_descence[1][-1],3)
print

print ' 33[1m' + ' 33[4m' + "Количество итераций в градиентном спуске:" + ' 33[0m'
print len(list_parametres_gradient_descence[1])
print

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ
کوٽائي قدر سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ ناقابل تبديل.

اچو ته ڏسو ته تدريسي نزول دوران غلطي ڪيئن بدلجي وئي، يعني هر قدم سان چورس انحراف جو مجموعو ڪيئن بدلجي ويو.

اسڪوائر انحرافن جي رقم کي پلاٽ ڪرڻ لاءِ ڪوڊ

print 'График№4 "Сумма квадратов отклонений по-шагово"'
plt.plot(range(len(list_parametres_gradient_descence[1])), list_parametres_gradient_descence[1], color='red', lw=3)
plt.xlabel('Steps (Iteration)', size=16)
plt.ylabel('Sum of squared deviations', size=16)
plt.show()

گراف نمبر 4 ”جماعتي نزول دوران چورس انحرافن جو مجموعو“

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

گراف تي اسان ڏسون ٿا ته هر قدم سان غلطي گهٽجي ويندي آهي، ۽ هڪ خاص تعداد جي ورهاڱي کان پوء اسين تقريبا افقي لڪير جو مشاهدو ڪندا آهيون.

آخرڪار، اچو ته ڪوڊ جي عمل جي وقت ۾ فرق جو اندازو لڳايو:

گريجوئيٽ نزول جي حساب ڪتاب جي وقت جو تعين ڪرڻ لاءِ ڪوڊ

print ' 33[1m' + ' 33[4m' + "Время выполнения градиентного спуска без использования библиотеки NumPy:" + ' 33[0m'
%timeit list_parametres_gradient_descence = gradient_descent_usual(x_us,y_us,l=0.1,tolerance=0.000000000001)
print '***************************************'
print

print ' 33[1m' + ' 33[4m' + "Время выполнения градиентного спуска с использованием библиотеки NumPy:" + ' 33[0m'
%timeit list_parametres_gradient_descence = gradient_descent_numpy(x_np,y_np,l=0.1,tolerance=0.000000000001)

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

شايد اسان ڪجھ غلط ڪري رھيا آھيون، پر وري اھو ھڪڙو سادو ”گھر ۾ لکيل“ فنڪشن آھي جيڪو لائبريري استعمال نٿو ڪري نياپي لائبريري استعمال ڪندي فنڪشن جي حساب ڪتاب جي وقت کي ختم ڪري ٿو نياپي.

پر اسان اڃا بيٺا نه آهيون، پر هڪ ٻئي دلچسپ طريقي جي مطالعي ڏانهن وڌي رهيا آهيون ته جيئن سادي لينر ريگريشن مساوات کي حل ڪرڻ لاء. اسان سان ملو!

Stochastic gradient نزول

اسٽوچسٽڪ گرڊيئينٽ نزول جي آپريشن جي اصول کي تيزيءَ سان سمجھڻ لاءِ، اھو بھتر آھي ته ان جي فرق کي عام گرڊيئيٽ نزول کان طئي ڪيو وڃي. اسان، تدريسي نزول جي صورت ۾، نڪتلن جي مساواتن ۾ سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ سڀني خاصيتن جي قدرن جو مجموعو استعمال ڪيو ۽ نموني ۾ موجود سچا جواب (يعني، سڀني جو مجموعو سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ). stochastic gradient descent ۾، اسان نمونن ۾ موجود سڀني قدرن کي استعمال نه ڪنداسين، پر ان جي بدران، pseudo-randomly نالي واري نموني انڊيڪس کي چونڊيو ۽ ان جي قدرن کي استعمال ڪريون.

مثال طور، جيڪڏهن انڊيڪس کي طئي ڪيو وڃي ته نمبر 3 (ٽي)، پوء اسان قدر وٺون ٿا سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ، پوءِ اسان قدرن کي متبادل مساواتن ۾ تبديل ڪريون ٿا ۽ نوان همراهن جو تعين ڪريون ٿا. پوءِ، ڪوآرڊينيٽس کي طئي ڪرڻ کان پوءِ، اسين وري بي ترتيب نموني انڊيڪس جو تعين ڪريون ٿا، انڊيڪس سان ملندڙ قدرن کي جزوي فرقي مساواتن ۾ تبديل ڪريون ٿا، ۽ ڪوآرڊينيٽس کي نئين طريقي سان طئي ڪريون ٿا. سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ وغيره جيستائين ڪنورجنس سائي ٿي وڃي. پهرين نظر ۾، اهو لڳي سگهي ٿو ته اهو سڀ ڪجهه ڪم ڪري سگهي ٿو، پر اهو ٿئي ٿو. اهو سچ آهي ته اها ڳالهه نوٽ ڪرڻ جي قابل آهي ته غلطي هر قدم سان گهٽ ناهي، پر هڪ رجحان ضرور آهي.

روايتي هڪ کان وڌيڪ اسٽوچسٽڪ گريجوئيٽ نزول جا ڪهڙا فائدا آهن؟ جيڪڏهن اسان جي نموني جي سائيز تمام وڏي آهي ۽ هزارين قدرن ۾ ماپي ويندي آهي، ته پوء اهو عمل ڪرڻ تمام آسان آهي، چئو، انهن مان هڪ بي ترتيب هزار، بلڪه پوري نموني جي ڀيٽ ۾. اهو آهي جتي اسٽوچسٽڪ گريجوئيٽ نزول راند ۾ اچي ٿو. اسان جي صورت ۾، يقينا، اسان گهڻو فرق محسوس نه ڪنداسين.

اچو ته ڪوڊ ڏسو.

اسٽوچاسٽڪ گريڊينٽ ڊيسنٽ لاءِ ڪوڊ

# определим функцию стох.град.шага
def stoch_grad_step_usual(vector_init, x_us, ind, y_us, l):
#     выбираем значение икс, которое соответствует случайному значению параметра ind 
# (см.ф-цию stoch_grad_descent_usual)
    x = x_us[ind]
#     рассчитывыаем значение y (выручку), которая соответствует выбранному значению x
    y_pred = vector_init[0] + vector_init[1]*x_us[ind]
#     вычисляем ошибку расчетной выручки относительно представленной в выборке
    error = y_pred - y_us[ind]
#     определяем первую координату градиента ab
    grad_a = error
#     определяем вторую координату ab
    grad_b = x_us[ind]*error
#     вычисляем новый вектор коэффициентов
    vector_new = [vector_init[0]-l*grad_a, vector_init[1]-l*grad_b]
    return vector_new


# определим функцию стох.град.спуска
def stoch_grad_descent_usual(x_us, y_us, l=0.1, steps = 800):
#     для самого начала работы функции зададим начальные значения коэффициентов
    vector_init = [float(random.uniform(-0.5, 0.5)), float(random.uniform(-0.5, 0.5))]
    errors = []
#     запустим цикл спуска
# цикл расчитан на определенное количество шагов (steps)
    for i in range(steps):
        ind = random.choice(range(len(x_us)))
        new_vector = stoch_grad_step_usual(vector_init, x_us, ind, y_us, l)
        vector_init = new_vector
        errors.append(errors_sq_Kramer_method(vector_init,x_us,y_us))
    return (vector_init),(errors)


# запишем массив значений 
list_parametres_stoch_gradient_descence = stoch_grad_descent_usual(x_us, y_us, l=0.1, steps = 800)

print ' 33[1m' + ' 33[4m' + "Значения коэффициентов a и b:" + ' 33[0m'
print 'a =', round(list_parametres_stoch_gradient_descence[0][0],3)
print 'b =', round(list_parametres_stoch_gradient_descence[0][1],3)
print


print ' 33[1m' + ' 33[4m' + "Сумма квадратов отклонений:" + ' 33[0m'
print round(list_parametres_stoch_gradient_descence[1][-1],3)
print

print ' 33[1m' + ' 33[4m' + "Количество итераций в стохастическом градиентном спуске:" + ' 33[0m'
print len(list_parametres_stoch_gradient_descence[1])

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

اسان انگن اکرن کي غور سان ڏسون ٿا ۽ پاڻ کي پڪڙي سوال پڇون ٿا ته "اهو ڪيئن ٿي سگهي ٿو؟" اسان وٽ ٻيا قابل قدر قدر مليا سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ. ٿي سگهي ٿو ته اسٽوچسٽڪ گريجوئيٽ نزول کي مساوات لاءِ وڌيڪ بهتر معيار مليا آهن؟ بدقسمتي سان نه. اهو ڪافي آهي ته مربع ٿيل انحرافن جي مجموعن کي ڏسڻ ۽ ڏسو ته کوٽائي جي نئين قدرن سان، غلطي وڏي آهي. اسان کي نااميد ٿيڻ جي ڪا به جلدي ناهي. اچو ته غلطي جي تبديلي جو گراف ٺاهيو.

اسٽوچاسٽڪ گريڊيئينٽ ڊيسينٽ ۾ چورس انحراف جي مجموعن کي پلاٽ ڪرڻ لاءِ ڪوڊ

print 'График №5 "Сумма квадратов отклонений по-шагово"'
plt.plot(range(len(list_parametres_stoch_gradient_descence[1])), list_parametres_stoch_gradient_descence[1], color='red', lw=2)
plt.xlabel('Steps (Iteration)', size=16)
plt.ylabel('Sum of squared deviations', size=16)
plt.show()

گراف نمبر.

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

شيڊول کي ڏسي، سڀڪنھن شيء کي جاء ۾ اچي ٿو ۽ هاڻي اسان سڀڪنھن شيء کي ٺيڪ ڪندو.

پوءِ ڇا ٿيو؟ هيٺيون ٿيو. جڏهن اسان بي ترتيب طور هڪ مهينو چونڊيندا آهيون، پوءِ اهو چونڊيل مهيني لاءِ هوندو آهي ته اسان جو الگورٿم آمدني جي ڳڻپ ۾ غلطي کي گهٽائڻ جي ڪوشش ڪندو آهي. ان کان پوء اسان هڪ ٻيو مهينو چونڊيو ۽ حساب ڪتاب کي ورجائي، پر اسان ٻئي چونڊيل مهيني لاء غلطي کي گهٽايو. ھاڻي ياد رکو ته پھريون ٻه مھينا خاص طور تي سادي لڪير ريگريشن مساوات جي لائن کان الڳ ٿي ويا آھن. هن جو مطلب اهو آهي ته جڏهن انهن ٻن مهينن مان ڪنهن کي چونڊيو وڃي ٿو، انهن مان هر هڪ جي غلطي کي گهٽائڻ سان، اسان جي الگورتھم پوري نموني جي غلطي کي سنجيده وڌائي ٿو. پوءِ ڇا ڪجي؟ جواب سادو آهي: توهان کي نزول جي قدم کي گهٽائڻ جي ضرورت آهي. آخرڪار، نزول جي قدم کي گهٽائڻ سان، غلطي پڻ بند ٿي ويندي "جمپنگ" مٿي ۽ هيٺ. يا بلڪه، "جمپنگ" غلطي بند نه ٿيندي، پر اهو ايترو جلدي نه ڪندو :) اچو ته چيڪ ڪريو.

SGD هلائڻ لاءِ ڪوڊ ننڍڙن واڌارن سان

# запустим функцию, уменьшив шаг в 100 раз и увеличив количество шагов соответсвующе 
list_parametres_stoch_gradient_descence = stoch_grad_descent_usual(x_us, y_us, l=0.001, steps = 80000)

print ' 33[1m' + ' 33[4m' + "Значения коэффициентов a и b:" + ' 33[0m'
print 'a =', round(list_parametres_stoch_gradient_descence[0][0],3)
print 'b =', round(list_parametres_stoch_gradient_descence[0][1],3)
print


print ' 33[1m' + ' 33[4m' + "Сумма квадратов отклонений:" + ' 33[0m'
print round(list_parametres_stoch_gradient_descence[1][-1],3)
print



print ' 33[1m' + ' 33[4m' + "Количество итераций в стохастическом градиентном спуске:" + ' 33[0m'
print len(list_parametres_stoch_gradient_descence[1])

print 'График №6 "Сумма квадратов отклонений по-шагово"'
plt.plot(range(len(list_parametres_stoch_gradient_descence[1])), list_parametres_stoch_gradient_descence[1], color='red', lw=2)
plt.xlabel('Steps (Iteration)', size=16)
plt.ylabel('Sum of squared deviations', size=16)
plt.show()

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

گراف نمبر 6 "اسٽڪاسٽڪ گريڊيئينٽ ڊيسينٽ (80 هزار مرحلا) دوران چورس انحراف جو مجموعو"

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

کوٽائي بهتر ٿي چڪي آهي، پر اڃا تائين مثالي نه آهن. فرضي طور تي، هن طريقي سان درست ڪري سگهجي ٿو. اسان چونڊون ٿا، مثال طور، آخري 1000 ورهاڱي ۾ ڪوئفينٽس جا قدر جن سان گهٽ ۾ گهٽ غلطي ڪئي وئي هئي. سچ پچ، ان لاءِ اسان کي پاڻ ۾ ڳڻپيوڪر جي قدرن کي به لکڻو پوندو. اسان اهو نه ڪنداسين، بلڪه شيڊول تي ڌيان ڏينداسين. اهو هموار ڏسڻ ۾ اچي ٿو ۽ غلطي گهٽجڻ لڳي ٿي. حقيقت ۾ اهو سچ ناهي. اچو ته پهرين 1000 ورهاڱي کي ڏسو ۽ انهن کي آخري سان ڀيٽيو.

SGD چارٽ لاءِ ڪوڊ (پهريون 1000 مرحلا)

print 'График №7 "Сумма квадратов отклонений по-шагово. Первые 1000 итераций"'
plt.plot(range(len(list_parametres_stoch_gradient_descence[1][:1000])), 
         list_parametres_stoch_gradient_descence[1][:1000], color='red', lw=2)
plt.xlabel('Steps (Iteration)', size=16)
plt.ylabel('Sum of squared deviations', size=16)
plt.show()

print 'График №7 "Сумма квадратов отклонений по-шагово. Последние 1000 итераций"'
plt.plot(range(len(list_parametres_stoch_gradient_descence[1][-1000:])), 
         list_parametres_stoch_gradient_descence[1][-1000:], color='red', lw=2)
plt.xlabel('Steps (Iteration)', size=16)
plt.ylabel('Sum of squared deviations', size=16)
plt.show()

گراف نمبر 7 “Sum of squared deviations SGD (پهرين 1000 مرحلا)”

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

گراف نمبر 8 “Sum of squared deviations SGD (آخري 1000 مرحلا)”

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

نزول جي بلڪل شروعات ۾، اسان غلطي ۾ ڪافي يونيفارم ۽ تيز گهٽتائي جو مشاهدو ڪيو. آخري ورهاڱي ۾، اسان ڏسون ٿا ته غلطي 1,475 جي قيمت جي چوڌاري ۽ چوڌاري ٿي وڃي ٿي ۽ ڪجهه لمحن تي هن بهتر قيمت جي برابر آهي، پر پوء اهو اڃا تائين وڌي ٿو ... مان ورجائي ٿو، توهان لکي سگهو ٿا قدر جي قيمت کوٽائي سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ и سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ، ۽ پوءِ انھن کي چونڊيو جن لاءِ غلطي گھٽ ۾ گھٽ آھي. بهرحال، اسان وٽ هڪ وڌيڪ سنگين مسئلو هو: اسان کي 80 هزار قدم کڻڻا پوندا (ڏسو ڪوڊ) قدرن جي ويجهو حاصل ڪرڻ لاءِ. ۽ اهو اڳ ۾ ئي ڳڻپيوڪر وقت بچائڻ جي خيال سان تضاد رکي ٿو اسٽوچسٽڪ گريجوئيٽ نزول سان لاڳاپيل گرڊيئينٽ نزول سان. ڇا ٿي سگهي ٿو درست ۽ بهتر؟ اهو نوٽ ڪرڻ ڏکيو ناهي ته پهرين ورهاڱي ۾ اسان اعتماد سان هيٺ وڃي رهيا آهيون ۽ ان ڪري، اسان کي پهرين ورهاڱي ۾ هڪ وڏو قدم ڇڏڻ گهرجي ۽ قدم کي گهٽائڻ گهرجي جيئن اسين اڳتي وڌون ٿا. اسان هن مضمون ۾ نه ڪنداسين - اهو اڳ ۾ ئي ڊگهو آهي. جيڪي چاهين ٿا پاڻ لاءِ سوچي سگهن ٿا ته اهو ڪيئن ڪجي، اهو ڏکيو ناهي :)

ھاڻي اچو ته لائبريري کي استعمال ڪندي اسٽوچسٽڪ گريڊيئنٽ ڊيسنٽ انجام ڏيون نياپي (۽ اچو ته انهن پٿرن تي نه هڻون جن جي اسان اڳ ۾ سڃاڻپ ڪئي هئي)

Stochastic Gradient Descent لاءِ ڪوڊ (NumPy)

# для начала напишем функцию градиентного шага
def stoch_grad_step_numpy(vector_init, X, ind, y, l):
    x = X[ind]
    y_pred = np.dot(x,vector_init)
    err = y_pred - y[ind]
    grad_a = err
    grad_b = x[1]*err
    return vector_init - l*np.array([grad_a, grad_b])

# определим функцию стохастического градиентного спуска
def stoch_grad_descent_numpy(X, y, l=0.1, steps = 800):
    vector_init = np.array([[np.random.randint(X.shape[0])], [np.random.randint(X.shape[0])]])
    errors = []
    for i in range(steps):
        ind = np.random.randint(X.shape[0])
        new_vector = stoch_grad_step_numpy(vector_init, X, ind, y, l)
        vector_init = new_vector
        errors.append(error_square_numpy(vector_init,X,y))
    return (vector_init), (errors)

# запишем массив значений 
list_parametres_stoch_gradient_descence = stoch_grad_descent_numpy(x_np, y_np, l=0.001, steps = 80000)

print ' 33[1m' + ' 33[4m' + "Значения коэффициентов a и b:" + ' 33[0m'
print 'a =', round(list_parametres_stoch_gradient_descence[0][0],3)
print 'b =', round(list_parametres_stoch_gradient_descence[0][1],3)
print


print ' 33[1m' + ' 33[4m' + "Сумма квадратов отклонений:" + ' 33[0m'
print round(list_parametres_stoch_gradient_descence[1][-1],3)
print



print ' 33[1m' + ' 33[4m' + "Количество итераций в стохастическом градиентном спуске:" + ' 33[0m'
print len(list_parametres_stoch_gradient_descence[1])
print

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

قيمتون لڳ ڀڳ هڪجهڙا ٿي ويا جڏهن استعمال ڪرڻ کان سواءِ هيٺ لٿو نياپي. بهرحال، هي منطقي آهي.

اچو ته اهو معلوم ڪريون ته اسٽوچسٽڪ گريجوئيٽ نزول اسان کي ڪيترو وقت ورتو.

SGD حساب وقت مقرر ڪرڻ لاء ڪوڊ (80 هزار قدم)

print ' 33[1m' + ' 33[4m' +
"Время выполнения стохастического градиентного спуска без использования библиотеки NumPy:"
+ ' 33[0m'
%timeit list_parametres_stoch_gradient_descence = stoch_grad_descent_usual(x_us, y_us, l=0.001, steps = 80000)
print '***************************************'
print

print ' 33[1m' + ' 33[4m' +
"Время выполнения стохастического градиентного спуска с использованием библиотеки NumPy:"
+ ' 33[0m'
%timeit list_parametres_stoch_gradient_descence = stoch_grad_descent_numpy(x_np, y_np, l=0.001, steps = 80000)

سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ

ٻيلي ۾ اڳتي، اونداهي ڪڪر: ٻيهر، "خود لکيل" فارمولا ڏيکاري ٿو بهترين نتيجو. اهو سڀ ڪجهه ٻڌائي ٿو ته لائبريري کي استعمال ڪرڻ لاءِ اڃا به وڌيڪ ذهين طريقا هجڻ گهرجن نياپي، جيڪو واقعي حساب جي عملن کي تيز ڪري ٿو. هن مقالي ۾ اسان انهن جي باري ۾ نه سکندا سين. توهان جي فارغ وقت ۾ سوچڻ لاء ڪجهه هوندو :)

سمنجو

اختصار ڪرڻ کان اڳ، مان هڪ سوال جو جواب ڏيڻ چاهيان ٿو جيڪو گهڻو ڪري اسان جي پياري پڙهندڙن کان پيدا ٿيو آهي. ڇو، حقيقت ۾، نزول سان اهڙي "تشدد" ڇو، ڇو ته اسان کي جبل جي مٿان ۽ هيٺ (اڪثر ڪري هيٺ) هلڻ جي ضرورت آهي ته خزاني واري هيٺاهين زمين کي ڳولڻ لاء، جيڪڏهن اسان جي هٿن ۾ هڪ طاقتور ۽ سادي ڊوائيس آهي، هڪ تجزياتي حل جو روپ، جيڪو اسان کي فوري طور تي صحيح جاء تي ٽيليفون ڪري ٿو؟

هن سوال جو جواب مٿاڇري تي ڪوڙ. هاڻي اسان هڪ تمام سادو مثال ڏٺو آهي، جنهن ۾ صحيح جواب آهي سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ ھڪڙي نشاني تي منحصر آھي سادي لڪير ريگريشن جي مساوات کي حل ڪرڻ. توھان ھي اڪثر زندگيءَ ۾ نه ڏسندا آھيو، تنھنڪري اچو ته تصور ڪريون ته اسان وٽ 2، 30، 50 يا وڌيڪ نشانيون آھن. اچو ته ان ۾ شامل ڪيون ھزارين، يا ھزارين ھزارين قدرن لاءِ ھر صفت لاءِ. انهي حالت ۾، تجزياتي حل شايد امتحان کي برداشت نه ڪري سگهي ۽ ناڪام ٿي سگهي ٿي. بدلي ۾، تدريسي نزول ۽ ان جي تبديليون آهستي آهستي پر يقيني طور تي اسان کي مقصد جي ويجھو آڻينديون - ڪم جي گھٽ ۾ گھٽ. ۽ رفتار جي باري ۾ پريشان نه ڪريو - اسان شايد طريقن تي نظر ڪنداسين جيڪي اسان کي قدم جي ڊيگهه کي سيٽ ڪرڻ ۽ ضابطو ڪرڻ جي اجازت ڏين ٿا (اهو آهي، رفتار).

۽ هاڻي اصل مختصر خلاصو.

پهرين، مون کي اميد آهي ته مضمون ۾ پيش ڪيل مواد "ڊيٽا سائنسدان" جي شروعات کي سمجهڻ ۾ مدد ڪندو ته ڪيئن سادي (۽ نه رڳو) لڪير ريگريشن مساواتن کي حل ڪرڻ ۾.

ٻيو، اسان مساوات کي حل ڪرڻ لاء ڪيترن ئي طريقن تي غور ڪيو. هاڻي، صورتحال تي منحصر ڪري، اسان اهو چونڊي سگهون ٿا جيڪو مسئلو حل ڪرڻ لاء بهترين موزون آهي.

ٽيون، اسان ڏٺو ته اضافي سيٽنگن جي طاقت، يعني گريجوئيٽ نزول قدم جي ڊيگهه. هن پيراگراف کي نظرانداز نه ٿو ڪري سگهجي. جيئن مٿي ڄاڻايل آهي، حساب جي قيمت کي گهٽائڻ لاء، قدم جي ڊيگهه کي نزول دوران تبديل ڪيو وڃي.

چوٿون، اسان جي صورت ۾، "گهر-لکيل" افعال ڏيکاريا بهترين وقت جي حساب لاء نتيجا. اهو شايد لائبريري جي صلاحيتن جو سڀ کان وڌيڪ پروفيشنل استعمال نه ڪرڻ جو سبب آهي نياپي. پر اهو ٿي سگهي ٿو، هيٺ ڏنل نتيجو پاڻ کي مشورو ڏئي ٿو. هڪ پاسي تي، ڪڏهن ڪڏهن اهو سوال ڪرڻ جي قابل آهي قائم ڪيل رايا، ۽ ٻئي طرف، اهو هميشه هر شيء کي پيچيده ڪرڻ جي قابل ناهي - ان جي برعڪس، ڪڏهن ڪڏهن مسئلي کي حل ڪرڻ جو هڪ آسان طريقو وڌيڪ اثرائتو آهي. ۽ جيئن ته اسان جو مقصد هڪ سادي لڪير رجعت جي مساوات کي حل ڪرڻ لاء ٽن طريقن جو تجزيو ڪرڻ هو، "خود-لکيل" افعال جو استعمال اسان لاء ڪافي هو.

ادب (يا اهڙي شيءِ)

1. لڪير رجعت

http://statistica.ru/theory/osnovy-lineynoy-regressii/

2. گھٽ ۾ گھٽ چوڪن جو طريقو

mathprofi.ru/metod_naimenshih_kvadratov.html

3. نڪتل

www.mathprofi.ru/chastnye_proizvodnye_primery.html

4. گريجوئيٽ

mathprofi.ru/proizvodnaja_po_napravleniju_i_gradient.html

5. تدريسي نزول

habr.com/en/post/471458

habr.com/en/post/307312

artemarakcheev.com//2017-12-31/linear_regression

6. NumPy لائبريري

docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.linalg.solve.html

docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.pinv.html

pythonworld.ru/numpy/2.html

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

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