Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

L-artikolu jiddiskuti diversi modi biex tiddetermina l-ekwazzjoni matematika ta 'linja ta' rigressjoni sempliċi (par).

Il-metodi kollha biex tissolva l-ekwazzjoni diskussa hawn huma bbażati fuq il-metodu tal-inqas kwadri. Ejja nindikaw il-metodi kif ġej:

  • Soluzzjoni analitika
  • Inżul gradjent
  • Inżul gradjent stokastiku

Għal kull metodu ta 'soluzzjoni ta' l-ekwazzjoni ta 'linja dritta, l-artikolu jipprovdi diversi funzjonijiet, li huma prinċipalment maqsuma f'dawk li huma miktuba mingħajr ma tuża l-librerija numpy u dawk li jużaw għall-kalkoli numpy. Huwa maħsub li l-użu skillful numpy se tnaqqas l-ispejjeż tal-kompjuters.

Il-kodiċi kollu mogħti fl-artiklu huwa miktub fil-lingwa Python 2.7 bl-użu Notebook Jupyter. Il-kodiċi tas-sors u l-fajl bid-dejta tal-kampjun huma ppubblikati fuq Github

L-artiklu huwa aktar immirat kemm għal dawk li jibdew kif ukoll għal dawk li diġà bdew gradwalment jgħallmu l-istudju ta 'sezzjoni wiesgħa ħafna fl-intelliġenza artifiċjali - it-tagħlim tal-magni.

Biex nispjegaw il-materjal, nużaw eżempju sempliċi ħafna.

Kundizzjonijiet ta' eżempju

Għandna ħames valuri li jikkaratterizzaw id-dipendenza Y minn X (Tabella Nru 1):

Tabella Nru 1 “Kundizzjonijiet ta’ eżempju”

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Aħna se nassumu li l-valuri Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi huwa x-xahar tas-sena, u Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi — dħul dan ix-xahar. Fi kliem ieħor, id-dħul jiddependi mix-xahar tas-sena, u Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi - l-uniku sinjal li fuqu jiddependi d-dħul.

L-eżempju huwa hekk hekk, kemm mil-lat tad-dipendenza kondizzjonali tad-dħul fuq ix-xahar tas-sena, kif ukoll mil-lat tan-numru ta 'valuri - hemm ftit minnhom. Madankollu, simplifikazzjoni bħal din tagħmilha possibbli, kif jgħidu, li jiġi spjegat, mhux dejjem b'faċilità, il-materjal li l-jibdew jassimilaw. U wkoll is-sempliċità tan-numri se tippermetti lil dawk li jixtiequ jsolvu l-eżempju fuq il-karta mingħajr spejjeż tax-xogħol sinifikanti.

Ejja nassumu li d-dipendenza mogħtija fl-eżempju tista 'tiġi approssimata pjuttost tajjeb bl-ekwazzjoni matematika ta' linja ta 'rigressjoni sempliċi (par) tal-forma:

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

fejn Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi huwa x-xahar li fih ġie riċevut id-dħul, Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi — dħul li jikkorrispondi għax-xahar, Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi huma l-koeffiċjenti ta' rigressjoni tal-linja stmata.

Innota li l-koeffiċjent Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi spiss imsejħa l-inklinazzjoni jew gradjent tal-linja stmata; jirrappreżenta l-ammont li bih il Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi meta tinbidel Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi.

Ovvjament, il-kompitu tagħna fl-eżempju huwa li nagħżlu koeffiċjenti bħal dawn fl-ekwazzjoni Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi, li fiha d-devjazzjonijiet tal-valuri tad-dħul ikkalkulat tagħna skont ix-xahar mit-tweġibiet veri, i.e. valuri ppreżentati fil-kampjun se jkunu minimi.

Metodu tal-inqas kwadru

