Xallinta isla'egta dib u noqoshada toosan ee fudud

Maqaalku wuxuu ka hadlayaa dhowr siyaabood oo lagu go'aamiyo isla'egta xisaabta ee xariiqda dib-u-celinta fudud (lammaanaha).

Dhammaan hababka lagu xalliyo isla'egta halkan lagaga hadlay waxay ku salaysan yihiin habka ugu yar ee labajibbaaran. Aynu u tilmaamno hababka sida soo socota:

  • Xalka falanqaynta
  • Hoos-u-dhac
  • Dheef-shiid kiimikaad

Hab kasta oo lagu xallinayo isla'egta toosan, maqaalku wuxuu bixiyaa hawlo kala duwan, kuwaas oo inta badan loo qaybiyo kuwa la qoro iyada oo aan la isticmaalin maktabadda. bararsan iyo kuwa xisaabinta u isticmaala bararsan. Waxaa la rumeysan yahay in si taxadar leh loo isticmaalo bararsan waxay dhimi doontaa kharashaadka xisaabinta.

Dhammaan koodka lagu sheegay maqaalku wuxuu ku qoran yahay luqadda Python 2.7 isticmaalka Jupyter notebook. Koodhka isha iyo faylka xogta muunad leh ayaa lagu dhejiyay dusha Github

Maqaalka ayaa si aad ah loogu talagalay labadaba bilawga iyo kuwa horeba si tartiib tartiib ah u bilaabay inay bartaan daraasadda qayb aad u ballaaran oo ku jirta sirdoonka macmal - barashada mashiinka.

Si aan u muujino walxaha, waxaan isticmaalnaa tusaale aad u fudud.

Xaaladaha tusaale

Waxaan leenahay shan qiime oo tilmaamaya ku-tiirsanaanta Y ka X (Shaxda No. 1):

Shaxda No. 1 "Tusaale Shuruudaha"

Xallinta isla'egta dib u noqoshada toosan ee fudud

Waxaan u qaadan doonaa in qiyamka Xallinta isla'egta dib u noqoshada toosan ee fudud waa bishii sanadka, iyo Xallinta isla'egta dib u noqoshada toosan ee fudud - dakhliga bishan. Si kale haddii loo dhigo, dakhligu wuxuu ku xiran yahay bisha sanadka, iyo Xallinta isla'egta dib u noqoshada toosan ee fudud - calaamadda kaliya ee dakhligu ku tiirsan yahay.

Tusaaluhu waa sidaas, labadaba marka laga eego aragtida ku-tiirsanaanta shuruudaha dakhliga ee bisha sanadka, iyo marka la eego tirada qiimaha - waxaa jira kuwo aad u yar. Si kastaba ha ahaatee, fududaynta noocan oo kale ah ayaa suurtogal ka dhigi doonta, sida ay yiraahdaan, si ay u sharxaan, had iyo jeer ma fududa, walxaha kuwa bilawga ah ay isku daraan. Iyo sidoo kale fududaynta tirooyinka ayaa u oggolaanaya kuwa raba inay ku xalliyaan tusaalaha xaashida iyada oo aan la helin kharashyo shaqo oo muhiim ah.

Aynu ka soo qaadno in ku tiirsanaanta tusaalaha lagu sheegay si fiican loogu qiyaasi karo isla'egta xisaabta ee xariiqda dib-u-celinta fudud (lammaanaha) ee foomka:

Xallinta isla'egta dib u noqoshada toosan ee fudud

halkaas oo Xallinta isla'egta dib u noqoshada toosan ee fudud waa bishii la helay dakhliga, Xallinta isla'egta dib u noqoshada toosan ee fudud - dakhliga u dhigma bisha, Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud waa isugeynta dib-u-celinta ee xariiqda la qiyaasay.

Ogsoonow in iskuxirnaanta Xallinta isla'egta dib u noqoshada toosan ee fudud inta badan loo yaqaan jiirada ama jaan-goynta xariiqda la qiyaasay; waxay ka dhigan tahay inta ay le'eg tahay Xallinta isla'egta dib u noqoshada toosan ee fudud marka ay is beddesho Xallinta isla'egta dib u noqoshada toosan ee fudud.

Sida iska cad, hawshayada tusaalaha ah waa in aan doorano isbarbardhigga isla'egta Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud, taas oo weecsanaanta qiyamka dakhliga la xisaabiyay bishii laga soo bilaabo jawaabaha runta ah, i.e. qiyamka lagu soo bandhigay muunada ayaa noqon doona mid aad u yar.

Habka labajibbaaran ee ugu yar

