Inqaku lixoxa ngeendlela ezininzi zokumisela i-equation yemathematika yomgca wokubuyisela umva olula (odibeneyo).
Zonke iindlela zokusombulula inxaki ekuxoxwe ngayo apha zisekwe kwindlela yesikwere esincinci. Makhe sichaze iindlela ngolu hlobo lulandelayo:
- Isisombululo sohlalutyo
- Ukuhla kweGradient
- Ukwehla kwe-Stochastic gradient
Kwindlela nganye yokusombulula i-equation yomgca othe tye, inqaku libonelela ngemisebenzi eyahlukeneyo, eyahlulahlulwe ikakhulu kuleyo ibhaliweyo ngaphandle kokusebenzisa ithala leencwadi. INumPy kunye nezo zisetyenziselwa izibalo INumPy. Kukholelwa ukuba ukusetyenziswa ngobuchule INumPy iya kunciphisa iindleko zekhompyutha.
Yonke ikhowudi enikwe kwinqaku ibhalwe ngolwimi i-python 2.7 usebenzisa Incwadana yokubhalela kaJupyter. Ikhowudi yomthombo kunye nefayile eneenkcukacha zesampulu zifakwe kuyo
Eli nqaku lijolise ngakumbi kubo bobabini abaqalayo kunye nabo sele beqalise ngokuthe ngcembe ukufunda icandelo elibanzi kakhulu kubukrelekrele bokwenziwa - ukufunda ngomatshini.
Ukuzekelisa umbandela, sisebenzisa umzekelo olula kakhulu.
Umzekelo iimeko
Sinemilinganiselo emihlanu ebonisa ukuxhomekeka Y ukusuka X (Uluhlu loku-1):
Itheyibhile 1 "Iimeko zomzekelo"
Siya kucinga ukuba amaxabiso yinyanga yonyaka, kwaye - ingeniso kule nyanga. Ngamanye amazwi, ingeniso ixhomekeke kwinyanga yonyaka, kwaye - uphawu kuphela apho ingeniso ixhomekeke.
Umzekelo unjalo-njalo, zombini ukusuka kwindawo yokujonga ukuxhomekeka kwemeko yengeniso ngenyanga yonyaka, kwaye ukusuka kwindawo yokujonga inani lamaxabiso - bambalwa kakhulu kubo. Nangona kunjalo, ukwenza lula okunjalo kuya kwenza ukuba kube lula, njengoko bethetha, ukuchaza, kungekhona ngokulula, izinto ezenziwa ngabaqalayo. Kwaye nokulula kwamanani kuya kuvumela abo banqwenela ukusombulula umzekelo ephepheni ngaphandle kweendleko ezibalulekileyo zomsebenzi.
Makhe sicinge ukuba ukuxhomekeka okunikiweyo kumzekelo kunokuqikelelwa kakuhle ngezibalo zomgca wobuyiselo olula (odibeneyo) wefomu:
apho yinyanga efunyenwe ngayo ingeniso; - ingeniso ehambelana nenyanga, ΠΈ zi-coefficients zokuhlehla zomgca oqikelelweyo.
Qaphela ukuba i-coefficient kudla ngokubizwa ngokuba kukuthambeka okanye ukuthambeka komgca oqikelelweyo; imele imali apho i xa itshintsha .
Ngokucacileyo, umsebenzi wethu kumzekelo kukukhetha ii-coefficients ezinjalo kwi-equation ΠΈ , apho ukutenxa kumaxabiso ethu engeniso ebalwayo ngenyanga ukusuka kwiimpendulo eziyinyani, i.e. amaxabiso aboniswe kwisampulu aya kuba mncinci.
Ubuncinci indlela yesikwere
Ngokweyona ndlela incinci yesikwere, ukutenxa kufuneka kubalwe ngokuyiphinda. Ubuchwephesha bukuvumela ukuba uphephe ukurhoxiswa okufanayo kweetenxa ukuba zineempawu ezichaseneyo. Umzekelo, ukuba kwimeko enye, ukutenxa +5 (kunye nesihlanu), kwaye kwenye -5 (thabatha isihlanu), emva koko isixa-mali sokutenxa siya kurhoxisa enye kwenye kwaye ibe ngu-0 (zero). Kuyenzeka ukuba ungenzi isikweri sokutenxa, kodwa ukusebenzisa ipropathi yemodyuli kwaye emva koko zonke izitenxo ziya kuba zilungile kwaye ziya kuqokelelana. Asiyi kuhlala kule ngongoma ngokweenkcukacha, kodwa sibonisa nje ukuba ukuze kube lula ukubala, kuyinto yesiko ukwenza isikwere ukutenxa.
Le yindlela ifomyula ejongeka ngayo esiya kuthi ngayo sigqibe ngesona sixa sincinci sokunxaxha okuphindwe kabini (iimpazamo):
apho ngumsebenzi woqikelelo lweempendulo eziyinyani (oko kukuthi, ingeniso esiyibalileyo),
ziimpendulo eziyinyani (ingeniso inikezelwe kwisampulu),
sisalathiso sesampulu (inani lenyanga apho ukutenxa kumiselwe)
Masihlukanise umsebenzi, sichaze ii-equations zokwahlula ngokuyinxenye, kwaye silungele ukuqhubela phambili kwisisombululo sohlalutyo. Kodwa kuqala, makhe sithathe uhambo olufutshane malunga nokuba yintoni umahluko kwaye sikhumbule intsingiselo yejometri yento ephuma kuyo.
Umahluko
Umahluko kukusebenza kokufumana i-derivative yomsebenzi.
Isetyenziselwa ntoni i-derivative? I-derivative ye-function ibonakalisa izinga lotshintsho lomsebenzi kwaye isixelela indlela yayo. Ukuba i-derivative kwinqanaba elinikiweyo lilungile, ngoko umsebenzi uyakhula; kungenjalo, umsebenzi uyancipha. Kwaye ixabiso elikhulu le-absolute derivative, liphezulu izinga lotshintsho lwamaxabiso omsebenzi, kunye nokunyuka kwethambeka lomsebenzi wegrafu.
Umzekelo, phantsi kweemeko zeCartesian coordinate system, ixabiso le-derivative kwindawo ethi M (0,0) ilingana no. + 25 kuthetha ukuba kwinqanaba elinikiweyo, xa ixabiso litshintshiwe ekunene ngeyunithi eqhelekileyo, ixabiso ukwanda ngama-25 eeyunithi eziqhelekileyo. Kwigrafu kubonakala ngathi ukunyuka okuthe kratya kumaxabiso ukusuka kwindawo enikiweyo.
Omnye umzekelo. Ixabiso le-derivative liyalingana -0,1 kuthetha ukuba xa ufuduswa ngokweyunithi enye eqhelekileyo, ixabiso iyancipha ngo-0,1 kuphela iyunithi eqhelekileyo. Kwangaxeshanye, kwigrafu yomsebenzi, sinokubona i-slope engabonakaliyo ezantsi. Ukuzoba umzekeliso nentaba, kuba ngathi sihla ngokucothayo kwithambeka elithambileyo ukusuka entabeni, ngokungafaniyo nomzekelo wangaphambili, apho bekufuneka sinyuke iincopho eziphakamileyo :)
Ngaloo ndlela, emva kokwahlula umsebenzi ngeengxaki ΠΈ , sichaza ulandelelwano lwe-1st olwahlukileyo lweeequations. Emva kokumisela ii-equations, siya kufumana inkqubo yee-equations ezimbini, ngokusombulula apho siya kuba nako ukukhetha amaxabiso anjalo ee-coefficients. ΠΈ , apho amaxabiso ezinto eziphuma kuzo ezihambelanayo kumanqaku anikiweyo atshintsha ngexabiso elincinci kakhulu, kwaye kwimeko yesisombululo sohlalutyo ayitshintshi kwaphela. Ngamanye amazwi, umsebenzi wempazamo kwii-coefficients ezifunyenweyo uya kufikelela kubuncinci, kuba amaxabiso ezinto eziphuma kwinxenye kula manqaku aya kulingana no-zero.
Ngoko ke, ngokwemigaqo yokwahlulahlula, inxenye ye-equation derivative yomyalelo woku-1 ngokubhekiselele kwi-coefficient. iya kuthatha ifom:
I-odolo yoku-1 ephuma kwinxaki ephuma kwinxaki ngokunxulumene iya kuthatha ifom:
Ngenxa yoko, sifumene inkqubo yee-equations enesisombululo esilula sohlalutyo:
qala{inxaki*}
qala{amatyala}
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
isiphelo{amatyala}
isiphelo{inxaki*}
Ngaphambi kokusombulula i-equation, masilayishe kwangaphambili, sijonge ukuba ukulayishwa kuchanekile, kwaye sifomethe idatha.
Iyalayisha kunye nokufomatha idatha
Kufuneka kuqatshelwe ukuba ngenxa yento yokuba kwisisombululo sohlalutyo, kwaye emva koko kwi-gradient kunye ne-stochastic gradient descent, siya kusebenzisa ikhowudi kwiiyantlukwano ezimbini: usebenzisa ithala leencwadi. INumPy kwaye ngaphandle kokuyisebenzisa, ngoko siya kufuna ukufomatha idatha efanelekileyo (jonga ikhowudi).
Ukulayishwa kwedatha kunye nekhowudi yokucubungula
# ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ Π½Π°ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
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 '********************************************'
Ukubonakala
Ngoku, emva kokuba, okokuqala, silayishe idatha, okwesibini, sihlolisise ukuchaneka kokulayisha kwaye ekugqibeleni sifomethwe idatha, siya kuqhuba umboniso wokuqala. Indlela esoloko isetyenziselwa oku iploti iilayibrari Ulwandle. Kumzekelo wethu, ngenxa yamanani aqingqiweyo, akukho sizathu sokusebenzisa ithala leencwadi Ulwandle. Siya kusebenzisa ithala leencwadi eliqhelekileyo matplotlib kwaye ujonge nje isiqwenga.
Ikhowudi ye-scatterplot
print 'ΠΡΠ°ΡΠΈΠΊ β1 "ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π²ΡΡΡΡΠΊΠΈ ΠΎΡ ΠΌΠ΅ΡΡΡΠ° Π³ΠΎΠ΄Π°"'
plt.plot(x_us,y_us,'o',color='green',markersize=16)
plt.xlabel('$Months$', size=16)
plt.ylabel('$Sales$', size=16)
plt.show()
Itshathi No. 1 βKuxhomekeke kwingeniso ngenyanga yonyakaβ
Isisombululo sohlalutyo
Masisebenzise ezona zixhobo zixhaphakileyo kwi python kunye nokusombulula inkqubo yeenxaki:
qala{inxaki*}
qala{amatyala}
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
isiphelo{amatyala}
isiphelo{inxaki*}
Ngokomgaqo kaCramer siya kufumana i-determinant jikelele, kunye ne-determinants nge nangokuthi , emva koko, ukwahlula isilawuli nge kwi-general determinant - fumana i-coefficient , ngokufanayo sifumana i-coefficient .
Ikhowudi yesisombululo sohlalutyo
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠ°ΡΡΠ΅ΡΠ° ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² 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)
Nantsi into esinayo:
Ke, amaxabiso ee-coefficients afunyenwe, isixa sokutenxa esisikweri sisekiwe. Masizobe umgca othe ngqo kwi-histogram esasazwayo ngokuhambelana ne-coefficients efunyenweyo.
Ikhowudi yomgca wobuyiselo
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠ°ΡΡΡΠ΅ΡΠ½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π²ΡΡΡΡΠΊΠΈ
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()
Inombolo yesi-2 βIimpendulo ezichanekileyo nezibaliweyoβ
Ungajonga igrafu yokutenxa kwinyanga nganye. Kwimeko yethu, asizukufumana naliphi na ixabiso elibonakalayo elibonakalayo kuyo, kodwa siya kwanelisa umnqweno wethu wokwazi malunga nokuba ulandelelwano olulula lokuhlehla equation lubonisa njani ukuxhomekeka kwengeniso kwinyanga yonyaka.
Ikhowudi yetshathi yokutenxa
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ Π² ΠΏΡΠΎΡΠ΅Π½ΡΠ°Ρ
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()
Isicangca esinguNombolo 3 βUkunxaxha, %β
Asifezekanga, kodwa siwugqibile umsebenzi wethu.
Masibhale umsebenzi wokuba, ukufumanisa i-coefficients ΠΈ usebenzisa ithala leencwadi INumPy, ngokuchanekileyo, siya kubhala imisebenzi emibini: enye isebenzisa i-matrix ye-pseudoinverse (engakhuthazwayo ekusebenzeni, ekubeni inkqubo iyinkimbinkimbi kwaye ingazinzile), enye isebenzisa i-equation ye-matrix.
Uhlalutyo lweKhowudi yesisombululo (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
Makhe sithelekise ixesha elichithwe ekunqumeni i-coefficients ΠΈ , ngokuhambelana neendlela ezi-3 ezinikezelweyo.
Ikhowudi yokubala ixesha lokubala
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)
Ngomlinganiselo omncinci wedatha, umsebenzi "ozibhalayo" uphuma phambili, ofumana i-coefficients usebenzisa indlela yeCramer.
Ngoku ungaya kwezinye iindlela zokufumana ii-coefficients ΠΈ .
Ukuhla kweGradient
Okokuqala, makhe sichaze ukuba yintoni i-gradient. Ukubeka ngokulula, i-gradient licandelo elibonisa isalathiso sokukhula okuphezulu komsebenzi. Ngokufaniswa nokunyuka intaba, apho uthambeka lujonge khona kulapho oyena mnqantsa unyukela encotsheni yentaba ukhoyo. Ukuphuhlisa umzekelo kunye nentaba, sikhumbula ukuba ngokwenene sidinga ukuhla okugqithiseleyo ukuze sifike kwindawo ephantsi ngokukhawuleza, oko kukuthi, ubuncinci - indawo apho umsebenzi awunyuki okanye uyancipha. Kweli nqanaba i-derivative iyakulingana no-zero. Ngoko ke, asiyifuni i-gradient, kodwa i-antigradient. Ukufumana i-antigradient kufuneka nje uphindaphinde i-gradient ngayo -1 (thabatha enye).
Makhe sithathele ingqalelo into yokuba umsebenzi unokuba ne-minima ezininzi, kwaye emva kokuhla kwenye yazo usebenzisa i-algorithm ecetywayo ngezantsi, asiyi kukwazi ukufumana enye ubuncinane, enokuba ngaphantsi kweyona ifunyenweyo. Masiphumle, oku ayisosisongelo kuthi! Kwimeko yethu sijongana nobuncinci obunye, ukusukela umsebenzi wethu kwigrafu yiparabola eqhelekileyo. Kwaye njengoko sonke kufuneka sazi kakuhle kakhulu kwikhosi yemathematika yesikolo, iparabola inobuncinane obunye kuphela.
Emva kokuba sifumanise ukuba kutheni sifuna i-gradient, kunye nokuba i-gradient licandelo, oko kukuthi, i-vector enolungelelwaniso olunikiweyo, olulingana ncakasana ne-coefficients. ΠΈ singakwazi ukuphumeza ukuhla kwe-gradient.
Ngaphambi kokuba ndiqale, ndicebisa ukuba ufunde izivakalisi ezimbalwa malunga nokwehla kwe-algorithm:
- Simisela ngendlela engacwangciswanga ngokungalindelekanga ulungelelwaniso lwee-coefficients ΠΈ . Kumzekelo wethu, siya kuchaza i-coefficients kufuphi ne-zero. Le yinto eqhelekileyo, kodwa imeko nganye inokuba nenkqubo yayo.
- Ukusuka kukulungelelanisa thabatha ixabiso le-1st order derivative partial kwindawo . Ngoko ke, ukuba i-derivative ilungile, ngoko umsebenzi uyanda. Ngoko ke, ngokukhupha ixabiso le-derivative, siya kuhamba kwicala elichasene nokukhula, oko kukuthi, kwicala lokuhla. Ukuba i-derivative i-negative, ngoko umsebenzi kule ngongoma uyancipha kwaye ngokukhupha ixabiso le-derivative sihamba kwicala lokuhla.
- Senza umsebenzi ofanayo kunye nolungelelwaniso : thabatha ixabiso lenxenye yokuphuma kwinqanaba .
- Ukuze ungatsibi ngaphaya kobuncinci kwaye ubhabhe kwindawo enzulu, kuyimfuneko ukuseta ubungakanani benyathelo kwicala lokuhla. Ngokubanzi, ungabhala inqaku elipheleleyo malunga nendlela yokuseta inyathelo ngokuchanekileyo kunye nendlela yokuyitshintsha ngexesha lenkqubo yokwehla ukwenzela ukunciphisa iindleko zokubala. Kodwa ngoku sinomsebenzi owahluke kancinane phambi kwethu, kwaye siya kuseka ubungakanani benyathelo sisebenzisa indlela yesayensi ye "poke" okanye, njengoko bethetha ngolwimi oluqhelekileyo, ngobuchule.
- Emva kokuba sisuka kwii-coordinates ezinikiweyo ΠΈ Ukukhupha amaxabiso ezinto eziphuma kuzo, sifumana ulungelelwaniso olutsha ΠΈ . Sithatha isinyathelo esilandelayo (ukuthabatha), sele sele sisuka kwiindlela ezibaliweyo. Kwaye ke umjikelo uqala kwakhona kwaye kwakhona, de ukudibanisa okufunekayo kufezekiswe.
Konke! Ngoku sikulungele ukuya kukhangela owona mwonyo unzulu weMariana Trench. Masiqalise.
Ikhowudi yokwehla komgangatho
# Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΡΡΠΊΠ° Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ 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
Siye santywila emazantsi eMariana Trench kwaye apho safumana amaxabiso afanayo ΠΈ , nto leyo kanye ebeyilindelekile.
Masithathe enye into yokuntywila, ngeli xesha kuphela, isithuthi sethu solwandle olunzulu siya kugcwala obunye ubuchwephesha, obuziithala leencwadi. INumPy.
Ikhowudi yokwehla komgangatho (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
Amaxabiso e-Coefficient ΠΈ ayinakuguqulwa.
Makhe sijonge ukuba impazamo yatshintsha njani ngexesha lokwehla komgangatho, oko kukuthi, indlela isixa sotembuko oluphindwe kabini olutshintshe ngayo inyathelo ngalinye.
Ikhowudi yokucwangcisa iimali zokunxaxha okuphindwe kabini
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()
Igrafu enguNombolo yesi-4 βIsimbuku sokunxaxha okusikweri ngexesha lokuhla komthambekaβ
Kwigrafu sibona ukuba ngenyathelo ngalinye impazamo iyancipha, kwaye emva kwenani elithile lokuphindaphinda sibona umgca othe tye.
Okokugqibela, masiqikelele umahluko kwixesha lokwenziwa kwekhowudi:
Ikhowudi yokumisela ixesha lokubala ukuhla
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)
Mhlawumbi senza into engalunganga, kodwa kwakhona ngumsebenzi olula "obhalwe ekhaya" ongasebenzisi ithala leencwadi. INumPy lilodlula ixesha lokubala lomsebenzi usebenzisa ithala leencwadi INumPy.
Kodwa asimi ngxi, kodwa sijonge phambili ekufundeni enye indlela enika umdla yokusombulula i-equation yomgca olula. Sidibane nathi!
Ukwehla kwe-Stochastic gradient
Ukuze uqonde ngokukhawuleza umgaqo wokusebenza kwe-stochastic gradient descent, kungcono ukumisela ukungafani kwayo ukusuka kwi-gradient yesiqhelo. Thina, kwimeko yokwehla kwe-gradient, kwii-equations ze-derivatives ze ΠΈ wasebenzisa ii-sums zamaxabiso azo zonke iimpawu kunye neempendulo eziyinyani ezikhoyo kwisampulu (oko kukuthi, iimali zazo zonke. ΠΈ ). Kwi-stochastic gradient descent, asizukusebenzisa onke amaxabiso akhoyo kwisampulu, kodwa endaweni yoko, khetha ngokungakhethiyo into ebizwa ngokuba yisampula yesalathiso kwaye usebenzise amaxabiso ayo.
Umzekelo, ukuba isalathisi sizimisele ukuba yinombolo 3 (ezintathu), ngoko sithatha amaxabiso ΠΈ , emva koko sibeka amaxabiso endaweni ye-equations ephumayo kwaye simisele ulungelelwaniso olutsha. Emva koko, emva kokugqiba ulungelelwaniso, siphinda sigqibe nge-pseudo-ngokungakhethiyo isalathiso sesampulu, sitshintshe amaxabiso ahambelana nesalathiso kwi-equations ephakathi, kwaye simisele ulungelelwaniso ngendlela entsha. ΠΈ njl. de ukudibana kube luhlaza. Ekuqaleni, kusenokungabonakali ngathi oku kunokusebenza konke konke, kodwa kunjalo. Kuyinyani ukuba kuyafaneleka ukuba uqaphele ukuba impazamo ayinciphisi ngenyathelo ngalinye, kodwa ngokuqinisekileyo kukho ukuthambekela.
Zeziphi iingenelo zokwehla kwestochastic kunesiqhelo? Ukuba ubungakanani bethu besampulu bukhulu kakhulu kwaye bulinganiselwa kumashumi amawaka amaxabiso, ngoko kulula kakhulu ukuqhubekeka, yithi, iwaka elingakhethiyo, kunokuba isampuli iyonke. Kulapho kungena khona ukwehla kwestochastic gradient. Kwimeko yethu, ngokuqinisekileyo, asiyi kuqaphela umahluko omkhulu.
Makhe sijonge ikhowudi.
Ikhowudi yokwehla kwestochastic
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠΎΡ
.Π³ΡΠ°Π΄.ΡΠ°Π³Π°
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])
Sijonga ngononophelo kwii-coefficients kwaye sizibambe sibuza umbuzo othi "Inokwenzeka njani le nto?" Sifumene amanye amaxabiso e-coefficient ΠΈ . Mhlawumbi ukuhla komgangatho westochastic kufumene iiparamitha ezizezona zilungileyo zenxaki? Ngelishwa akukho. Kwanele ukujonga isimbuku sokunxaxha okuphindwe kabini kwaye ubone ukuba ngamaxabiso amatsha ee-coefficients, impazamo inkulu. Asingxamanga ukuba siphelelwe lithemba. Masenze igrafu yotshintsho lwempazamo.
Ikhowudi yokucwangcisa isixa sotembuko oluphindwe kabini kumzantsi westochastic gradient
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()
Igrafu enguNombolo 5 βIsimbuku sokunxaxha okusikweri ngexesha lokuhla kwe-stochastic gradientβ
Ukujonga ishedyuli, yonke into iwela endaweni kwaye ngoku siya kulungisa yonke into.
Kwenzeka ntoni ke? Oku kulandelayo kwenzeka. Xa sikhetha inyanga ngokungakhethiyo, ke yinyanga ekhethiweyo ukuba i-algorithm yethu ifuna ukunciphisa impazamo ekubaleni ingeniso. Emva koko sikhetha enye inyanga kwaye siphinda ukubala, kodwa sinciphisa impazamo kwinyanga yesibini ekhethiweyo. Ngoku khumbula ukuba iinyanga ezimbini zokuqala zitenxa kakhulu kumgca wolandelelwano olulula lwenxaki. Oku kuthetha ukuba xa nayiphi na kwezi nyanga zimbini ikhethiwe, ngokunciphisa impazamo nganye kuzo, i-algorithm yethu yonyusa kakhulu impazamo kwisampulu yonke. Ke makwenziwe ntoni? Impendulo ilula: kufuneka unciphise inyathelo lokuhla. Emva kwayo yonke loo nto, ngokunciphisa inyathelo lokuhla, impazamo iya kuyeka "ukutsiba" phezulu naphantsi. Okanye kunoko, impazamo "yokuxhuma" ayiyi kuyeka, kodwa ayiyi kuyenza ngokukhawuleza :) Makhe sihlolisise.
Ikhowudi yokuqhuba i-SGD ngokunyuswa okuncinci
# Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ, ΡΠΌΠ΅Π½ΡΡΠΈΠ² ΡΠ°Π³ Π² 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()
Igrafu enguNombolo 6 βIsimbuku sokunxaxha okusikweri ngexesha lokuhla kwe-stochastic gradient (amawaka angama-80 amanyathelo)β
I-coefficients iphuculwe, kodwa ayikabikho kakuhle. Ngokwenyani, oku kunokulungiswa ngolu hlobo. Sikhetha, umzekelo, kuphindaphindo lwe-1000 lokugqibela amaxabiso ee-coefficients apho impazamo encinci yenziwe ngayo. Kuyinyani, oku kuya kufuneka sibhale phantsi amaxabiso ee-coefficients ngokwawo. Asiyi kukwenza oku, kodwa kunoko sinikele ingqalelo kwishedyuli. Ijongeka igudile kwaye impazamo ibonakala iyancipha ngokulinganayo. Eneneni oku akuyonyani. Makhe sijonge kwi-1000 yokuqala yophindaphindo kwaye siyithelekise neyokugqibela.
Ikhowudi yetshathi yeSGD (amanyathelo okuqala ali-1000)
print 'ΠΡΠ°ΡΠΈΠΊ β7 "Π‘ΡΠΌΠΌΠ° ΠΊΠ²Π°Π΄ΡΠ°ΡΠΎΠ² ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΏΠΎ-ΡΠ°Π³ΠΎΠ²ΠΎ. ΠΠ΅ΡΠ²ΡΠ΅ 1000 ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ"'
plt.plot(range(len(list_parametres_stoch_gradient_descence[1][:1000])),
list_parametres_stoch_gradient_descence[1][:1000], color='red', lw=2)
plt.xlabel('Steps (Iteration)', size=16)
plt.ylabel('Sum of squared deviations', size=16)
plt.show()
print 'ΠΡΠ°ΡΠΈΠΊ β7 "Π‘ΡΠΌΠΌΠ° ΠΊΠ²Π°Π΄ΡΠ°ΡΠΎΠ² ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΏΠΎ-ΡΠ°Π³ΠΎΠ²ΠΎ. ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ 1000 ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ"'
plt.plot(range(len(list_parametres_stoch_gradient_descence[1][-1000:])),
list_parametres_stoch_gradient_descence[1][-1000:], color='red', lw=2)
plt.xlabel('Steps (Iteration)', size=16)
plt.ylabel('Sum of squared deviations', size=16)
plt.show()
Igrafu enguNombolo yesi-7 βIsimbuku see-square deviations SGD (first 1000 steps)β
Igrafu enguNombolo 8 βIsimbuku see-square deviations SGD (inyathelo lokugqibela eli-1000)β
Kwasekuqaleni kokuhla, sibona impazamo efanayo kunye nokwehla okunyukayo. Ekuphindaphindweni kokugqibela, sibona ukuba impazamo iyajikeleza kwaye ijikeleze ixabiso le-1,475 kwaye ngamanye amaxesha ide ilingane nelona xabiso liphezulu, kodwa ke liyenyuka ... ndiyaphinda, ungabhala phantsi amaxabiso ii-coefficients ΠΈ , kwaye emva koko ukhethe ezo impazamo incinci kuzo. Nangona kunjalo, sasinengxaki enkulu ngakumbi: kwafuneka sithathe amanyathelo angama-80 amawaka (jonga ikhowudi) ukufumana amaxabiso kufutshane neyona nto ilungileyo. Kwaye oku sele kuphikisana nombono wokugcina ixesha lokubala kunye ne-stochastic gradient descent ngokubhekisele kwi-gradient descent. Yintoni enokulungiswa ize iphuculwe? Akunzima ukuqaphela ukuba kwii-iterations zokuqala sihamba ngokuzithemba kwaye, ngoko ke, kufuneka sishiye inyathelo elikhulu kwi-iterations yokuqala kwaye sinciphise isinyathelo njengoko siqhubela phambili. Asiyi kwenza oku kweli nqaku - sele lide kakhulu. Abo banqwenelayo banokuzicingela ngokwabo ukuba bangayenza njani le nto, akunzima :)
Ngoku masenze ukwehla komgangatho westochastic sisebenzisa ithala leencwadi INumPy (kwaye masingakhubeki kulamatye ebesiwachazile ngaphambili)
IKhowudi yeStochastic ngokweHlupheko (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
Amaxabiso ajike aphantse afane naxa usihla ngaphandle kokusebenzisa INumPy. Noko ke, oku kusengqiqweni.
Masifumanise ukuba ukwehla kwestochastic gradient kusithathe ixesha elingakanani.
Ikhowudi yokumisela ixesha lokubala le-SGD (amanyathelo angama-80 amawaka)
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)
Ukuqhubela phambili ehlathini, amafu amnyama: kwakhona, ifomula "ebhaliweyo" ibonisa umphumo ongcono. Konke oku kubonisa ukuba makubekho iindlela ezichuliweyo zokusebenzisa ithala leencwadi INumPy, ezikhawulezisa ngokwenene imisebenzi yokubala. Kweli nqaku asizukufunda ngazo. Kuya kubakho into onokucinga ngayo ngexesha lakho lokuphumla :)
Sishwankathela
Ngaphambi kokuba ndishwankathele, ndingathanda ukuphendula umbuzo ekusenokwenzeka ukuba ukhe wavela kumfundi wethu othandekayo. Kutheni, eneneni, "intuthumbo" enjalo kunye nokwehla, kutheni kufuneka sihambe sinyuka sinyuka intaba (ubukhulu becala ezantsi) ukuze sifumane indawo ephantsi exabisekileyo, ukuba sinezandla zethu isixhobo esinamandla nesilula, uhlobo lwesisombululo sohlalutyo, esisithumela ngoko nangoko kwiNdawo eLungileyo?
Impendulo yalo mbuzo ilapha phezulu. Ngoku sijonge umzekelo olula kakhulu, apho impendulo yokwenyani ikhoyo ixhomekeke kuphawu olunye . Awuyiboni le nto rhoqo ebomini, ngoko makhe sicinge ukuba sineempawu ezi-2, ezingama-30, ezingama-50 okanye ngaphezulu. Makhe songeze koku amawaka, okanye amashumi amawaka amaxabiso kuphawu ngalunye. Kule meko, isisombululo sokuhlalutya asinako ukumelana novavanyo kwaye singaphumeleli. Kwelinye icala, ukuhla kwe-gradient kunye nokwahluka kwayo kuya kuthi chu kodwa ngokuqinisekileyo kusisondeze kufutshane nenjongo - ubuncinci bomsebenzi. Kwaye ungakhathazeki ngesantya - mhlawumbi siya kujonga iindlela eziya kusivumela ukuba sibeke kwaye silawule ubude benyathelo (oko kukuthi, isantya).
Kwaye ngoku isishwankathelo esifutshane.
Okokuqala, ndiyathemba ukuba izinto ezichazwe kwinqaku ziya kunceda ukuqalisa "izazinzulu zedatha" ekuqondeni indlela yokusombulula ii-equations ezilula (kwaye hayi kuphela).
Okwesibini, sijonge iindlela ezininzi zokusombulula i-equation. Ngoku, kuxhomekeke kwimeko, sinokukhetha eyona ifaneleke kakhulu ukusombulula ingxaki.
Okwesithathu, sabona amandla esethingi ezongezelelweyo, ezizezi, ubude benyathelo lokwehla kwe-gradient. Le parameter ayinakungahoywa. Njengoko kuphawuliwe ngasentla, ukwenzela ukunciphisa iindleko zokubala, ubude besinyathelo kufuneka butshintshwe ngexesha lokuhla.
Okwesine, kwimeko yethu, imisebenzi "ebhalwe ekhaya" ibonise iziphumo ezilungileyo zexesha lokubala. Oku mhlawumbi kungenxa yokungasebenzisi kakhulu kobuchule bethala leencwadi INumPy. Kodwa nokuba kusenokuba njalo, isigqibo esilandelayo sizibonakalisa ngokwaso. Ngakolunye uhlangothi, ngamanye amaxesha kuyafaneleka ukubuza iimbono ezimiselweyo, kwaye kwelinye icala, akusoloko kufanelekile ukunyanzela yonke into - ngokuchaseneyo, ngamanye amaxesha indlela elula yokusombulula ingxaki isebenza ngakumbi. Kwaye kuba injongo yethu yayikukuhlalutya iindlela ezintathu zokusombulula i-equation ye-linear regression equation, ukusetyenziswa kwemisebenzi "ezibhale ngokwakho" kwakwanele kuthi.
Uncwadi (okanye into enjalo)
1. Ukuhlehla komgca
2. Ubuncinci indlela yezikwere
3. Ukukhutshwa
4. Gradient
5. Ukwehla komgangatho
6. Ithala leencwadi leNumPy
umthombo: www.habr.com