Skont il-metodu tal-inqas kwadri, id-devjazzjoni għandha tiġi kkalkulata billi tikkwadraha. Din it-teknika tippermettilek tevita l-kanċellazzjoni reċiproka tad-devjazzjonijiet jekk ikollhom sinjali opposti. Per eżempju, jekk f'każ wieħed, id-devjazzjoni hija +5 (flimkien ma’ ħamsa), u fl-oħra -5 (nieqes ħamsa), allura s-somma tad-devjazzjonijiet se tikkanċella lil xulxin u tammonta għal 0 (żero). Huwa possibbli li d-devjazzjoni ma tikkwadrax, iżda li tuża l-proprjetà tal-modulu u mbagħad id-devjazzjonijiet kollha jkunu pożittivi u jakkumulaw. Mhux se noqogħdu fuq dan il-punt fid-dettall, iżda sempliċement nindikaw li għall-konvenjenza tal-kalkoli, huwa soltu li d-devjazzjoni tiġi kwadrata.

Hekk tidher il-formula li biha se niddeterminaw l-inqas somma ta' devjazzjonijiet kwadri (iżbalji):

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

fejn Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi hija funzjoni ta' approssimazzjoni ta' tweġibiet veri (jiġifieri, id-dħul li kkalkulejna),

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi huma t-tweġibiet veri (dħul ipprovdut fil-kampjun),

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi huwa l-indiċi tal-kampjun (in-numru tax-xahar li fih tiġi ddeterminata d-devjazzjoni)

Ejja niddifferenzjaw il-funzjoni, niddefinixxu l-ekwazzjonijiet differenzjali parzjali, u nkunu lesti li ngħaddu għas-soluzzjoni analitika. Imma l-ewwel, ejja nieħdu eskursjoni qasira dwar x'inhi d-divrenzjar u niftakru t-tifsira ġeometrika tad-derivattiv.

Differenzjazzjoni

Id-divrenzjar hija l-operazzjoni li tinstab id-derivattiva ta 'funzjoni.

Għal xiex jintuża d-derivattiv? Id-derivattiva ta 'funzjoni tikkaratterizza r-rata ta' bidla tal-funzjoni u tgħidilna d-direzzjoni tagħha. Jekk id-derivattiv f'punt partikolari huwa pożittiv, allura l-funzjoni tiżdied; inkella, il-funzjoni tonqos. U iktar ma jkun kbir il-valur tad-derivattiva assoluta, iktar tkun għolja r-rata ta 'bidla tal-valuri tal-funzjoni, kif ukoll iktar ma tkun wieqfa l-inklinazzjoni tal-graff tal-funzjoni.

Pereżempju, taħt il-kundizzjonijiet ta’ sistema ta’ koordinati Kartesjani, il-valur tad-derivattiv fil-punt M(0,0) huwa ugwali għal 25 + tfisser li f'punt partikolari, meta l-valur jinbidel Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi lejn il-lemin minn unità konvenzjonali, valur Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi jiżdied b'25 unità konvenzjonali. Fuq il-grafika tidher qisha żieda pjuttost qawwija fil-valuri Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi minn punt partikolari.

Eżempju ieħor. Il-valur tad-derivattiv huwa ugwali -0,1 ifisser li meta spostati Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi għal kull unità konvenzjonali waħda, valur Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi jonqos b'0,1 unità konvenzjonali biss. Fl-istess ħin, fuq il-graff tal-funzjoni, nistgħu nosservaw inklinazzjoni 'l isfel bilkemm notevoli. Niġbdu analoġija ma 'muntanja, bħallikieku qed niżlu bil-mod ħafna inklinazzjoni ġentili minn muntanja, b'differenza mill-eżempju preċedenti, fejn kellna nitilgħu qċaċet wieqfa ħafna :)

Għalhekk, wara li tiddifferenzja l-funzjoni Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi mill-odds Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi, aħna niddefinixxu ekwazzjonijiet differenzjali parzjali tal-ewwel ordni. Wara li niddeterminaw l-ekwazzjonijiet, se nirċievu sistema ta 'żewġ ekwazzjonijiet, billi nsolvuhom inkunu nistgħu nagħżlu tali valuri tal-koeffiċjenti Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi, li għalihom il-valuri tad-derivattivi korrispondenti f'punti partikolari jinbidlu b'ammont żgħir ħafna, u fil-każ ta 'soluzzjoni analitika ma jinbidlu xejn. Fi kliem ieħor, il-funzjoni ta 'żball fil-koeffiċjenti misjuba se tilħaq minimu, peress li l-valuri tad-derivattivi parzjali f'dawn il-punti se jkunu ugwali għal żero.

