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
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"
Waxaan u qaadan doonaa in qiyamka waa bishii sanadka, iyo - dakhliga bishan. Si kale haddii loo dhigo, dakhligu wuxuu ku xiran yahay bisha sanadka, iyo - 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:
halkaas oo waa bishii la helay dakhliga, - dakhliga u dhigma bisha, ΠΈ waa isugeynta dib-u-celinta ee xariiqda la qiyaasay.
Ogsoonow in iskuxirnaanta inta badan loo yaqaan jiirada ama jaan-goynta xariiqda la qiyaasay; waxay ka dhigan tahay inta ay le'eg tahay marka ay is beddesho .
Sida iska cad, hawshayada tusaalaha ah waa in aan doorano isbarbardhigga isla'egta ΠΈ , 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):
halkaas oo waa shaqo qiyaas jawaabaha dhabta ah (taasi waa dakhliga aanu xisaabinay),
waa jawaabaha dhabta ah (dakhliga lagu sheegay muunada),
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 dhanka midig ee cutubka caadiga ah, qiimaha waxay kordhisaa 25 cutub oo caadi ah. Jaantuska waxay u egtahay kor u kac si cadaalad ah u kacay laga bilaabo qodob la siiyay.
Tusaale kale. Qiimaha kala soocida waa siman yahay -0,1 macneheedu waa marka la barakiciyo Halkii halbeeg caadiga ah, qiimaha 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 khayaali ΠΈ , 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. ΠΈ , 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 wuxuu qaadan doonaa foomka:
Dalabka 1aad qayb ahaan isla'egta kala soocida marka la eego wuxuu qaadan doonaa foomka:
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"
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 iyo , ka dib, kala qaybinta go'aamiye by ilaa go'aamiye guud - hel isku-dhafka , si la mid ah waxaan ka heli coefficient .
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:
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"
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, %"
Ma qummanayn, laakiin waannu dhammaystirnay hawsheenna.
Aynu qorno hawl, si loo go'aamiyo isku-xirnaanta ΠΈ 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 ΠΈ , 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)
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 ΠΈ .
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 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. ΠΈ 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 ΠΈ . 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 ka jar qiimaha nidaamka 1aad ee qayb ka mid ah soojeedinta barta . 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 : ka jar qiimaha qayb ka soo jeeda goobta .
- 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 ΠΈ ka jar qiyamka soosaarayaasha, waxaan helnaa iskudubarid cusub ΠΈ . 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
Waxaan u quusinay gunta ugu hoosaysa ee Mariana Trench, waxaanan ka helnay dhammaan qiimayaal isku mid ah ΠΈ , 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
Qiimaha wada shaqaynta ΠΈ 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"
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)
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 ΠΈ loo adeegsaday wadarta qiyamka dhammaan sifooyinka iyo jawaabaha dhabta ah ee laga heli karo muunada (taasi waa wadarta dhammaan ΠΈ ). 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 ΠΈ , 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. ΠΈ 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])
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 ΠΈ . 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"
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()
Sawirka No. 6 "Isugaynta leexashada labajibbaaran ee inta lagu jiro soo degitaanka jaan-gooyooyinka (80 kun tallaabo)"
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)"
Sawirka No. 8 "Isugeynta weecashooyinka labajibaaran SGD (1000 tillaabo ee u dambeeya)"
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 ΠΈ , 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
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)
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 waxay ku xiran tahay hal calaamad . 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
2. Habka afar geesoodka ugu yar
3. Derivative
4. Gradient
5. Soo degid tartiib ah
6. Maktabada NumPy