د ساده خطي ریګریشن مساوات حل کول

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

د مساوي حل کولو ټولې میتودونه دلته بحث شوي د لږترلږه مربع میتود پراساس دي. راځئ چې میتودونه په لاندې ډول وټاکو:

  • تحلیلي حل
  • تدریجي نزول
  • Stochastic تدریجي نزول

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

په مقاله کې ورکړل شوي ټول کوډونه په ژبه لیکل شوي اتل 2.7 کارول د Jupyter نوټ بوک. د سرچینې کوډ او فایل د نمونې ډیټا سره پوسټ شوی ګیتوب

مقاله ډیره موخه د دواړو پیل کونکو او هغو کسانو لپاره ده چې دمخه یې په تدریجي ډول د مصنوعي استخباراتو - ماشین زده کړې کې د یوې پراخې برخې مطالعې کې ماسټري پیل کړې.

د موادو د روښانه کولو لپاره، موږ یو ساده مثال کاروو.

د مثال شرایط

موږ پنځه ارزښتونه لرو چې انحصار مشخصوي Y от X (جدول نمبر ۱):

جدول نمبر 1 "د مثال شرایط"

د ساده خطي ریګریشن مساوات حل کول

موږ به دا فرض کړو چې ارزښتونه د ساده خطي ریګریشن مساوات حل کول د کال میاشت ده، او د ساده خطي ریګریشن مساوات حل کول - پدې میاشت کې عاید. په بل عبارت، عاید د کال په میاشت پورې اړه لري، او د ساده خطي ریګریشن مساوات حل کول - یوازینۍ نښه چې په عاید پورې اړه لري.

مثال دومره دی، دواړه د کال په میاشت کې د عاید د مشروط انحصار له نظره، او د ارزښتونو د شمیر له نظره - د دوی ډیر لږ شتون لري. په هرصورت، دا ډول ساده کول به دا ممکنه کړي، لکه څنګه چې دوی وايي، تشریح کول، تل په اسانۍ سره نه، هغه مواد چې پیل کونکي جذبوي. او همدارنګه د شمیرو سادگي به هغو کسانو ته اجازه ورکړي چې د پام وړ کار لګښت پرته د کاغذ پر مخ مثال حل کړي.

راځئ چې فرض کړو چې په مثال کې ورکړل شوی انحصار د فورمې د ساده (جوړ شوي) ریګریشن لاین د ریاضیاتي معادلې لخوا په ښه توګه اټکل کیدی شي:

د ساده خطي ریګریشن مساوات حل کول

چې د ساده خطي ریګریشن مساوات حل کول هغه میاشت ده چې عواید یې ترلاسه کړي، د ساده خطي ریګریشن مساوات حل کول - په میاشت کې ورته عاید، د ساده خطي ریګریشن مساوات حل کول и د ساده خطي ریګریشن مساوات حل کول د اټکل شوي کرښې د راجع کولو کوفیشینټونه دي.

په یاد ولرئ چې کوفیفینټ د ساده خطي ریګریشن مساوات حل کول ډیری وختونه د اټکل شوي کرښې سلپ یا تدریجي بلل کیږي؛ د هغه مقدار استازیتوب کوي چې له مخې یې د ساده خطي ریګریشن مساوات حل کول کله چې بدل شي د ساده خطي ریګریشن مساوات حل کول.

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

لږترلږه مربع طریقه

د لږ تر لږه مربع میتود له مخې، انحراف باید د مربع په واسطه محاسبه شي. دا تخنیک تاسو ته اجازه درکوي چې د متقابل انحرافاتو له مینځه وړلو څخه مخنیوی وکړئ که چیرې دوی مخالف نښې ولري. د مثال په توګه، که په یوه قضیه کې، انحراف دی +5 (جمع پنځه)، او په بل کې -5 (منفي پنځه)، نو د انحرافاتو مجموعه به یو بل فسخ کړي او مقدار به 0 (صفر) ته ورسیږي. دا ممکنه ده چې د انحراف مربع نه وي، مګر د ماډلوس ملکیت وکاروئ او بیا به ټول انحراف مثبت وي او راټول شي. موږ به په دې ټکي کې په تفصیل سره خبرې ونه کړو، مګر په ساده ډول دا په ګوته کوو چې د محاسبې د اسانتیا لپاره، د انحراف مربع کول دود دي.