Allura, skont ir-regoli tad-divrenzjar, l-ekwazzjoni derivattiva parzjali tal-ewwel ordni fir-rigward tal-koeffiċjent Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi se tieħu l-forma:

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Ekwazzjoni derivattiva parzjali tal-ewwel ordni fir-rigward Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi se tieħu l-forma:

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Bħala riżultat, irċevejna sistema ta 'ekwazzjonijiet li għandha soluzzjoni analitika pjuttost sempliċi:

tibda{ekwazzjoni*}
tibda{każijiet}
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
tmiem{każijiet}
tmiem{ekwazzjoni*}

Qabel issolvi l-ekwazzjoni, ejja preload, iċċekkja li t-tagħbija hija korretta, u format id-data.

Tagħbija u ifformattjar tad-data

Għandu jiġi nnutat li minħabba l-fatt li għas-soluzzjoni analitika, u sussegwentement għall-gradjent u l-inżul tal-gradjent stochastic, se nużaw il-kodiċi f'żewġ varjazzjonijiet: bl-użu tal-librerija numpy u mingħajr ma nużawha, allura jkollna bżonn ifformattjar tad-dejta xieraq (ara l-kodiċi).

Kodiċi tat-tagħbija u l-ipproċessar tad-dejta

# импортируем все нужные нам библиотеки
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 '********************************************'

Viżwalizzazzjoni

Issa, wara li nkunu, l-ewwelnett, għabbejna d-dejta, it-tieni nett, iċċekkja l-korrettezza tat-tagħbija u finalment ifformattjat id-dejta, aħna se nwettqu l-ewwel viżwalizzazzjoni. Il-metodu użat ħafna drabi għal dan huwa parplot libreriji Imwieled fil-baħar. Fl-eżempju tagħna, minħabba n-numri limitati, m'hemm l-ebda skop li tuża l-librerija Imwieled fil-baħar. Se nużaw il-librerija regolari matplotlib u ħares biss lejn l-isparrar.

Kodiċi 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()

Grafika Nru 1 "Dipendenza tad-dħul fuq ix-xahar tas-sena"

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Soluzzjoni analitika

Ejja nużaw l-aktar għodod komuni fil python u ssolvi s-sistema ta' ekwazzjonijiet:

tibda{ekwazzjoni*}
tibda{każijiet}
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
tmiem{każijiet}
tmiem{ekwazzjoni*}

Skont ir-regola ta’ Cramer insibu d-determinant ġenerali, kif ukoll determinanti minn Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi u minn Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi, wara li, tiddividi d-determinant bi Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi għad-determinant ġenerali - sib il-koeffiċjent Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi, bl-istess mod insibu l-koeffiċjent Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi.

Kodiċi tas-soluzzjoni analitika

# определим функцию для расчета коэффициентов 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)

Hawn dak li ksibna:

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Allura, instabu l-valuri tal-koeffiċjenti, is-somma tad-devjazzjonijiet kwadri ġiet stabbilita. Ejja niġbed linja dritta fuq l-istogramma tat-tifrix skont il-koeffiċjenti misjuba.

Kodiċi tal-linja ta' rigressjoni

# определим функцию для формирования массива рассчетных значений выручки
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()

Ċart Nru 2 “Tweġibiet korretti u kkalkulati”

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Tista' tħares lejn il-graff tad-devjazzjoni għal kull xahar. Fil-każ tagħna, mhux se nġibu l-ebda valur prattiku sinifikanti minnu, iżda se nissodisfaw il-kurżità tagħna dwar kemm l-ekwazzjoni ta 'rigressjoni lineari sempliċi tikkaratterizza d-dipendenza tad-dħul fuq ix-xahar tas-sena.

Kodiċi taċ-ċart tad-devjazzjoni

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

Ċart Nru 3 “Devjazzjonijiet, %”

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Mhux perfett, imma lestejna l-kompitu tagħna.