Marka loo eego habka ugu yar ee labajibbaaran, leexashada waa in lagu xisaabiyaa iyada oo la isku dhejiyo. Farsamadan waxay kuu ogolaaneysaa inaad iska ilaaliso baabi'inta wadajirka ah ee leexashada haddii ay leeyihiin calaamado iska soo horjeeda. Tusaale ahaan, haddii hal kiis, leexashadu waa +5 (oo lagu daray shan), iyo kuwa kale -5 (laga jaro shan), markaas wadarta leexashadu way is burinaysaa oo waxay noqonaysaa 0 (eber). Waxaa suurtogal ah in aan la laba jibaarin leexinta, laakiin in la isticmaalo hantida modules ka dibna dhammaan leexashadu waxay noqon doonaan kuwo wanaagsan oo urursan. Ma dagi doono qodobkan si faahfaahsan, laakiin si fudud u tilmaan in ku habboonaanta xisaabinta, ay caado u tahay in la labanlaabo leexashada.

Tani waa waxa ay qaacidadu u egtahay taas oo aan ku go'aamin doono wadarta ugu yar ee weecasho labajibaaran (khaladaadka):

Xallinta isla'egta dib u noqoshada toosan ee fudud

halkaas oo Xallinta isla'egta dib u noqoshada toosan ee fudud waa shaqo qiyaas jawaabaha dhabta ah (taasi waa dakhliga aanu xisaabinay),

Xallinta isla'egta dib u noqoshada toosan ee fudud waa jawaabaha dhabta ah (dakhliga lagu sheegay muunada),

Xallinta isla'egta dib u noqoshada toosan ee fudud waa tusaha muunada (lambarka bisha la go'aamiyay leexashada)

Aynu kala saarno shaqada, aynu qeexno isla'egyada kala duwanaanta qayb ahaan, oo aynu diyaar u nahay in aynu u gudubno xalka gorfaynta. Laakiin marka hore, aan qaadano dalxiis gaaban oo ku saabsan waxa ay tahay kala duwanaansho oo aan xasuusanno macnaha joomatari ee derivative.

Kala soocida

Kala duwanaanshuhu waa hawlgalka lagu helo asalka shaqada.

Waa maxay derivative-ka loo isticmaalo? Kala soocida shaqadu waxay tilmaantaa heerka isbeddelka shaqada oo waxay noo sheegaysaa jihadeeda. Haddii derivative-ka meesha la siiyay uu yahay mid togan, markaa shaqadu way kordhisaa, haddii kale, shaqadu way yaraysaa. Markasta oo uu weynaado qiimaha derisyada dhammaystiran, ayaa sarreeya heerka isbeddelka qiyamka shaqada, iyo sidoo kale kor u kaca garaafka shaqada.

Tusaale ahaan, marka la eego shuruudaha nidaamka isku xidhka Cartesian, qiimaha derivative ee barta M(0,0) waxay la mid tahay + 25 macneheedu waa in meel la siiyay, marka qiimaha la beddelo Xallinta isla'egta dib u noqoshada toosan ee fudud dhanka midig ee cutubka caadiga ah, qiimaha Xallinta isla'egta dib u noqoshada toosan ee fudud waxay kordhisaa 25 cutub oo caadi ah. Jaantuska waxay u egtahay kor u kac si cadaalad ah u kacay Xallinta isla'egta dib u noqoshada toosan ee fudud laga bilaabo qodob la siiyay.

Tusaale kale. Qiimaha kala soocida waa siman yahay -0,1 macneheedu waa marka la barakiciyo Xallinta isla'egta dib u noqoshada toosan ee fudud Halkii halbeeg caadiga ah, qiimaha Xallinta isla'egta dib u noqoshada toosan ee fudud hoos u dhaca kaliya 0,1 unug caadiga ah. Isla mar ahaantaana, garaafka shaqada, waxaan ku eegi karnaa jiirada hoose ee si dhib yar loo dareemi karo. Anaga oo la sawiran buur, waxa ay la mid tahay in aynu si tartiib tartiib ah uga soo degeyno buur, si ka duwan tusaalihii hore, halkaas oo ay ahayd in aan fuulno meelaha ugu sarreeya :)

