Ny lahatsoratra dia miresaka fomba maro hamaritana ny equation matematika amin'ny tsipika fihemorana tsotra (miaraka).
Ny fomba rehetra hamahana ny equation resahina eto dia mifototra amin'ny fomba efamira kely indrindra. Andeha hojerentsika ireto fomba manaraka ireto:
- Vahaolana analytique
- Gradient Descent
- Fidinana gradient stochastic
Ho an'ny fomba tsirairay hamahana ny equation amin'ny tsipika mahitsy, ny lahatsoratra dia manome asa isan-karazany, izay mizara indrindra amin'ireo izay voasoratra tsy mampiasa ny tranomboky. NomPy ary ireo izay mampiasa kajy NomPy. Misy mihevitra fa ny fampiasana mahay NomPy hampihena ny vidin'ny informatika.
Ny kaody rehetra omena ao amin'ny lahatsoratra dia voasoratra amin'ny fiteny python-2.7 amin'ny Jupyter Notebook. Ny kaody loharano sy ny rakitra misy angona santionany dia apetraka ao
Ny lahatsoratra dia mikendry kokoa ho an'ny beginners sy ireo izay efa nanomboka tsikelikely hifehy ny fianarana fizarana tena midadasika amin'ny artificial intelligence - machine learning.
Mba hanazavana ilay fitaovana, dia mampiasa ohatra tena tsotra isika.
Conditions ohatra
Manana soatoavina dimy isika izay mampiavaka ny fiankinan-doha Y ΠΎΡ X (Table No. 1):
Tabilao No. 1 βFepetra ohatraβ
Heverintsika fa ny soatoavina dia ny volana aminβny taona, ary - vola miditra amin'ity volana ity. Raha lazaina amin'ny teny hafa, ny vola miditra dia miankina amin'ny volana amin'ny taona, ary - ny famantarana tokana iankinan'ny fidiram-bola.
Ny ohatra dia toy izany, na avy amin'ny fomba fijery ny fiankinan-doha amin'ny fepetra amin'ny volana amin'ny taona, ary avy amin'ny fomba fijery ny isan'ny soatoavina - dia vitsy amin'izy ireo. Na izany aza, ny fanatsorana toy izany dia hahatonga azy ireo ho azo atao, araka ny filazan'izy ireo, ny manazava, fa tsy amin'ny fomba mora foana, ny fitaovana izay ampianarin'ny beginners. Ary koa ny fahatsoran'ny isa dia ahafahan'ireo izay maniry ny hamaha ny ohatra amin'ny taratasy tsy misy vola lany amin'ny asa.
Andeha hojerentsika fa ny fiankinan-doha omena amin'ny ohatra dia azo tombanana tsara amin'ny alΓ lan'ny equation matematika amin'ny tsipika famerenam-bidy tsotra (miaraka) amin'ny endrika:
izay dia ny volana nahazoana ny vola miditra, - vola miditra mifanaraka amin'ny volana, ΠΈ dia ny coefficient fihemorana amin'ny tsipika tombanana.
Mariho fa ny coefficient antsoina matetika hoe slope na gradient amin'ny tsipika tombanana; maneho ny habetsahan'ny rehefa miova .
Mazava ho azy fa ny andraikitsika amin'ny ohatra dia ny mifidy ny coefficient toy izany ao amin'ny equation ΠΈ , izay misy ny fivilian'ny sandan'ny vola miditra amin'ny volana amin'ny valiny marina, i.e. ny soatoavina aseho amin'ny santionany dia ho kely indrindra.
Fomba faran'izay kely indrindra
Araka ny fomba efamira faran'izay kely indrindra, ny fivilian-dΓ lana dia tokony hokajiana amin'ny fametahana azy. Ity teknika ity dia ahafahanao misoroka ny fanafoanana ny fiviliana raha toa ka manana famantarana mifanohitra izy ireo. Ohatra, raha amin'ny tranga iray, ny fiviliana dia +5 (miampy dimy), ary ny iray hafa -5 (minus dimy), avy eo ny fitambaran'ny fivilian-dΓ lana dia hifamono ary mitentina 0 (aotra). Azo atao ny tsy mametraka ny fivilian-dΓ lana, fa ny fampiasana ny fananan'ny modulus ary avy eo dia ho tsara ny fiviliana rehetra ary hiangona. Tsy hiresaka amin'ny an-tsipiriany momba ity teboka ity isika, fa manondro fotsiny fa ho an'ny fanamorana ny kajikajy dia mahazatra ny mametraka ny deviation.
Toy izao ny endriky ny raikipohy izay hamaritana ny fitambaran'ny fiviliana efamira kely indrindra (fahadisoana):
izay dia fiasan'ny fanombanana ny valiny marina (izany hoe ny vola miditra kajy),
dia ny valiny marina (vola miditra ao amin'ny santionany),
dia ny mari-pamantarana santionany (isan'ny volana hamaritana ny fiviliana)
Andeha hovahana ny asa, hamaritana ny equations partial diffΓ©rence, ary vonona ny hiroso amin'ny vahaolana analytique. Fa aloha, andeha isika hanao fitsangatsanganana fohy momba ny atao hoe fanavahana ary tsarovy ny dikan'ny geometrika amin'ny derivative.
Fanavahana
Ny differentiation dia ny fiasan'ny fitadiavana ny derivative amin'ny asa iray.
Inona no atao hoe derivative? Ny derivative amin'ny fonction iray dia mamaritra ny tahan'ny fiovan'ny asa ary milaza amintsika ny lalany. Raha tsara ny derivative amin'ny teboka iray, dia mitombo ny asa; raha tsy izany dia mihena ny asa. Ary ny lehibe kokoa ny sandan'ny derivative tanteraka, no ambony kokoa ny tahan'ny fiovan'ny soatoavin'ny asa, ary koa ny fiakaran'ny mari-pana amin'ny grafika fiasa.
Ohatra, eo ambanin'ny fepetran'ny rafitra fandrindrana Cartesian, ny sandan'ny derivative amin'ny teboka M(0,0) dia mitovy amin'ny 25 + midika izany fa amin'ny teboka iray, rehefa miova ny sandany miankavanana amin'ny singa mahazatra, sanda nitombo 25 isa mahazatra. Eo amin'ny tabilao dia toa fisondrotana be loatra ny sandany avy amin'ny teboka iray.
Ohatra iray hafa. Mitovy ny sanda derivative -0,1 midika hoe rehefa nafindra toerana isaky ny vondrona mahazatra iray, sanda mihena 0,1 monja ny singa mahazatra. Amin'izay fotoana izay ihany koa, eo amin'ny tabilaon'ny fiasa, dia afaka mahita fisondrotana midina kely isika. Ny fanaovana fanoharana amin'ny tendrombohitra, dia toy ny hoe midina miadana tsikelikely avy amin'ny tendrombohitra iray isika, tsy toy ny ohatra teo aloha, izay tsy maintsy nianika tampon-kavoana mideza :)
Noho izany, aorian'ny fanavahana ny asa amin'ny tsy mety ΠΈ , dia mamaritra ny filaharana 1er partial differential equations. Aorian'ny famaritana ny equations dia hahazo rafitra misy equation roa isika, amin'ny famahana izay ahafahantsika misafidy ny soatoavina toy izany amin'ny coefficients. ΠΈ , izay ny sandan'ny derivatives mifanaraka amin'izany amin'ny teboka nomena dia miova amin'ny vola kely dia kely, ary raha ny vahaolana analytika dia tsy miova mihitsy. Raha lazaina amin'ny teny hafa, ny fiasan'ny hadisoana amin'ny coefficient hita dia hahatratra farafahakeliny, satria ny sandan'ny derivatives amin'ireo teboka ireo dia mitovy amin'ny aotra.
Noho izany, araka ny fitsipiky ny fanavahana, ny ampahany derivative equation ny 1st lamina mikasika ny coefficient. dia handray ny endrika:
1Γ¨me commande partial derivative equation mikasika ny dia handray ny endrika:
Vokatr'izany dia nahazo rafitra fampitoviana izahay izay manana vahaolana famakafakana tsotra:
manomboka{equation*}
manomboka{cases}
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
farany {tranga}
end{equation*}
Alohan'ny hamahana ny equation, ndao apetraka mialoha, jereo raha marina ny fametahana, ary alaivo ny angona.
Fametrahana sy fandrafetana angona
Tsara homarihina fa noho ny zava-misy fa ho an'ny vahaolana analytika, ary avy eo ho an'ny gradient sy stochastic gradient fidinana, dia hampiasa ny fehezan-dalΓ na amin'ny karazany roa: mampiasa ny tranomboky. NomPy ary raha tsy mampiasa azy dia mila fandrafetana angon-drakitra mety (jereo ny code).
Fametahana angona sy kaody fanodinana
# ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ Π½Π°ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
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 '********************************************'
fijerena
Ankehitriny, rehefa avy nametraka ny angon-drakitra voalohany izahay, faharoa, nanamarina ny fahamarinan'ny fandefasana ary farany namolavola ny angon-drakitra, dia hanao ny sary voalohany izahay. Ny fomba ampiasaina matetika amin'izany dia pairlot trano famakiam-boky seaborn. Amin'ny ohatra asehontsika, noho ny isa voafetra dia tsy misy dikany ny fampiasana ny tranomboky seaborn. Hampiasa ny tranomboky mahazatra izahay matplotlib ary jereo fotsiny ny fiparitahana.
Kaody 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()
Chart No. 1 βFiankinanβny vola miditra aminβny volana aminβny taonaβ
Vahaolana analytique
Andao hampiasa ny fitaovana mahazatra indrindra amin'ny Python ary hamaha ny rafitry ny equations:
manomboka{equation*}
manomboka{cases}
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
farany {tranga}
end{equation*}
Araka ny fitondran'i Cramer ho hitantsika ny determinant ankapobeny, ary koa ny determinants amin'ny ary avy amin'i , aorian'izay, mizara ny determinant amin'ny amin'ny determinant ankapobeny - tadiavo ny coefficient , toy izany koa no ahitantsika ny coefficient .
Kaody vahaolana analytique
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠ°ΡΡΠ΅ΡΠ° ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² 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)
Izao no azonay:
Noho izany, hita ny sandan'ny coefficients, napetraka ny fitambaran'ny deviations efamira. Andao hanao tsipika mahitsy eo amin'ny histograma miparitaka mifanaraka amin'ny coefficient hita.
Kaody tsipika mihemotra
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠ°ΡΡΡΠ΅ΡΠ½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π²ΡΡΡΡΠΊΠΈ
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()
Tabilao No. 2 βValiny marina sy kajyβ
Azonao jerena ny tabilaon'ny fiviliana isam-bolana. Amin'ny tranga misy antsika dia tsy hahazo lanja azo ampiharina manan-danja avy amin'izany isika, fa hanome fahafaham-po ny fahaliananay momba ny fomba tsara ananan'ny fitovian'ny regression linear tsotra ny fiankinan'ny vola miditra amin'ny volana amin'ny taona.
Kaody tabilao fiviliana
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ Π² ΠΏΡΠΎΡΠ΅Π½ΡΠ°Ρ
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()
Tabilao No. 3 βFiviliana, %β
Tsy tonga lafatra, fa nahavita ny asantsika.
Andeha hanoratra asa izay, mba hamaritana ny coefficients ΠΈ mampiasa ny tranomboky NomPy, ny marimarina kokoa, dia hanoratra asa roa isika: ny iray mampiasa matrix pseudoinverse (tsy atolotra amin'ny fampiharana, satria sarotra ny kajy sy tsy miovaova ny dingana), ny iray mampiasa equation matrix.
Kaody vahaolana analytique (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
Andeha isika hampitaha ny fotoana lany amin'ny famaritana ny coefficients ΠΈ , mifanaraka amin'ny fomba 3 aseho.
Kaody ho an'ny kajy ny fotoana kajy
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)
Miaraka amin'ny angon-drakitra kely dia misy fiasa "voasoratra manokana" mivoaka mialoha, izay mahita ny coefficient mampiasa ny fomban'i Cramer.
Ankehitriny ianao dia afaka miroso amin'ny fomba hafa hahitana coefficients ΠΈ .
Gradient Descent
Voalohany, andeha hofaritana ny atao hoe gradient. Raha tsorina, ny gradient dia fizarana iray izay manondro ny lalan'ny fitomboana ambony indrindra amin'ny asa iray. Amin'ny fanoharana amin'ny fiakarana tendrombohitra, izay mitodika amin'ny gradient dia eo amin'ny toerana misy ny fiakarana mideza indrindra mankany an-tampon'ny tendrombohitra. Ny fampivelarana ny ohatra miaraka amin'ny tendrombohitra, dia tadidintsika fa raha ny marina dia mila ny fidinana faran'izay haingana indrindra isika mba hahatongavana any amin'ny tany iva haingana araka izay azo atao, izany hoe, ny kely indrindra - ny toerana izay tsy mitombo na mihena ny asa. Amin'ity tranga ity, ny derivative dia ho aotra. Noho izany, tsy mila gradient isika, fa antigradient. Mba hahitana ny antigradient dia mila ampitomboinao fotsiny ny gradient -1 (minus iray).
Andeha isika handinika ny zava-misy fa ny asa iray dia mety manana minima maromaro, ary rehefa nidina tao amin'ny iray amin'izy ireo amin'ny fampiasana ny algorithm atolotra etsy ambany, dia tsy hahita farany ambany kokoa isika, izay mety ho ambany noho ilay hita. Aleo miala sasatra fa tsy loza mitatao ho antsika izany! Amin'ny tranga misy antsika dia miatrika kely indrindra isika, hatramin'ny asantsika eo amin'ny grafika dia parabola mahazatra. Ary araka ny tokony ho fantatsika tsara amin'ny taranja matematika any an-tsekoly, ny parabola dia tsy manana afa-tsy iray farafahakeliny.
Rehefa avy nahita ny antony ilantsika gradient, ary koa ny gradient dia fizarana, izany hoe, vector miaraka amin'ny fandrindrana nomena, izay mitovy ny coefficients. ΠΈ afaka mampihatra ny gradient descent isika.
Alohan'ny hanombohana dia manoro hevitra aho hamaky fehezanteny vitsivitsy momba ny algorithm descent:
- Izahay dia mamaritra amin'ny fomba pseudo-random ny coordinates ny coefficients ΠΈ . Amin'ny ohatra ataontsika dia hamaritra ny coefficient manakaiky ny zero isika. Fanao mahazatra izany, fa ny tranga tsirairay dia mety manana ny fanaony manokana.
- Avy amin'ny coordinate esory ny sandan'ny derivative ampahany 1er amin'ny teboka . Noho izany, raha tsara ny derivative, dia mitombo ny asa. Noho izany, amin'ny fanesorana ny sandan'ny derivative dia hifindra amin'ny lalana mifanohitra amin'ny fitomboana isika, izany hoe mankany amin'ny fidinana. Raha ratsy ny derivative, dia mihena ny asa amin'io fotoana io ary amin'ny fanesorana ny sandan'ny derivative dia mizotra mankany amin'ny fidinana.
- Manao hetsika mitovy amin'izany miaraka amin'ny coordinate izahay : Esorina ny sandan'ny derivative ampahany amin'ny teboka .
- Mba tsy hitsambikina amin'ny kely indrindra ary manidina any amin'ny habakabaka lalina, dia ilaina ny mametraka ny haben'ny dingana mankany amin'ny fidinana. Amin'ny ankapobeny, azonao atao ny manoratra lahatsoratra iray manontolo momba ny fomba fametrahana ny dingana araka ny tokony ho izy sy ny fomba hanovana izany mandritra ny dingan'ny fidinana mba hampihenana ny vidin'ny kajy. Saingy ankehitriny dia manana asa hafa kely eo anoloantsika isika, ary hametraka ny haben'ny dingana amin'ny alΓ lan'ny fomba siantifika amin'ny "poke" na, araka ny filazan'izy ireo amin'ny fomba fiteny mahazatra, amin'ny fomba ara-tsiansa.
- Raha vao avy amin'ny coordinates nomena ΠΈ esory ny sandan'ny derivatives, mahazo coordinates vaovao ΠΈ . Manao ny dingana manaraka (fanesorana), efa avy amin'ny koordinate kajy. Ary noho izany dia manomboka hatrany hatrany ny tsingerina, mandra-pahatongan'ny convergence ilaina.
Rehetra! Ankehitriny dia vonona ny handeha hitady ny hantsana lalina indrindra amin'ny Reniranon'i Mariana izahay. Andeha isika hanomboka.
Kaody ho an'ny fidinana miandalana
# Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΡΡΠΊΠ° Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ 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
Nitsoraka tany amin'ny faran'ny Mariana Trench izahay ary hitanay ny sanda coefficient mitovy ΠΈ , izay no tena nampoizina.
Andeha isika hiroboka indray fa amin'ity indray mitoraka ity dia ho feno teknolojia hafa, dia ny tranomboky. NomPy.
Kaody ho an'ny fidinana miandalana (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
Sanda coefficient ΠΈ tsy azo ovaina.
Andeha hojerentsika ny fiovan'ny lesoka nandritra ny fidinana miandalana, izany hoe ny fiovan'ny fitambaran'ny fiviliana efamira isaky ny dingana.
Kaody ho an'ny fikojakojana ny fitambaran'ny fiviliana efamira
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()
Grapika No. 4 "Tanisan'ny fiviliana efamira mandritra ny fidinana miandalana"
Ao amin'ny grafika dia hitantsika fa amin'ny dingana tsirairay dia mihena ny fahadisoana, ary aorian'ny famerimberenana maromaro dia mahita tsipika saika mitsivalana.
Farany, andao tombantombana ny fahasamihafan'ny fotoana famonoana kaody:
Kaody mba hamaritana ny fotoana kajy gradient fidinana
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)
Angamba manao zavatra tsy mety isika, fa indray dia asa tsotra "soratra an-trano" izay tsy mampiasa ny tranomboky. NomPy mihoatra ny fotoana kajy ny asa iray mampiasa ny tranomboky NomPy.
Saingy tsy mijanona fotsiny isika, fa miroso amin'ny fandalinana fomba hafa mampientanentana hamahana ny fitovian'ny fihemorana tsipika tsotra. Mivory!
Fidinana gradient stochastic
Mba hahatakarana haingana ny fitsipiky ny fiasan'ny gradient stochastic dia tsara kokoa ny mamaritra ny maha-samihafa azy amin'ny fidinana gradient mahazatra. Isika, amin'ny resaka gradient descent, ao amin'ny equation derivatives amin'ny ΠΈ nampiasa ny fitambaran'ny sandan'ny endri-javatra rehetra sy ny valiny marina hita ao amin'ny santionany (izany hoe ny fitambaran'ny rehetra ΠΈ ). Amin'ny fidinan'ny gradient stochastic dia tsy hampiasa ny soatoavina rehetra misy ao amin'ny santionany isika, fa kosa, misafidy pseudo-kisendrasendra ilay antsoina hoe index santionany ary ampiasao ny sandany.
Ohatra, raha tapa-kevitra ny ho 3 (telo) ny fanondroana, dia raisinay ny soatoavina ΠΈ , avy eo dia manolo ny soatoavina ao amin'ny equations derivative isika ary mamaritra ny coordinates vaovao. Avy eo, rehefa avy namaritra ny koordinate, dia pseudo-kisendrasendra indray no mamaritra ny santionany fanondroana, manolo ny soatoavina mifanaraka amin'ny fanondroana amin'ny ampahany differential equations, ary mamaritra ny coordinates amin'ny fomba vaovao. ΠΈ Sns mandra-pahatongan'ny convergence ho maitso. Raha vao jerena dia toa tsy mety miasa mihitsy izany, fa marina izany. Marina fa tsara ny manamarika fa tsy mihena isaky ny dingana ny fahadisoana, fa azo antoka fa misy ny fironana.
Inona no tombony azo amin'ny fidinana gradient stochastic noho ny mahazatra? Raha tena lehibe ny haben'ny santionantsika ary refesina amin'ny soatoavina an'aliny, dia mora kokoa ny manodina, ohatra, ny an'arivony amin'izy ireo, fa tsy ny santionany manontolo. Eo no miditra an-tsehatra ny fidinana gradient stochastic. Amin'ny tranga misy antsika, mazava ho azy, tsy ho tsikaritray ny fahasamihafana.
Andeha hojerentsika ny kaody.
Kaody ho an'ny gradient 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])
Mijery tsara ny coefficients isika ary manontany tena hoe "Ahoana no hahatongavan'izany?" Nahazo sanda coefficient hafa izahay ΠΈ . Angamba ny fidinan'ny gradient stochastic dia nahita masontsivana tsara indrindra ho an'ny equation? Indrisy fa tsia. Ampy ny mijery ny fitambaran'ny deviations efamira ary mahita fa miaraka amin'ny soatoavina vaovao ny coefficients dia lehibe kokoa ny fahadisoana. Tsy maika ho kivy izahay. Andao hanangana tabilaon'ny fiovan'ny fahadisoana.
Kaody amin'ny fandrafetana ny fitambaran'ny fiviliana efamira amin'ny fidinan'ny gradient stochastic
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()
Grapika No. 5 "Tanisan'ny fiviliana efamira mandritra ny fidinan'ny gradient stochastic"
Raha jerena ny fandaharam-potoana dia mandeha amin'ny toerany ny zava-drehetra ary ankehitriny dia hamboarintsika ny zava-drehetra.
Dia inona no nitranga? Toy izao no nitranga. Rehefa misafidy iray volana isika, dia ho an'ny volana voafantina no tadiavin'ny algorithm mba hampihenana ny fahadisoana amin'ny kajy ny vola miditra. Avy eo dia mifidy volana iray hafa isika ary mamerina ny kajy, fa mampihena ny fahadisoana amin'ny volana faharoa voafantina. Tsarovy izao fa ny roa volana voalohany dia mivily be amin'ny tsipika amin'ny fitovian'ny regression linear tsotra. Midika izany fa rehefa voafantina ny iray amin'ireo roa volana ireo, amin'ny fampihenana ny hadisoan'ny tsirairay amin'izy ireo, ny algorithm ataontsika dia mampitombo be ny fahadisoana ho an'ny santionany manontolo. Inona Γ ry no hatao? Tsotra ny valiny: mila mampihena ny dingana fidinana ianao. Rehefa dinihina tokoa, amin'ny alalan'ny fampihenana ny dingana nidina, ny fahadisoana ihany koa ny hitsahatra "mitsambikina" miakatra sy midina. Na ny marimarina kokoa, ny fahadisoana "mitsambikina" dia tsy hijanona, fa tsy hanao izany haingana :) Andeha hojerentsika.
Kaody hampandehanana SGD miaraka amin'ny fisondrotana kely kokoa
# Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ, ΡΠΌΠ΅Π½ΡΡΠΈΠ² ΡΠ°Π³ Π² 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()
Grapika No. 6 "Tanisan'ny fiviliana efamira mandritra ny fidinan'ny gradient stochastic (80 arivo dingana)"
Nihatsara ny coefficients, saingy mbola tsy tonga lafatra. Hypothetically dia azo ahitsy amin'ity fomba ity. Mifidy isika, ohatra, ao anatin'ny 1000 iterations farany ny sandan'ny coefficient izay nanaovana ny fahadisoana kely indrindra. Na izany aza, noho izany dia tsy maintsy manoratra ny soatoavin'ny coefficients ihany koa isika. Tsy hanao anβizany izahay fa aleo mijery ny fandaharam-potoana. Toa milamina ary toa mihena mitovy ny lesoka. Raha ny marina dia tsy marina izany. Andeha hojerentsika ny 1000 voalohany ary ampitahao amin'ny farany.
Kaody ho an'ny tabilao SGD (dingana 1000 voalohany)
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()
Grapika No. 7 βTombananβny fivilian-dalana efamira SGD (dingana 1000 voalohany)β
Grapika No. 8 βTanisan'ny fivilian-dalana efamira SGD (dingana 1000 farany)β
Eo am-piandohan'ny fidinana dia hitanay ny fihenan'ny hadisoana sy ny fihenan'ny haavony. Ao amin'ny famerimberenana farany dia hitantsika fa ny fahadisoana dia mandeha manodidina ny sandan'ny 1,475 ary amin'ny fotoana sasany dia mitovy amin'io sanda tsara indrindra io, fa avy eo dia mbola miakatra ... Averiko indray, azonao atao ny manoratra ny soatoavin'ny coefficients ΠΈ , ary fidio ireo izay kely indrindra ny fahadisoana. Na izany aza, nanana olana lehibe kokoa izahay: tsy maintsy nanao dingana 80 arivo izahay (jereo ny kaody) mba hahazoana ny soatoavina manakaiky ny tsara indrindra. Ary izany dia efa mifanohitra amin'ny hevitra momba ny fitsitsiana ny fotoana kajy miaraka amin'ny fidinana gradient stochastic mifandraika amin'ny fidinana gradient. Inona no azo ahitsy sy hatsaraina? Tsy sarotra ny manamarika fa amin'ny famerimberenana voalohany dia midina am-pahatokiana isika ary noho izany dia tokony handao dingana lehibe amin'ny famerenana voalohany isika ary hampihena ny dingana rehefa mandroso isika. Tsy hanao izany isika ato amin'ity lahatsoratra ity - efa ela loatra. Ireo izay maniry dia afaka mieritreritra samirery ny fomba hanaovana izany, tsy sarotra izany :)
Andeha isika hanao fidinana gradient stochastic amin'ny fampiasana ny tranomboky NomPy (ary aoka isika tsy ho tafintohina amin'ireo vato izay nofantarintsika teo aloha)
Kaody ho an'ny fidinana gradient Stochastic (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
Ny soatoavina dia saika mitovy amin'ny rehefa midina tsy mampiasa NomPy. Lojika anefa izany.
Andeha hojerentsika hoe hafiriana ny fidinan'ny gradient stochastic.
Code hamaritana ny fotoana kajy SGD (80 arivo dingana)
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)
Arakaraka ny lavitry ny ala, ny maizina kokoa ny rahona: indray, ny rΓ΄lΓ΄jia "nosoratan'ny tena" dia mampiseho ny vokatra tsara indrindra. Izany rehetra izany dia manondro fa tsy maintsy misy fomba an-kolaka kokoa hampiasana ny tranomboky NomPy, izay tena manafaingana ny asa kajy. Ato amin'ity lahatsoratra ity dia tsy hianatra momba azy ireo isika. Hisy zavatra hoeritreretina amin'ny fotoana malalaka :)
mamintina
Alohan'ny hamintinana dia te-hamaly fanontaniana izay azo inoana fa avy amin'ny mpamaky malalantsika aho. Nahoana, raha ny marina, ny "fampijaliana" toy izany miaraka amin'ny fidinana, nahoana isika no mila mandeha miakatra sy midina ny tendrombohitra (midina ny ankamaroany) mba hahitana ny tany iva sarobidy, raha manana fitaovana mahery vaika sy tsotra toy izany isika, ao amin'ny endrika vahaolana famakafakana, izay mandefa antsika avy hatrany mankany amin'ny toerana marina?
Ny valin'io fanontaniana io dia mipetraka eny ambony. Ankehitriny isika dia nijery ohatra iray tena tsotra, izay misy ny valiny marina miankina amin'ny famantarana iray . Tsy hitanao matetika izany eo amin'ny fiainana, ka alao sary an-tsaina hoe manana famantarana 2, 30, 50 na mihoatra isika. Andao ampiana an'arivony, na an'aliny mihitsy aza ny soatoavina ho an'ny toetra tsirairay. Amin'ity tranga ity, ny vahaolana famakafakana dia mety tsy hahazaka ny fitsapana ary tsy hahomby. Ho setrin'izany, ny fidinan'ny gradient sy ny fiovaovany dia hahatonga antsika hanakaiky kokoa ny tanjona - ny kely indrindra amin'ny asa. Ary aza manahy momba ny hafainganam-pandeha - mety hojerentsika ny fomba ahafahantsika mametraka sy mifehy ny halavan'ny dingana (izany hoe ny hafainganam-pandeha).
Ary izao ny tena famintinana fohy.
Voalohany indrindra, manantena aho fa ny fitaovana aseho ao amin'ny lahatsoratra dia hanampy amin'ny fanombohana ny "siantifika data" amin'ny fahatakarana ny fomba hamahana ny fitovian-jotra tsipika tsotra (fa tsy fotsiny).
Faharoa, nijery fomba maro hamahana ny equation izahay. Amin'izao fotoana izao, arakaraka ny toe-javatra, dia afaka misafidy ny iray izay mety indrindra hamahana ny olana.
Fahatelo, hitanay ny tanjaky ny fandrindrana fanampiny, izany hoe ny halavan'ny dingana gradient. Tsy azo odian-tsy hita io paramètre io. Araka ny voalaza etsy ambony, mba hampihenana ny vidin'ny kajy dia tokony hovana ny halavan'ny dingana mandritra ny fidinana.
Fahefatra, amin'ny tranga misy antsika, ny fiasa "soratra an-trano" dia mampiseho ny vokatra tsara indrindra amin'ny kajy. Izany angamba dia noho ny tsy fampiasana ny fahaiza-manaon'ny tranomboky NomPy. Saingy na izany na tsy izany, ny fehin-kevitra manaraka dia milaza ny tenany. Amin'ny lafiny iray, indraindray dia ilaina ny manontany hevitra miorina, ary amin'ny lafiny iray, dia tsy mendrika ny hanasarotra ny zava-drehetra - ny mifanohitra amin'izany, indraindray ny fomba tsotra kokoa hamahana olana dia mahomby kokoa. Ary satria ny tanjonay dia ny hamakafaka fomba telo amin'ny famahana ny fitovian'ny tsipika tsotra, dia ampy ho anay ny fampiasana ny asa "sorat-tena".
Literatiora (na zavatra toy izany)
1. Fihemorana tsipika
2. Fomba faran'izay kely indrindra
3. Derivative
4. Gradient
5. Fidina miandalana
6. Tranomboky NumPy