دا هغه څه دي چې فورمول داسې ښکاري چې موږ به د مربع انحرافاتو لږ تر لږه اندازه وټاکو (غلطۍ):

د ساده خطي ریګریشن مساوات حل کول

چې د ساده خطي ریګریشن مساوات حل کول د ریښتیني ځوابونو نږدې کولو فعالیت دی (دا هغه عاید دی چې موږ یې حساب کړی)

د ساده خطي ریګریشن مساوات حل کول ریښتیني ځوابونه دي (په نمونه کې ورکړل شوي عاید)،

د ساده خطي ریګریشن مساوات حل کول د نمونې شاخص دی (د میاشتې شمیره چې انحراف ټاکل کیږي)

راځئ چې د فعالیت توپیر وکړو، د جزوی توپیر مساوات تعریف کړو، او د تحلیلي حل په لور حرکت کولو ته چمتو شو. مګر لومړی، راځئ چې د توپیر په اړه یو لنډ سفر وکړو او د مشتق جیومیټریک معنی په یاد ولرو.

توپیر

توپیر د فعالیت د مشتق موندلو عملیات دی.

مشتق د څه لپاره کارول کیږي؟ د فنکشن مشتق د فنکشن د بدلون کچه مشخصوي او موږ ته د هغې سمت بیانوي. که په یوه ټاکلې نقطه کې مشتق مثبت وي، نو فعالیت زیاتیږي؛ که نه، فعالیت کمیږي. او هرڅومره چې د مطلق مشتق ارزښت ډیر وي ، په هماغه اندازه د فعالیت ارزښتونو د بدلون کچه لوړه وي ، او همدارنګه د فنکشن ګراف لوړیږي.

د مثال په توګه، د کارټیزین همغږي سیسټم شرایطو لاندې، د مشتق ارزښت په نقطه M(0,0) سره مساوي دی. + 25 پدې معنی چې په یو ټاکلي وخت کې، کله چې ارزښت لیږدول کیږي د ساده خطي ریګریشن مساوات حل کول ښي خوا ته د دودیز واحد په واسطه، ارزښت د ساده خطي ریګریشن مساوات حل کول د 25 دودیزو واحدونو لخوا زیاتوالی. په ګراف کې دا په ارزښتونو کې د کافي لوړیدو په څیر ښکاري د ساده خطي ریګریشن مساوات حل کول له یوې ټاکلې نقطې څخه.

بل مثال. مشتق ارزښت مساوي دی -0,1 پدې معنی چې کله بې ځایه کیږي د ساده خطي ریګریشن مساوات حل کول په یو دودیز واحد کې، ارزښت د ساده خطي ریګریشن مساوات حل کول یوازې د 0,1 دودیز واحد لخوا کمیږي. په ورته وخت کې، د فعالیت په ګراف کې، موږ کولی شو یو لږ د پام وړ ښکته خواته وګورو. د غره سره مشابهت رسمول، دا داسې ده لکه څنګه چې موږ په ډیر ورو ورو د غره څخه یو نرم ټوټو ته ښکته کیږو، د تیر مثال برعکس، چیرې چې موږ باید ډیر لوړ څوکۍ پورته کړو :)

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

نو، د توپیر د قواعدو له مخې، د ضخامت په اړه د لومړي ترتیب جزوی مشتق مساوات د ساده خطي ریګریشن مساوات حل کول فورمه به واخلي:

د ساده خطي ریګریشن مساوات حل کول

په اړه د 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
پای
پای{مساوات*}

د کرمر د واکمنۍ له مخې موږ به عمومي ټاکونکي، او همدارنګه د ټاکونکي په واسطه پیدا کړو د ساده خطي ریګریشن مساوات حل کول د د ساده خطي ریګریشن مساوات حل کولله هغې وروسته، د ټاکونکي په واسطه ویشل د ساده خطي ریګریشن مساوات حل کول عمومي ټاکونکي ته - کوفیفینټ ومومئ د ساده خطي ریګریشن مساوات حل کولپه ورته ډول موږ کوفیفینټ پیدا کوو د ساده خطي ریګریشن مساوات حل کول.