Sidaa darteed, ka dib marka la kala saaro shaqada Xallinta isla'egta dib u noqoshada toosan ee fudud khayaali Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud, waxaanu qeexnay nidaamka 1aad ee isla'egyada kala duwanaanta. Ka dib markii la go'aamiyo isla'egyada, waxaan heli doonaa nidaam laba isla'egyo ah, annagoo xallinayna taas oo aan awood u yeelan doonno inaan dooranno qiyamka isbarbardhigga. Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud, kaas oo qiyamka soosaarayaasha u dhigma ee dhibcaha la siiyay ay ku beddelaan qadar aad iyo aad u yar, iyo marka la eego xallinta falanqaynta waxba iskama beddelayaan. Si kale haddii loo dhigo, shaqada khaladka ah ee isku-dhafka la helay ayaa gaari doona ugu yaraan, maaddaama qiyamka qaybaha qayb ka mid ah dhibcahan ay la mid yihiin eber.

Markaa, marka loo eego qawaaniinta kala-soocidda, isla'egta ka-soo-saarka qaybeed ee nidaamka 1aad marka loo eego isku-dhafka Xallinta isla'egta dib u noqoshada toosan ee fudud wuxuu qaadan doonaa foomka:

Xallinta isla'egta dib u noqoshada toosan ee fudud

Dalabka 1aad qayb ahaan isla'egta kala soocida marka la eego Xallinta isla'egta dib u noqoshada toosan ee fudud wuxuu qaadan doonaa foomka:

Xallinta isla'egta dib u noqoshada toosan ee fudud

Natiijo ahaan, waxaan helnay nidaam isla'eg oo leh xal falanqeyn oo fudud:

