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
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”
Aħna se nassumu li l-valuri huwa x-xahar tas-sena, u — dħul dan ix-xahar. Fi kliem ieħor, id-dħul jiddependi mix-xahar tas-sena, u - 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:
fejn huwa x-xahar li fih ġie riċevut id-dħul, — dħul li jikkorrispondi għax-xahar, и huma l-koeffiċjenti ta' rigressjoni tal-linja stmata.
Innota li l-koeffiċjent spiss imsejħa l-inklinazzjoni jew gradjent tal-linja stmata; jirrappreżenta l-ammont li bih il meta tinbidel .
Ovvjament, il-kompitu tagħna fl-eżempju huwa li nagħżlu koeffiċjenti bħal dawn fl-ekwazzjoni и , 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):
fejn hija funzjoni ta' approssimazzjoni ta' tweġibiet veri (jiġifieri, id-dħul li kkalkulejna),
huma t-tweġibiet veri (dħul ipprovdut fil-kampjun),
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 lejn il-lemin minn unità konvenzjonali, valur jiżdied b'25 unità konvenzjonali. Fuq il-grafika tidher qisha żieda pjuttost qawwija fil-valuri minn punt partikolari.
Eżempju ieħor. Il-valur tad-derivattiv huwa ugwali -0,1 ifisser li meta spostati għal kull unità konvenzjonali waħda, valur 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 mill-odds и , 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 и , 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 se tieħu l-forma:
Ekwazzjoni derivattiva parzjali tal-ewwel ordni fir-rigward se tieħu l-forma:
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"
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 u minn , wara li, tiddividi d-determinant bi għad-determinant ġenerali - sib il-koeffiċjent , bl-istess mod insibu l-koeffiċjent .
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:
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”
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, %”
Mhux perfett, imma lestejna l-kompitu tagħna.
Ejja nikteb funzjoni li, biex jiddeterminaw il-koeffiċjenti и 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 и , 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)
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 и .
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 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 и 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 и . 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 naqqas il-valur tad-derivattiva parzjali tal-ewwel ordni fil-punt . 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 : naqqas il-valur tad-derivattiva parzjali fil-punt .
- 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 и naqqas il-valuri tad-derivattivi, niksbu koordinati ġodda и . 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
Għaddajna sal-qiegħ nett tat-Trenċa tal-Marjana u hemm sibna l-istess valuri tal-koeffiċjenti kollha и , 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
Valuri tal-koeffiċjenti и 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”
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)
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 ' и 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 и ). 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 и , 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 и 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])
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 и . 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"
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()
Grafika Nru 6 "Somma ta' devjazzjonijiet kwadri matul inżul tal-gradjent stokastiku (80 elf pass)"
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)"
Grafika Nru 8 "Somma ta' devjazzjonijiet kwadri SGD (l-aħħar 1000 pass)"
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 и , 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
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)
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 jiddependi fuq sinjal wieħed . 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
2. Metodu tal-inqas kwadri
3. Derivat
4. Gradjent
5. Inżul gradjent
6. Librerija NumPy