Ejja nikteb funzjoni li, biex jiddeterminaw il-koeffiċjenti Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi juża l-librerija numpy, b'mod aktar preċiż, se niktbu żewġ funzjonijiet: waħda bl-użu ta 'matriċi psewdoinversa (mhux rakkomandat fil-prattika, peress li l-proċess huwa komputament kumpless u instabbli), l-oħra bl-użu ta' ekwazzjoni matriċi.

Kodiċi Analitiku tas-Soluzzjoni (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

Ejja nqabblu l-ħin mgħoddi biex niddeterminaw il-koeffiċjenti Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi, skond it-3 metodi ppreżentati.

Kodiċi għall-kalkolu tal-ħin tal-kalkolu

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)

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

B'ammont żgħir ta 'dejta, toħroġ 'il quddiem funzjoni "kitba waħedha", li ssib il-koeffiċjenti bl-użu tal-metodu ta' Cramer.

Issa tista 'tgħaddi għal modi oħra biex issib koeffiċjenti Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi.

Inżul gradjent

L-ewwel, ejja niddefinixxu x'inhu gradjent. Fi kliem sempliċi, il-gradjent huwa segment li jindika d-direzzjoni tat-tkabbir massimu ta 'funzjoni. B'analoġija mat-tixbit ta 'muntanji, fejn il-gradjent tiffaċċja huwa fejn hemm l-aktar tluq wieqaf sal-quċċata tal-muntanja. Niżviluppaw l-eżempju mal-muntanji, niftakru li fil-fatt għandna bżonn l-aktar inżul wieqaf sabiex nilħqu l-pjanura kemm jista 'jkun malajr, jiġifieri, il-minimu - il-post fejn il-funzjoni ma tiżdiedx jew tonqos. F'dan il-punt id-derivattiv ikun ugwali għal żero. Għalhekk, m'għandniex bżonn ta 'gradjent, iżda antigradijent. Biex issib l-antigradient għandek bżonn biss li timmultiplika l-gradjent bi -1 (nieqes wieħed).

Ejja nagħtu attenzjoni għall-fatt li funzjoni jista 'jkollha diversi minimi, u wara li niżlet f'wieħed minnhom bl-użu tal-algoritmu propost hawn taħt, ma nkunux nistgħu nsibu minimu ieħor, li jista' jkun inqas minn dak misjub. Ejja nirrilassaw, din mhix theddida għalina! Fil-każ tagħna qed nittrattaw ma 'minimu wieħed, peress li l-funzjoni tagħna Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi fuq il-graff hemm parabola regolari. U kif ilkoll għandna nafu tajjeb ħafna mill-kors tal-matematika tal-iskola tagħna, parabola għandha minimu wieħed biss.

Wara sibna għaliex kellna bżonn gradjent, u wkoll li l-gradjent huwa segment, jiġifieri vettur b'koordinati mogħtija, li huma preċiżament l-istess koeffiċjenti Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi nistgħu nimplimentaw inżul gradjent.