د تحلیلي حل کوډ

# определим функцию для расчета коэффициентов 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 "انحرافات،٪"

د ساده خطي ریګریشن مساوات حل کول

کامل نه، مګر موږ خپله دنده بشپړه کړه.

راځئ چې یو فنکشن ولیکو چې د کوفیفینس معلومولو لپاره د ساده خطي ریګریشن مساوات حل کول и د ساده خطي ریګریشن مساوات حل کول کتابتون کاروي بې حسه، په ډیر دقیق ډول ، موږ به دوه افعال ولیکئ: یو د سیوډوینورس میټریکس کارول (په عمل کې وړاندیز نه کیږي ، ځکه چې پروسه له کمپیوټري پلوه پیچلې او بې ثباته ده) ، بل د میټریکس معادلې په کارولو سره.

د تحلیلي حل کوډ (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)

د ساده خطي ریګریشن مساوات حل کول

د لږ مقدار ډیټا سره، یو "ځان لیکل شوی" فنکشن مخکې راځي، کوم چې د کریمر میتود په کارولو سره کوفیفینټونه پیدا کوي.

اوس تاسو کولی شئ د کوفیفینس موندلو لپاره نورو لارو ته لاړ شئ د ساده خطي ریګریشن مساوات حل کول и د ساده خطي ریګریشن مساوات حل کول.

تدریجي نزول

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

راځئ چې دې حقیقت ته پام وکړو چې یو فنکشن کولی شي څو مینیما ولري، او د لاندې وړاندیز شوي الګوریتم په کارولو سره د دوی څخه یو ته راښکته شي، موږ به ونه توانیږو چې یو بل لږترلږه پیدا کړو، کوم چې ممکن د موندل شوي یو څخه ټیټ وي. راځئ چې آرام وکړو، دا زموږ لپاره ګواښ نه دی! زموږ په قضیه کې موږ زموږ له فعالیت راهیسې ، لږترلږه له یو واحد سره معامله کوو د ساده خطي ریګریشن مساوات حل کول په ګراف کې یو منظم پارابولا دی. او لکه څنګه چې موږ ټول باید زموږ د ښوونځي ریاضي کورس څخه ښه پوه شو، پارابولا یوازې یو لږ تر لږه لري.

وروسته له دې چې موږ پوه شو چې ولې موږ تدریجي ته اړتیا لرو، او همدارنګه دا چې تدریجي یوه برخه ده، دا یو ویکتور دی چې د ورکړل شوي همغږي سره، کوم چې دقیقا ورته کوفیفینټ دي. د ساده خطي ریګریشن مساوات حل کول и د ساده خطي ریګریشن مساوات حل کول موږ کولی شو تدریجي نزول پلي کړو.