bilow {isla'eg*}
bilow{kiisas}
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
dhamaadka{kiisas}
dhamaadka{isla'egta*}

Kahor intaanan xallinin isla'egta, aan horay usii shubno, hubinno in rarku sax yahay, oo aan qaabeyno xogta.

Soo dejinta iyo habaynta xogta

Waa in la ogaadaa in sababta oo ah xaqiiqda ah in xalka falanqaynta, ka dibna loogu talagalay gradient iyo stochastic gradient, waxaan u isticmaali doonaa koodka laba nooc: isticmaalka maktabadda. bararsan oo annagoo aan isticmaalin, markaas waxaan u baahan doonaa qaabeynta xogta habboon (eeg code).

Soo dejinta xogta iyo code ka habaynta

# ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ всС Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
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 '********************************************'

Muujinta

Hadda, ka dib markii aan haysano, marka hore, ku shuban xogta, marka labaad, hubi sax ah loading iyo ugu dambeyntii qaabaynta xogta, waxaan fulin doonaa aragtida koowaad. Habka inta badan loo isticmaalo tan waa lammaane maktabadaha badda ku dhashay. Tusaalahayaga, tirada xaddidan awgeed, ma jirto wax faa'iido ah oo la isticmaalo maktabadda badda ku dhashay. Waxaan isticmaali doonaa maktabadda caadiga ah matplotlib oo bal eega meesha firidhsan.

Scatterplot code

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

Shaxda No. 1 "Ku tiirsanaanta dakhliga bisha sanadka"

Xallinta isla'egta dib u noqoshada toosan ee fudud

Xalka falanqaynta

Aynu isticmaalno aaladaha ugu caansan gudaha python oo xalliya nidaamka isla'egta:

bilow {isla'eg*}
bilow{kiisas}
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
dhamaadka{kiisas}
dhamaadka{isla'egta*}

Sida uu qabo xeerka Cramer waxaan heli doonaa go'aamiye guud, iyo sidoo kale go'aamiyeyaal by Xallinta isla'egta dib u noqoshada toosan ee fudud iyo Xallinta isla'egta dib u noqoshada toosan ee fudud, ka dib, kala qaybinta go'aamiye by Xallinta isla'egta dib u noqoshada toosan ee fudud ilaa go'aamiye guud - hel isku-dhafka Xallinta isla'egta dib u noqoshada toosan ee fudud, si la mid ah waxaan ka heli coefficient Xallinta isla'egta dib u noqoshada toosan ee fudud.

Koodhka xallinta falanqaynta

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для расчСта коэффициСнтов 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)

Waa tan waxa aan helnay:

Xallinta isla'egta dib u noqoshada toosan ee fudud

Markaa, qiyamka isbarbardhigga ayaa la helay, wadarta isugeynta labajibbaaran ayaa la aasaasay. Aynu ku sawirno xariiq toosan oo ku saabsan xisaabaha kala firdhiya si waafaqsan isku-dheelitirka la helay.

code line regression

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для формирования массива рассчСтных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠΈ
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()

Shaxda No. 2 "Jawaab sax ah oo la xisaabiyey"

Xallinta isla'egta dib u noqoshada toosan ee fudud

Waxaad eegi kartaa garaafka weecasho bil kasta. Xaaladeena, kama soo qaadan doono qiimo wax ku ool ah oo la taaban karo, laakiin waxaan ku qancin doonaa xiisahayaga ku saabsan sida wanaagsan ee isla'egta dib u celinta toosan ee fudud ay u tilmaameyso ku-tiirsanaanta dakhliga bisha sanadka.

Koodhka jaantuska leexinta

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для формирования массива ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°Ρ…
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()

Shaxda No. 3 "Dhaqdhaqaaqa, %"

Xallinta isla'egta dib u noqoshada toosan ee fudud

Ma qummanayn, laakiin waannu dhammaystirnay hawsheenna.

Aynu qorno hawl, si loo go'aamiyo isku-xirnaanta Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud adeegsada maktabadda bararsan, si sax ah, waxaan u qori doonaa laba hawlood: mid isticmaalaya matrix pseudoinverse ah (aan lagu talinin ficil ahaan, maadaama geeddi-socodku yahay mid adag oo aan degganeyn), kan kale iyadoo la adeegsanayo isla'egta matrix.

Koodhka Xalka Analytical (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

Aynu is barbar dhigno wakhtiga ku baxay go'aaminta isku-xirnaanta Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud, iyadoo la raacayo 3da hab ee la soo bandhigay.

Koodhka xisaabinta wakhtiga xisaabinta

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)

Xallinta isla'egta dib u noqoshada toosan ee fudud

Iyada oo tiro yar oo xog ah, shaqo "is-qor" ayaa horay u soo baxda, taas oo hesha isku-dhafka iyadoo la adeegsanayo habka Cramer.

Hadda waxaad u gudbi kartaa siyaabo kale oo aad ku heli karto isku-xireyaasha Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud.

Hoos-u-dhac

Marka hore, aan qeexno waxa uu yahay gradient. Si fudud loo dhigo, gradient-ku waa qayb tilmaamaysa jihada ugu badan ee kobaca shaqada. Marka la barbar dhigo fuulitaanka buur, halkaas oo wejiyada jilbaha ahi ay tahay meesha ugu dheer ee loo fuulo buurta dusheeda. Samaynta tusaalaha buurta, waxaan xasuusannahay in xaqiiqda aan u baahannahay hoos udhaca ugu hooseeya si aan u gaarno dhulka hoose sida ugu dhakhsaha badan, taas oo ah, ugu yaraan - meesha shaqadu aysan kor u qaadin ama hoos u dhicin. Halkaa marka ay marayso soosaarku waxa uu la mid noqonayaa eber. Sidaa darteed, uma baahnin gradient, laakiin waxaan u baahanahay antigradient. Si aad u heshid antigradient waxa kaliya oo aad u baahan tahay in aad ku dhufato gradient-ka -1 (hal laga jaro).

Aynu fiiro gaar ah u yeelano xaqiiqda ah in shaqadu ay yeelan karto dhowr minima, oo ku soo degtay mid ka mid ah iyaga oo isticmaalaya algorithm-ka hoose ee la soo jeediyay, ma awoodi doono inaan helno ugu yaraan kale, kaas oo laga yaabo inuu ka hooseeyo midka la helay. Aan is dejino, tani khatar naguma aha! Xaaladeena waxaan la macaamilaynaa hal ugu yar, tan iyo shaqadayada Xallinta isla'egta dib u noqoshada toosan ee fudud garaafku waa parabola joogto ah. Iyo sida aan dhammaanteen si fiican ugu ogaanno koorsada xisaabta dugsigeena, parabola waxay leedahay hal ugu yaraan.

Ka dib markii aan ogaanay sababta aan ugu baahanahay gradient, iyo sidoo kale in gradient-ku uu yahay qayb, taas oo ah, vector leh iskudubarid la siiyay, kuwaas oo si sax ah isku mid ah coefficients. Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud waxaan hirgelin karnaa soo degid tartiib tartiib ah.

Kahor intaanan bilaabin, waxaan soo jeedinayaa inaad akhrido jumlado kooban oo ku saabsan algorithm-ka farcanka:

  • Waxaan u go'aaminnaa si aan toos ahayn oo-random ah isku-duwayaasha isku-duwayaasha Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud. Tusaalahayaga, waxaanu ku qeexi doonaa isku-beegyada eber u dhow. Tani waa dhaqan caadi ah, laakiin kiis kastaa wuxuu yeelan karaa dhaqan u gaar ah.
  • Laga soo bilaabo iskudubarid Xallinta isla'egta dib u noqoshada toosan ee fudud ka jar qiimaha nidaamka 1aad ee qayb ka mid ah soojeedinta barta Xallinta isla'egta dib u noqoshada toosan ee fudud. Markaa, haddii derivative-ku uu togan yahay, markaa shaqadu way kordhisaa. Sidaa darteed, marka la gooyo qiimaha derivative, waxaan u dhaqaaqi doonaa jihada ka soo horjeeda ee koritaanka, taas oo ah, jihada loo jeedo. Haddii derivative-ku uu yahay mid taban, markaa shaqada meeshan ayaa hoos u dhacda oo ka jarta qiimaha derivative-ka waxaan u dhaqaaqnaa jihada farcanka.
  • Waxaan sameynaa hawlgal la mid ah iskudubbaridka Xallinta isla'egta dib u noqoshada toosan ee fudud: ka jar qiimaha qayb ka soo jeeda goobta Xallinta isla'egta dib u noqoshada toosan ee fudud.
  • Si aan ugu boodin ugu yar oo u duulin meel qoto dheer, waxaa lagama maarmaan ah in la dejiyo cabbirka cabbirka jihada loo soo jeedo. Guud ahaan, waxaad qori kartaa maqaal dhan oo ku saabsan sida saxda ah ee loo dejiyo tillaabada iyo sida loo beddelo inta lagu jiro habka soo degitaanka si loo yareeyo kharashyada xisaabinta. Laakiin hadda waxaa ina hor yaal hawl yar oo ka duwan, waxaanan dejin doonnaa cabbirka tallaabada anagoo adeegsanayna habka cilmiga ah ee β€œpoke” ama, sida ay yiraahdaan erey caadi ah, si macquul ah.
  • Mar haddii aan ka nimid isku-duwayaasha la siiyay Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud ka jar qiyamka soosaarayaasha, waxaan helnaa iskudubarid cusub Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud. Waxaan qaadeynaa tillaabada xigta (kala-goynta), horeyba waxaan uga soo qaadnay isku-duwayaasha la xisaabiyay. Oo sidaas awgeed wareeggu wuxuu bilaabmaa mar kale iyo mar kale, ilaa inta isku-dhafka loo baahan yahay la gaaro.

Dhammaan! Hadda waxaan diyaar u nahay inaan raadino dooxada ugu qoto dheer ee Mariana Trench. Aan bilowno.

Code for gradient down

# напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска Π±Π΅Π· использования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ 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

Xallinta isla'egta dib u noqoshada toosan ee fudud

Waxaan u quusinay gunta ugu hoosaysa ee Mariana Trench, waxaanan ka helnay dhammaan qiimayaal isku mid ah Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud, taas oo ah waxa la filayo.

Aan mar kale quusanno, kaliya markan, baabuurkeena qoto dheer waxaa ka buuxin doona tignoolajiyada kale, oo ah maktabad. bararsan.

Koodhka farcanka gradient (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

Xallinta isla'egta dib u noqoshada toosan ee fudud
Qiimaha wada shaqaynta Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud aan la beddeli karin.

Aynu eegno sida uu khaladku isu bedelay inta lagu jiro soo degitaanka gradient, taas oo ah, sida wadarta leexashada labajibbaaran ay isku beddeshay tallaabo kasta.

Xeerka samaynta wadarta weecsanaan labajibbaaran

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

Sawirka 4-aad "Isugeynta weecsanaan labajibbaaran inta lagu jiro soo degid tartiib tartiib ah"

Xallinta isla'egta dib u noqoshada toosan ee fudud

Jaantuska waxaan ku aragnaa in talaabo kasta qaladku hoos u dhaco, ka dib markii tiro cayiman oo ku celcelin ah waxaan ilaalinaa xariiq siman.

Ugu dambeyntii, aan qiyaasno farqiga u dhexeeya wakhtiga fulinta code:

Koodhka si loo go'aamiyo wakhtiga xisaabinta jilibka

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)

Xallinta isla'egta dib u noqoshada toosan ee fudud

Waxaa laga yaabaa inaan sameyneyno wax qalad ah, laakiin mar labaad waa hawl fudud "guri ku qoran" oo aan isticmaalin maktabadda bararsan waxay ka sarraysaa wakhtiga xisaabinta shaqada iyadoo la isticmaalayo maktabadda bararsan.

Laakiin ma joogno weli, laakiin waxaan u soconnaa inaan barano hab kale oo xiiso leh oo lagu xalliyo isla'egta toosan ee fudud. La kulan!

Dheef-shiid kiimikaad

Si aad si dhakhso ah u fahamto mabda'a hawlgalka ee stochastic gradient, waxaa fiican in la go'aamiyo faraqa u dhexeeya farcanka gradient caadiga ah. Anaga, marka laga hadlayo abtirsiinta gradient, marka la eego isla'egyada derivatives ee Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud loo adeegsaday wadarta qiyamka dhammaan sifooyinka iyo jawaabaha dhabta ah ee laga heli karo muunada (taasi waa wadarta dhammaan Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud). Marka la eego jaangooyooyinka stochastic, ma isticmaali doono dhammaan qiyamka ku jira muunada, laakiin taa beddelkeeda, si aan kala sooc lahayn u dooro tusmada muunadda oo isticmaal qiimaheeda.

Tusaale ahaan, haddii tusaha loo go'aamiyo inuu yahay lambarka 3 (saddex), markaa waxaan qaadaneynaa qiyamka Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud, ka dib waxaan ku beddeleynaa qiyamka isla'egyada asalka ah waxaanan go'aamineynaa isku-duwayaal cusub. Ka dib, annagoo go'aaminnay isku-duwayaasha, waxaanu mar kale si aan kala sooc lahayn u go'aaminaynaa tusmada muunadda, waxaanu ku beddelnay qiyamka u dhigma tusmada isla'egyada kala duwan ee qayb ahaan, waxaanan u go'aaminnaa isku-duwayaasha hab cusub. Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud iwm. ilaa isu-gudbigu noqdo cagaar. Jaleecada hore, waxaa laga yaabaa inaysan u muuqan in tani ay shaqeyn karto gabi ahaanba, laakiin way shaqeysaa. Waa run in ay habboon tahay in la ogaado in khaladku aanu yarayn tallaabo kasta, laakiin waxaa hubaal ah in uu jiro u janjeero.

Waa maxay faa'iidooyinka stochastic gradient ka soo degitaanka caadiga ah? Haddii cabbirka muunadayadu uu aad u weyn yahay oo lagu qiyaaso tobanaan kun oo qiyam ah, markaa aad bay u fududahay in la farsameeyo, waxaad tidhaahdaan, kun oo iyaga ka mid ah, halkii ay ka ahaan lahaayeen muunadda oo dhan. Halkani waa halka ay ka soo dhaadhacdo gradient stochastic. Xaaladeena, dabcan, ma dareemi doonno farqi badan.

Aan eegno koodka.

Koodhka loogu talagalay soo degista gradient ee 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])

Xallinta isla'egta dib u noqoshada toosan ee fudud

Waxaan si taxadar leh u eegnaa isku-dhafka waxaanan isqabnaa inaan weydiinno su'aasha "Sidee tani noqon kartaa?" Waxaan helnay qiimayaal kale oo isku-dhafan Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud. Laga yaabaa in farcanka stochastic gradient uu helay cabbirro aad u wanaagsan isla'egta? Nasiib darro maya. Waa ku filan in la eego wadarta leexashada labajibaaran oo la arko in qiyamka cusub ee isbahaysiga, qaladku ka weyn yahay. Innagu kuma degdegno quus. Aynu dhisno garaafka isbeddelka khaladka.

Xeerka qaabaynta wadarta weecasho labajibbaaran ee farcanka jaangooyooyinka

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

Sawirka No. 5 "Isugaynta leexashada labajibbaaran inta lagu jiro soo degitaanka gradient-ka"

Xallinta isla'egta dib u noqoshada toosan ee fudud

Marka la eego jadwalka, wax walbaa waxay ku dhacaan meel, hadda waxaan hagaajin doonaa wax walba.

Haddaba maxaa dhacay? Waxa dhacay sidan soo socota. Marka aan si aan kala sooc lahayn u doorano bil, markaa waa bisha la doortay in algorithm-kayaga uu raadinayo inuu yareeyo qaladka xisaabinta dakhliga. Kadibna waxaan dooranaa bil kale oo ku celineynaa xisaabinta, laakiin waxaan yareynaa qaladka bisha labaad ee la doortay. Hadda xusuusnow in labada bilood ee ugu horreeya ay si weyn uga leexdeen xariiqda isla'egta toosan ee fudud. Tani waxay ka dhigan tahay in marka mid ka mid ah labadan bilood la doorto, iyadoo la yareynayo qaladka mid kasta oo iyaga ka mid ah, algorithmisku wuxuu si dhab ah u kordhiyaa qaladka muunada oo dhan. Haddaba maxaa la sameeyaa? Jawaabtu waa sahlan tahay: waxaad u baahan tahay inaad hoos u dhigto tallaabada soo degitaanka. Ka dib oo dhan, adoo yareynaya tallaabada soo degista, qaladku wuxuu sidoo kale joojin doonaa "boodboodka" kor iyo hoos. Ama halkii, qaladka "boodboodka" ma joogsan doono, laakiin si dhakhso ah uma samayn doono :) Aynu hubinno.

Koodhka si uu u socodsiiyo SGD oo leh koror yar

# запустим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ² шаг Π² 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()

Xallinta isla'egta dib u noqoshada toosan ee fudud

Sawirka No. 6 "Isugaynta leexashada labajibbaaran ee inta lagu jiro soo degitaanka jaan-gooyooyinka (80 kun tallaabo)"

Xallinta isla'egta dib u noqoshada toosan ee fudud

Isku-dubbaridka ayaa soo fiicnaaday, laakiin weli maaha mid ku habboon. Mala-awaal ahaan, tan waxaa lagu sixi karaa sidan. Waxaan dooranaa, tusaale ahaan, 1000-kii ugu dambeeyay ee soo noqnoqda qiyamka isku-dhafka kaas oo qaladka ugu yar lagu sameeyay. Run, tan waxaan sidoo kale ku qasbanaan doonaa inaan qorno qiyamka isku-dhafka laftooda. Ma samayn doono tan, laakiin halkii fiiro gaar ah u yeelo jadwalka. Waxay u egtahay mid siman, khaladkuna wuxuu u muuqdaa inuu si siman u yaraado. Runtii tani run maaha. Aynu eegno 1000-ka taxan ee ugu horreeya oo aynu barbar dhigno kuwa u dambeeya.

Xeerka jaantuska SGD (1000 tallaabo ee ugu horreeya)

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

Jaantuska No. 7 "Isugaynta leexashada labajibbaaran ee SGD (1000 tallaabo ee ugu horreeya)"

Xallinta isla'egta dib u noqoshada toosan ee fudud

Sawirka No. 8 "Isugeynta weecashooyinka labajibaaran SGD (1000 tillaabo ee u dambeeya)"

Xallinta isla'egta dib u noqoshada toosan ee fudud

Bilawga bilawga soo degitaanka, waxaanu aragnaa direyska saxda ah iyo hoos u dhaca qaladka. Dib-u-eegistii ugu dambeysay, waxaan aragnaa in qaladku uu ku wareegsan yahay oo ku wareegsan yahay qiimaha 1,475 iyo mararka qaarkood xitaa waxay la mid tahay qiimahan ugu fiican, laakiin markaa weli way kor u kacdaa ... Waxaan ku celinayaa, waxaad qori kartaa qiyamka isku-dhafka Xallinta isla'egta dib u noqoshada toosan ee fudud ΠΈ Xallinta isla'egta dib u noqoshada toosan ee fudud, ka dibna dooro kuwa uu qaladku ugu yar yahay. Si kastaba ha ahaatee, waxaan haysanay dhibaato aad u daran: waxaan ku qasbanahay inaan qaadno 80 kun oo tillaabo (eeg code) si aan u helno qiyamka ugu dhow. Oo tani waxay horeba uga hor imanaysaa fikradda badbaadinta wakhtiga xisaabinta oo leh farcanka stochastic gradient marka loo eego farcanka gradient. Maxaa lagu sixi karaa oo la hagaajin karaa? Ma aha wax adag in la ogaado in soo noqnoqoshada ugu horeysa aan si kalsooni leh hoos ugu dhaceyno, sidaas darteed, waa inaan ka tagnaa tallaabo weyn oo ku saabsan soo noqnoqoshada hore oo aan yareyno tallaabada marka aan horay u soconno. Ma samayn doono tan qodobkan - horeba aad bay u dheer tahay. Kuwa doonaya waxay ka fikiri karaan naftooda sida tan loo sameeyo, ma aha wax adag :)