Qabel nibda, nissuġġerixxi li taqra biss ftit sentenzi dwar l-algoritmu tal-inżul:

  • Aħna niddeterminaw b'mod psewdo-każwali l-koordinati tal-koeffiċjenti Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi. Fl-eżempju tagħna, aħna se niddefinixxu koeffiċjenti qrib iż-żero. Din hija prattika komuni, iżda kull każ jista' jkollu l-prattika tiegħu.
  • Minn koordinat Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi naqqas il-valur tad-derivattiva parzjali tal-ewwel ordni fil-punt Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi. Allura, jekk id-derivattiv huwa pożittiv, allura l-funzjoni tiżdied. Għalhekk, billi nnaqqsu l-valur tad-derivattiv, se nimxu fid-direzzjoni opposta tat-tkabbir, jiġifieri fid-direzzjoni tad-dixxendenza. Jekk id-derivattiv huwa negattiv, allura l-funzjoni f'dan il-punt tonqos u billi nnaqqsu l-valur tad-derivattiv nimxu fid-direzzjoni ta 'l-inżul.
  • Aħna nwettqu operazzjoni simili mal-koordinat Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi: naqqas il-valur tad-derivattiva parzjali fil-punt Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi.
  • Sabiex ma taqbeżx il-minimu u jtiru fl-ispazju fil-fond, huwa meħtieġ li jiġi stabbilit id-daqs tal-pass fid-direzzjoni tal-inżul. B'mod ġenerali, tista 'tikteb artiklu sħiħ dwar kif issettja l-pass b'mod korrett u kif tibdel matul il-proċess ta' nżul sabiex tnaqqas l-ispejjeż tal-komputazzjoni. Imma issa għandna kompitu kemmxejn differenti quddiemna, u se nistabbilixxu d-daqs tal-pass bl-użu tal-metodu xjentifiku ta '"poke" jew, kif jgħidu fil-lingwaġġ komuni, b'mod empiriku.
  • Ladarba aħna mill-koordinati mogħtija Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi naqqas il-valuri tad-derivattivi, niksbu koordinati ġodda Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi. Nieħdu l-pass li jmiss (tnaqqis), diġà mill-koordinati kkalkulati. U għalhekk iċ-ċiklu jibda għal darb'oħra u għal darb'oħra, sakemm tinkiseb il-konverġenza meħtieġa.

Kollha! Issa lesti li mmorru nfittxu l-aktar gorge profonda tat-Trenċa tal-Marjana. Ejja nibdew.

Kodiċi għall-inżul gradjent

# напишем функцию градиентного спуска без использования библиотеки 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

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Għaddajna sal-qiegħ nett tat-Trenċa tal-Marjana u hemm sibna l-istess valuri tal-koeffiċjenti kollha Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi, li huwa eżattament dak li kien mistenni.

Ejja nieħdu adsa oħra, biss din id-darba, il-vettura tagħna tal-baħar fond se tkun mimlija b'teknoloġiji oħra, jiġifieri librerija numpy.

Kodiċi għall-inżul gradjent (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

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi
Valuri tal-koeffiċjenti Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi ma jinbidilx.

Ejja nħarsu lejn kif l-iżball inbidel waqt l-inżul tal-gradjent, jiġifieri, kif is-somma tad-devjazzjonijiet kwadrati nbidlet ma 'kull pass.

Kodiċi għat-tpinġija ta' somom ta' devjazzjonijiet kwadri

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()

Grafika Nru 4 “Somm ta’ devjazzjonijiet kwadrati waqt l-inżul tal-gradjent”

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Fuq il-graff naraw li ma’ kull pass l-iżball jonqos, u wara ċertu numru ta’ iterazzjonijiet nosservaw linja kważi orizzontali.

Fl-aħħarnett, ejja nistmaw id-differenza fil-ħin tal-eżekuzzjoni tal-kodiċi:

Kodiċi biex jiddetermina l-ħin tal-kalkolu tal-inżul tal-gradjent

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)

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Forsi qed nagħmlu xi ħaġa ħażina, iżda għal darb'oħra hija funzjoni sempliċi "miktuba fid-dar" li ma tużax il-librerija numpy jaqbeż il-ħin tal-kalkolu ta' funzjoni bl-użu tal-librerija numpy.

Imma m'aħniex wieqfa, iżda qed nimxu lejn l-istudju ta 'mod eċċitanti ieħor biex issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi. Iltaqa'!

Inżul gradjent stokastiku

Sabiex tifhem malajr il-prinċipju tat-tħaddim tad-dixxendenza tal-gradjent stochastic, huwa aħjar li tiddetermina d-differenzi tagħha mid-dixxendenza tal-gradjent ordinarja. Aħna, fil-każ ta 'inżul gradjent, fl-ekwazzjonijiet ta' derivattivi ta ' Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi uża s-somom tal-valuri tal-karatteristiċi kollha u t-tweġibiet veri disponibbli fil-kampjun (jiġifieri, is-somom tal-karatteristiċi kollha Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi). Fl-inżul tal-gradjent stokastiku, mhux se nużaw il-valuri kollha preżenti fil-kampjun, iżda minflok, agħżel b'mod psewdo-kambjali l-hekk imsejjaħ indiċi tal-kampjun u nużaw il-valuri tiegħu.