د پیل کولو دمخه، زه د نزول الګوریتم په اړه یوازې یو څو جملې لوستلو وړاندیز کوم:

  • موږ په تصادفي ډول د کوفیفینټس همغږي ټاکو د ساده خطي ریګریشن مساوات حل کول и د ساده خطي ریګریشن مساوات حل کول. زموږ په مثال کې، موږ به صفر ته نږدې کوفیفینټونه تعریف کړو. دا یو عام عمل دی، مګر هره قضیه ممکن خپل عمل ولري.
  • د همغږۍ څخه د ساده خطي ریګریشن مساوات حل کول په نقطه کې د 1st ترتیب جزوی مشتق ارزښت کم کړئ د ساده خطي ریګریشن مساوات حل کول. نو، که مشتق مثبت وي، نو فعالیت زیاتیږي. له همدې امله، د مشتق ارزښت په کمولو سره، موږ به د ودې مخالف لوري ته حرکت وکړو، دا د نزول په لور. که مشتق منفي وي، نو په دې وخت کې فعالیت کمیږي او د مشتق ارزښت په کمولو سره موږ د نزول لوري ته حرکت کوو.
  • موږ د همغږۍ سره ورته عملیات ترسره کوو د ساده خطي ریګریشن مساوات حل کول: په نقطه کې د جزوي مشتق ارزښت کم کړئ د ساده خطي ریګریشن مساوات حل کول.
  • د دې لپاره چې لږترلږه ټوپ ونه کړئ او ژور فضا ته الوتنه وکړئ ، دا اړینه ده چې د نزول په لور د ګام اندازه تنظیم کړئ. په عموم کې ، تاسو کولی شئ د دې په اړه یوه بشپړه مقاله ولیکئ چې څنګه ګام په سمه توګه تنظیم کړئ او د نزول پروسې په جریان کې دا څنګه بدل کړئ ترڅو د کمپیوټري لګښتونو کمولو لپاره. مګر اوس موږ زموږ په وړاندې یو څه مختلف دنده لرو ، او موږ به د "پوک" ساینسي میتود په کارولو سره د ګام اندازه رامینځته کړو یا لکه څنګه چې دوی په عام ډول وايي ، په تجربه سره.
  • یوځل چې موږ د ورکړل شوي همغږي څخه یو د ساده خطي ریګریشن مساوات حل کول и د ساده خطي ریګریشن مساوات حل کول د مشتق ارزښتونه کم کړئ، موږ نوي همغږي ترلاسه کوو د ساده خطي ریګریشن مساوات حل کول и د ساده خطي ریګریشن مساوات حل کول. موږ بل ګام اخلو (فرض)، دمخه د محاسبې همغږۍ څخه. او په دې توګه دوره بیا بیا پیل کیږي، تر هغه چې اړین کنورژن ترلاسه نشي.

ټول! اوس موږ چمتو یو چې د ماریانا خندق د ژورې ژورې په لټه کې شو. راځه چي پیل یی کړو.

د تدریجي نزول لپاره کوډ

# напишем функцию градиентного спуска без использования библиотеки 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 تدریجي نزول

د دې لپاره چې د سټوچاسټیک تدریجي نزول د عملیاتو اصول ګړندي پوه شي ، دا غوره ده چې د عادي تدریجي نزول څخه د دې توپیر وټاکئ. موږ، د تدریجي نزول په صورت کې، د مشتقاتو په مساواتو کې د ساده خطي ریګریشن مساوات حل کول и د ساده خطي ریګریشن مساوات حل کول په نمونه کې د ټولو ځانګړتیاوو او ریښتیني ځوابونو د ارزښتونو مجموعه کارول کیږي (یعنې د ټولو مجموعو د ساده خطي ریګریشن مساوات حل کول и د ساده خطي ریګریشن مساوات حل کول). په stochastic gradient descent کې، موږ به په نمونه کې موجود ټول ارزښتونه ونه کاروو، مګر پرځای به، په تصادفي ډول د نمونې نومول شوي شاخص غوره کړو او د هغې ارزښتونه وکاروو.

د مثال په توګه، که شاخص د 3 (درې) شمیره وي، نو موږ ارزښتونه اخلو د ساده خطي ریګریشن مساوات حل کول и د ساده خطي ریګریشن مساوات حل کولبیا موږ ارزښتونه په مشتق مساواتو بدلوو او نوي همغږي ټاکو. بیا، د همغږۍ په ټاکلو سره، موږ بیا په تصادفي ډول د نمونې شاخص ټاکو، د شاخص سره ورته ارزښتونه په جزوي توپیري مساواتو کې ځای په ځای کوو، او همغږي په نوې طریقه ټاکو. د ساده خطي ریګریشن مساوات حل کول и د ساده خطي ریګریشن مساوات حل کول etc. تر هغه وخته پورې چې انډول شنه شي. په لومړي نظر کې، داسې نه ښکاري چې دا کار کولی شي، مګر دا کار کوي. دا سمه ده چې د یادولو وړ ده چې تېروتنه په هر ګام سره نه کمیږي، مګر یو تمایل ضرور دی.

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

راځئ چې کوډ وګورو.

د سټوکاسټیک تدریجي نزول لپاره کوډ

# определим функцию стох.град.шага
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()