Hadda aynu samayno farcanka stochastic gradient anagoo adeegsanayna maktabadda bararsan (oo yeynan ku turunturoobin dhagaxaan aynu hore u aqoonsanay)

Xeerka Faraca Stochastic Gradient Deescent (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

Xallinta isla'egta dib u noqoshada toosan ee fudud

Qiimayaashu waxay noqdeen kuwo la mid ah marka hoos loo dhigo iyada oo aan la isticmaalin bararsan. Si kastaba ha ahaatee, tani waa macquul.

Aynu ogaano inta ay inagu qaadatay farcanka stochastic gradient.

Xeerka go'aaminta wakhtiga xisaabinta SGD (80 kun oo tallaabo)

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)

Xallinta isla'egta dib u noqoshada toosan ee fudud

Marka loo sii dheeraado kaynta, daruuraha mugdiga ah: mar labaad, qaacidada "is-qor" waxay muujineysaa natiijada ugu fiican. Waxaas oo dhami waxay soo jeedinayaan in ay qasab tahay in ay jiraan habab aad u khiyaano badan oo loo isticmaalo maktabadda bararsan, taas oo runtii dedejisa hawlaha xisaabinta. Maqaalkan kama baran doono iyaga. Waxa jiri doona wax aad ka fikirto wakhtiga firaaqada :)