Pereżempju, jekk l-indiċi jiġi ddeterminat li jkun in-numru 3 (tlieta), allura nieħdu l-valuri Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi, imbagħad nissostitwixxu l-valuri fl-ekwazzjonijiet derivattivi u niddeterminaw koordinati ġodda. Imbagħad, wara li ddeterminajna l-koordinati, aħna għal darb'oħra niddeterminaw b'mod psewdo-każwali l-indiċi tal-kampjun, nissostitwixxu l-valuri li jikkorrispondu għall-indiċi fl-ekwazzjonijiet differenzjali parzjali, u niddeterminaw il-koordinati b'mod ġdid Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi eċċ. sakemm il-konverġenza ssir ħadra. L-ewwel daqqa t'għajn, jista' ma jidhirx li dan jista' jaħdem għal kollox, iżda hekk jasal. Huwa minnu li ta 'min jinnota li l-iżball ma jonqosx ma' kull pass, iżda ċertament hemm tendenza.

X'inhuma l-vantaġġi tad-dixxendenza tal-gradjent stochastic fuq waħda konvenzjonali? Jekk id-daqs tal-kampjun tagħna huwa kbir ħafna u mkejjel f'għexieren ta 'eluf ta' valuri, allura huwa ħafna aktar faċli li tipproċessa, ngħidu aħna, elf każwali minnhom, aktar milli l-kampjun kollu. Dan huwa fejn tidħol l-inżul tal-gradjent stochastic. Fil-każ tagħna, ovvjament, mhux se ninnutaw ħafna differenza.

Ejja nħarsu lejn il-kodiċi.

Kodiċi għall-inżul tal-gradjent stochastic

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

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Inħarsu bir-reqqa lejn il-koeffiċjenti u naqbdu lilna nfusna nistaqsu l-mistoqsija "Dan kif jista' jkun?" Aħna ltqajna valuri oħra tal-koeffiċjenti Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi. Forsi l-inżul tal-gradjent stokastiku sabet aktar parametri ottimali għall-ekwazzjoni? Sfortunatament le. Huwa biżżejjed li tħares lejn is-somma tad-devjazzjonijiet kwadri u tara li b'valuri ġodda tal-koeffiċjenti, l-iżball huwa akbar. Aħna m'għandniex għaġla biex niddisperaw. Ejja nibnu graff tal-bidla tal-iżball.

Kodiċi għat-tpinġija tas-somma tad-devjazzjonijiet kwadri fl-inżul tal-gradjent stokastiku

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()

Grafika Nru 5 "Somma ta' devjazzjonijiet kwadrati waqt l-inżul tal-gradjent stokastiku"

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Meta wieħed iħares lejn l-iskeda kollox jaqa’ f’postu u issa se nirranġaw kollox.

Allura x'ġara? Dan li ġej ġara. Meta nagħżlu b'mod każwali xahar, allura huwa għax-xahar magħżul li l-algoritmu tagħna jfittex li jnaqqas l-iżball fil-kalkolu tad-dħul. Imbagħad nagħżlu xahar ieħor u nirrepetu l-kalkolu, iżda nnaqqsu l-iżball għat-tieni xahar magħżul. Issa ftakar li l-ewwel xahrejn jiddevjaw b'mod sinifikanti mil-linja tal-ekwazzjoni ta' rigressjoni lineari sempliċi. Dan ifisser li meta jintgħażel xi waħda minn dawn ix-xahrejn, billi tnaqqas l-iżball ta 'kull wieħed minnhom, l-algoritmu tagħna jżid serjament l-iżball għall-kampjun kollu. Allura x'għandek tagħmel? It-tweġiba hija sempliċi: għandek bżonn tnaqqas il-pass tal-inżul. Wara kollox, billi tnaqqas il-pass tal-inżul, l-iżball se jieqaf ukoll "jaqbeż" 'l fuq u' l isfel. Jew aħjar, l-iżball "qbiż" mhux se jieqaf, iżda mhux se jagħmel hekk malajr :) Ejja niċċekkjaw.