ګراف نمبر 5 "د سټوچاسټیک تدریجي نزول په جریان کې د مربع انحرافاتو مجموعه"

د ساده خطي ریګریشن مساوات حل کول

مهالویش ته په کتلو سره ، هرڅه په خپل ځای کې راځي او اوس به موږ هرڅه سم کړو.

نو څه وشول؟ لاندې پیښه وشوه. کله چې موږ په تصادفي توګه یوه میاشت غوره کوو، نو دا د ټاکل شوې میاشتې لپاره دی چې زموږ الګوریتم هڅه کوي د عوایدو په محاسبه کې تېروتنه کمه کړي. بیا موږ بله میاشت غوره کوو او حساب بیا تکرار کوو، مګر موږ د دویمې ټاکل شوې میاشتې لپاره تېروتنه کموو. اوس راځئ چې په یاد ولرو چې لومړۍ دوه میاشتې د ساده خطي ریګریشن معادلې له کرښې څخه د پام وړ انحراف کوي. دا پدې مانا ده چې کله د دې دوو میاشتو څخه کومه یوه وټاکل شي، د دوی د هرې غلطۍ کمولو سره، زموږ الګوریتم په جدي توګه د ټولې نمونې لپاره تېروتنه زیاتوي. نو څه وکړي؟ ځواب ساده دی: تاسو اړتیا لرئ د نزول ګام کم کړئ. په هرصورت، د نزول مرحلې په کمولو سره، تېروتنه به د پورته او ښکته "کودولو" مخه ونیسي. یا بلکه، د "کود کولو" تېروتنه به نه ودریږي، مګر دا به دا دومره ژر ونه کړي :) راځئ چې وګورو.

د 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 "د مربع انحرافاتو SGD (لومړني 1000 مرحلې)"

د ساده خطي ریګریشن مساوات حل کول

ګراف نمبر 8 "د مربع انحرافاتو مجموعه SGD (وروستي 1000 مرحلې)"

د ساده خطي ریګریشن مساوات حل کول

د نزول په پیل کې ، موږ په غلطۍ کې کافي یونیفورم او ژور کمښت ګورو. په تیرو تکرارونو کې، موږ ګورو چې تېروتنه د 1,475 ارزښت شاوخوا شاوخوا ګرځي او په ځینو شیبو کې حتی د دې مطلوب ارزښت سره مساوي کیږي، مګر بیا هم دا پورته کیږي ... زه تکراروم، تاسو کولی شئ د ارزښت ارزښتونه ولیکئ. کثافات د ساده خطي ریګریشن مساوات حل کول и د ساده خطي ریګریشن مساوات حل کول، او بیا هغه غوره کړئ چې خطا یې لږه ده. په هرصورت، موږ یوه ډیره جدي ستونزه درلوده: موږ باید 80 زره ګامونه پورته کړو (کوډ وګورئ) تر څو غوره ته نږدې ارزښتونه ترلاسه کړو. او دا دمخه د تدریجي نزول په پرتله د سټوچیسټیک ګریډینټ نزول سره د محاسبې وخت خوندي کولو نظر سره مخالفت کوي. څه شی اصلاح او ښه کیدی شي؟ دا ستونزمنه نه ده چې یادونه وکړو چې په لومړیو تکرارونو کې موږ په ډاډه توګه ښکته ځو او له همدې امله موږ باید په لومړي تکرار کې لوی ګام پریږدو او ګام یې کم کړو لکه څنګه چې موږ مخ په وړاندې ځو. موږ به دا پدې مقاله کې ونه کړو - دا لا دمخه ډیر اوږد دی. هغه څوک چې غواړي د ځان لپاره فکر وکړي چې دا څنګه ترسره کړي، دا ستونزمنه نه ده :)

اوس راځئ چې د کتابتون په کارولو سره د سټوچیسټیک تدریجي نزول ترسره کړو بې حسه (او اجازه راکړئ په هغو تیږو ودریږو چې مخکې مو پیژندلي وو)

د Stochastic Gradient نزول لپاره کوډ (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/ru/post/471458

habr.com/ru/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

Add a comment