Waxaan soo koobeynaa

Inta aanan soo koobin, waxaan jeclaan lahaa inaan ka jawaabo su'aal ay u badan tahay inay ka dhalatay akhristeheenna qaaliga ah. Waa maxay sababta, dhab ahaantii, "jilicda" noocan oo kale ah oo leh faras, maxaan ugu baahanahay inaan kor iyo hoos u sii soconno buurta (inta badan hoos) si aan u helno dhulka hoose ee qaaliga ah, haddii aan gacmaheena ku hayno qalab awood leh oo fudud, oo ku jira qaabka xal gorfaynta, kaas oo isla markiiba noo soo tebiya goobta saxda ah?

Jawaabta su'aashan waxay taal dusha sare. Hadda waxaan eegnay tusaale aad u fudud, kaas oo jawaabta dhabta ahi tahay Xallinta isla'egta dib u noqoshada toosan ee fudud waxay ku xiran tahay hal calaamad Xallinta isla'egta dib u noqoshada toosan ee fudud. Tan marar badan nolosha kuma aragto, markaa aynu qiyaasno inaan haysano 2, 30, 50 ama calaamado ka badan. Aynu ku darno kumanaankan, ama xitaa tobanaan kun oo qiyam ah sifo kasta. Xaaladdan oo kale, xalka falanqaynta waxaa laga yaabaa inuusan u adkeysan imtixaanka oo uu ku guuldareysto. Taa baddalkeeda, soo degista gradient iyo kala duwanaanshaheeda ayaa si tartiib tartiib ah laakiin hubaal noo soo dhowaan doona yoolka - ugu yaraan shaqada. Ha ka werwerin xawaaraha - waxay u badan tahay inaan eegi doono siyaabaha noo ogolaanaya inaan dejino oo aan nidaamino dhererka tallaabada (taas oo ah, xawaaraha).