Kodiċi biex imexxi SGD b'żidiet iżgħar

# запустим функцию, уменьшив шаг в 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()

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Grafika Nru 6 "Somma ta' devjazzjonijiet kwadri matul inżul tal-gradjent stokastiku (80 elf pass)"

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Il-koeffiċjenti tjiebu, iżda għadhom mhumiex ideali. Ipotetikament, dan jista 'jiġi kkoreġut b'dan il-mod. Aħna nagħżlu, pereżempju, fl-aħħar 1000 iterazzjoni l-valuri tal-koeffiċjenti li bihom sar l-iżball minimu. Veru, għal dan ikollna nikteb ukoll il-valuri tal-koeffiċjenti nfushom. Mhux se nagħmlu dan, iżda pjuttost nagħtu attenzjoni għall-iskeda. Jidher bla xkiel u l-iżball jidher li jonqos b'mod ugwali. Fil-fatt dan mhux minnu. Ejja nħarsu lejn l-ewwel 1000 iterazzjoni u nqabbluhom mal-aħħar.

Kodiċi għal chart SGD (l-ewwel 1000 pass)

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()

Grafika Nru 7 "Somm ta' devjazzjonijiet kwadri SGD (l-ewwel 1000 pass)"

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Grafika Nru 8 "Somma ta' devjazzjonijiet kwadri SGD (l-aħħar 1000 pass)"

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Fil-bidu nett tal-inżul, nosservaw tnaqqis pjuttost uniformi u wieqaf fl-iżball. Fl-aħħar iterazzjonijiet, naraw li l-iżball imur madwar u madwar il-valur ta '1,475 u f'xi mumenti saħansitra huwa ugwali għal dan il-valur ottimali, iżda mbagħad xorta jitla'... Nirrepeti, tista' tikteb il-valuri tal- koeffiċjenti Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi и Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi, u mbagħad agħżel dawk li għalihom l-iżball huwa minimu. Madankollu, kellna problema aktar serja: kellna nieħdu 80 elf pass (ara l-kodiċi) biex niksbu l-valuri qrib l-aħjar. U dan diġà jikkontradixxi l-idea li jiġi ffrankat il-ħin tal-komputazzjoni b'inżul tal-gradjent stokastiku relattiv għall-inżul tal-gradjent. X'jista' jiġi kkoreġut u mtejjeb? Mhux diffiċli nindunaw li fl-ewwel iterazzjonijiet qed niżlu b’fiduċja u, għalhekk, għandna nħallu pass kbir fl-ewwel iterazzjonijiet u nnaqqsu l-pass hekk kif nimxu ‘l quddiem. Mhux se nagħmlu dan f'dan l-artikolu - diġà huwa twil wisq. Dawk li jixtiequ jistgħu jaħsbu għal rashom kif jagħmlu dan, mhux diffiċli :)

Issa ejja nwettaq dixxendenza stochastic gradjent bl-użu tal-librerija numpy (u ejja ma noqogħdux fuq il-ġebel li identifikajna qabel)

Kodiċi għall-Inżul tal-Grajjent Stokastiku (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

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Il-valuri rriżultaw li kienu kważi l-istess bħal meta niżlu mingħajr ma jintużaw numpy. Madankollu, dan huwa loġiku.

Ejja nsiru nafu kemm damu l-inżul tal-gradjent stochastic.

Kodiċi għad-determinazzjoni tal-ħin tal-kalkolu SGD (80 elf pass)

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)

Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi

Iktar ma jkun hemm fil-foresta, iktar ikun skur is-sħab: għal darb'oħra, il-formula "miktuba minnha nfisha" turi l-aħjar riżultat. Dan kollu jissuġġerixxi li għandu jkun hemm modi saħansitra aktar sottili biex tuża l-librerija numpy, li verament iħaffu l-operazzjonijiet tal-komputazzjoni. F'dan l-artikolu mhux se nitgħallmu dwarhom. Ikun hemm xi ħaġa dwar xiex taħseb fil-ħin liberu tiegħek :)

Ejja nġibu fil-qosor

Qabel ma nagħmel fil-qosor, nixtieq inwieġeb mistoqsija li x'aktarx qamet mill-qarrej għażiż tagħna. Għaliex, fil-fatt, tali "tortura" b'inżul, għaliex għandna bżonn nimxu 'l fuq u 'l isfel mill-muntanji (l-aktar 'l isfel) sabiex insibu l-artijiet baxxi għażiża, jekk għandna f'idejna apparat tant qawwi u sempliċi, fil- forma ta 'soluzzjoni analitika, li istantanjament teleport us għal Post it-Tajjeb?

It-tweġiba għal din il-mistoqsija tinsab fuq il-wiċċ. Issa ħares lejn eżempju sempliċi ħafna, li fih it-tweġiba vera hi Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi jiddependi fuq sinjal wieħed Issolvi l-ekwazzjoni ta' rigressjoni lineari sempliċi. Ma tarax dan spiss fil-ħajja, allura ejja nimmaġinaw li għandna 2, 30, 50 jew aktar sinjal. Ejja nżidu ma 'dan eluf, jew saħansitra għexieren ta' eluf ta 'valuri għal kull attribut. F'dan il-każ, is-soluzzjoni analitika tista' ma tiflaħx għat-test u tfalli. Min-naħa tagħhom, l-inżul tal-gradjent u l-varjazzjonijiet tiegħu bil-mod iżda żgur iġibuna eqreb lejn l-għan - il-minimu tal-funzjoni. U tinkwetax dwar il-veloċità - probabbilment se nħarsu lejn modi li jippermettulna nissettjaw u nirregolaw it-tul tal-pass (jiġifieri, il-veloċità).

U issa s-sommarju fil-qosor attwali.

L-ewwelnett, nittama li l-materjal ippreżentat fl-artikolu jgħin li jibdew "xjentisti tad-dejta" biex jifhmu kif issolvi ekwazzjonijiet ta 'rigressjoni lineari sempliċi (u mhux biss).

It-tieni, ħares lejn diversi modi kif insolvu l-ekwazzjoni. Issa, skond is-sitwazzjoni, nistgħu nagħżlu dik li hija l-aktar adattata biex issolvi l-problema.

It-tielet, rajna l-qawwa ta 'settings addizzjonali, jiġifieri t-tul tal-pass tal-inżul gradjent. Dan il-parametru ma jistax jiġi traskurat. Kif innutat hawn fuq, sabiex titnaqqas l-ispiża tal-kalkoli, it-tul tal-pass għandu jinbidel waqt l-inżul.

Ir-raba ', fil-każ tagħna, il-funzjonijiet "bil-miktub fid-dar" urew l-aħjar riżultati ta' ħin għall-kalkoli. Dan huwa probabbilment minħabba li mhux l-aktar użu professjonali tal-kapaċitajiet tal-librerija numpy. Imma tkun hekk, il-konklużjoni li ġejja tissuġġerixxi ruħha. Min-naħa l-waħda, xi drabi ta 'min jiddubita l-opinjonijiet stabbiliti, u min-naħa l-oħra, mhux dejjem ta' min jikkumplika kollox - għall-kuntrarju, xi kultant mod aktar sempliċi ta 'soluzzjoni ta' problema huwa aktar effettiv. U peress li l-għan tagħna kien li nanalizzaw tliet approċċi biex issolvi ekwazzjoni ta 'rigressjoni lineari sempliċi, l-użu ta' funzjonijiet "miktuba minnha nfisha" kien biżżejjed għalina.

Letteratura (jew xi ħaġa bħal dik)

1. Rigressjoni lineari

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

2. Metodu tal-inqas kwadri

mathprofi.ru/metod_naimenshih_kvadratov.html

3. Derivat

www.mathprofi.ru/chastnye_proizvodnye_primery.html

4. Gradjent

mathprofi.ru/proizvodnaja_po_napravleniju_i_gradient.html

5. Inżul gradjent

habr.com/en/post/471458

habr.com/en/post/307312

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

6. Librerija 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

Sors: www.habr.com

Żid kumment