Oo hadda kooban oo kooban oo dhab ah.

Marka hore, waxaan rajeynayaa in maaddada lagu soo bandhigay maqaalku ay caawin doonto bilawga "cilmi-yaqaannada xogta" si loo fahmo sida loo xalliyo isleegyada dib-u-celinta tooska ah ee fudud (oo aan ahayn oo keliya).

Marka labaad, waxaan eegnay dhowr siyaabood oo lagu xalliyo isla'egta. Hadda, iyadoo ku xiran xaaladda, waxaan dooran karnaa midka ugu habboon xallinta dhibaatada.

Seddexaad, waxaan aragnay awooda goobaha dheeraadka ah, kuwaas oo ah dhererka jaranjarada hoos udhaca. Halbeeggaan lama dayaci karo. Sida kor ku xusan, si loo yareeyo kharashka xisaabinta, dhererka tallaabada waa in la beddelaa inta lagu jiro soodejinta.

Marka afraad, kiiskeena, hawlaha "guriga ku qoran" waxay muujiyeen natiijooyinka wakhtiga ugu fiican ee xisaabinta. Tani waxay u badan tahay inay sabab u tahay isticmaalka xirfadaysan ee awoodaha maktabadda bararsan. Laakin si kastaba ha ahaatee, gabagabada soo socota ayaa is tusinaysa. Dhinaca kale, mararka qaarkood waxaa habboon in la is weydiiyo fikradaha la aasaasay, iyo dhinaca kale, mar walba ma haboona in la adkeeyo wax kasta - liddi ku ah, mararka qaarkood habka fudud ee xalinta dhibaatada ayaa waxtar badan leh. Maaddaama yoolkeennu ahaa inaan falanqaynno saddex hab oo lagu xallinayo isla'egta dib-u-celinta toosan ee fudud, adeegsiga hawlaha "is-qor" ayaa nagu filan nagu filan.

Suugaanta (ama wax la mid ah)

1. Dib u celin toosan

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

2. Habka afar geesoodka ugu yar

mathprofi.ru/metod_naimenshih_kvadratov.html

3. Derivative

www.mathprofi.ru/chastnye_proizvodnye_primery.html

4. Gradient

mathprofi.ru/proizvodnaja_po_napravleniju_i_gradient.html

5. Soo degid tartiib ah

habr.com/en/post/471458

habr.com/en/post/307312

artemarakcheev.com/2017-12-31/linear_regression

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

Source: www.habr.com

Add a comment