Gihisgotan sa artikulo ang daghang mga paagi aron mahibal-an ang equation sa matematika sa usa ka yano (pares) nga linya sa pagbag-o.
Ang tanan nga mga pamaagi sa pagsulbad sa equation nga gihisgutan dinhi gibase sa pinakagamay nga squares method. Atong itudlo ang mga pamaagi sama sa mosunod:
- Analitikal nga solusyon
- Gradient nga Descent
- Stochastic gradient nga pagkanaog
Alang sa matag pamaagi sa pagsulbad sa equation sa usa ka tul-id nga linya, ang artikulo naghatag lainlaing mga gimbuhaton, nga kadaghanan gibahin sa mga gisulat nga wala gigamit ang librarya. numpy ug kadtong naggamit sa mga kalkulasyon numpy. Gituohan nga ang batid nga paggamit numpy makapakunhod sa gasto sa pag-compute.
Ang tanang code nga gihatag sa artikulo gisulat sa pinulongan sawa sa 2.7 gamit Notebook ni Jupiter. Gi-post ang source code ug file nga adunay sample data
Ang artikulo mas gitumong sa mga magsusugod ug sa mga anam-anam na nga nagsugod sa pag-master sa pagtuon sa usa ka lapad kaayo nga seksyon sa artificial intelligence - machine learning.
Sa pag-ilustrar sa materyal, naggamit kami ug yano kaayong pananglitan.
Pananglitan nga mga kondisyon
Kami adunay lima ka mga kantidad nga nagpaila sa pagsalig Y gikan sa X (Talaan Num. 1):
Talaan Num. 1 "Pananglitan nga mga kondisyon"
Atong hunahunaon nga ang mga mithi mao ang bulan sa tuig, ug - kita karong bulana. Sa laing pagkasulti, ang kita nagdepende sa bulan sa tuig, ug - ang bugtong timaan diin nagdepende ang kita.
Ang pananglitan mao ang ingon-ingon, gikan sa punto sa pagtan-aw sa kondisyon nga pagsalig sa kita sa bulan sa tuig, ug gikan sa punto sa pagtan-aw sa gidaghanon sa mga kantidad - adunay gamay ra niini. Bisan pa, ang ingon nga pagpayano magpaposible, ingon sa ilang giingon, nga ipasabut, dili kanunay nga dali, ang materyal nga gisagol sa mga nagsugod. Ug usab ang kayano sa mga numero magtugot sa mga gusto nga masulbad ang panig-ingnan sa papel nga walaβy daghang gasto sa pagtrabaho.
Atong hunahunaon nga ang pagsalig nga gihatag sa panig-ingnan mahimong gibanabana nga maayo sa matematika nga equation sa usa ka yano (pares) nga linya sa pagbag-o sa porma:
diin mao ang bulan diin nadawat ang kita, - kita nga katumbas sa bulan, ΠΈ mao ang mga regression coefficient sa gibanabana nga linya.
Matikdi nga ang coefficient sagad gitawag nga bakilid o gradient sa gibanabana nga linya; nagrepresentar sa kantidad diin ang kon kini mausab .
Dayag nga, ang among tahas sa pananglitan mao ang pagpili sa ingon nga mga coefficient sa equation ΠΈ , diin ang mga pagtipas sa among gikalkula nga mga kantidad sa kita sa bulan gikan sa tinuod nga mga tubag, i.e. ang mga kantidad nga gipresentar sa sample gamay ra.
Labing gamay nga square nga pamaagi
Sumala sa pinakagamay nga pamaagi sa mga kwadro, ang pagtipas kinahanglang kalkulahon pinaagi sa pagkuwadrado niini. Kini nga teknik nagtugot kanimo sa paglikay sa us aka pagkansela sa mga pagtipas kung sila adunay kaatbang nga mga timailhan. Pananglitan, kung sa usa ka kaso, ang pagtipas mao +5 (dugang lima), ug sa lain -5 (minus lima), unya ang sumada sa mga pagtipas magkansela sa usag usa ug mokabat sa 0 (zero). Posible nga dili kuwadrado ang pagtipas, apan gamiton ang kabtangan sa modulus ug unya ang tanan nga mga pagtipas mahimong positibo ug magtigum. Dili kami maghisgot niini nga punto sa detalye, apan gipakita lamang nga alang sa kasayon ββββsa mga kalkulasyon, naandan nga i-square ang deviation.
Kini ang hitsura sa pormula diin atong mahibal-an ang labing gamay nga kantidad sa mga squared deviation (mga sayup):
diin usa ka function sa pagbanabana sa tinuod nga mga tubag (nga mao, ang kita nga among gikalkula),
mao ang tinuod nga mga tubag (kita nga gihatag sa sample),
mao ang sample index (gidaghanon sa bulan diin ang pagtipas determinado)
Atong ilahi ang function, ipasabot ang partial differential equation, ug andam nga mopadayon sa analytical solution. Apan una, magkuha kita usa ka mubo nga ekskursiyon bahin sa kung unsa ang pagkalainlain ug hinumdomi ang geometric nga kahulugan sa gigikanan.
Pagkalainlain
Ang pagkalainlain mao ang operasyon sa pagpangita sa gigikanan sa usa ka function.
Para sa unsa ang derivative? Ang derivative sa usa ka function nagpaila sa rate sa pagbag-o sa function ug nagsulti kanato sa direksyon niini. Kung ang derivative sa usa ka punto positibo, nan ang function modaghan; kung dili, ang function mokunhod. Ug kon mas dako ang bili sa absolute derivative, mas taas ang rate sa kausaban sa function values, ingon man ang steeper nga slope sa function graph.
Pananglitan, ubos sa mga kondisyon sa Cartesian coordinate system, ang bili sa derivative sa punto M(0,0) katumbas sa + 25 nagpasabot nga sa usa ka gihatag nga punto, kung ang kantidad gibalhin sa tuo pinaagi sa usa ka naandan nga yunit, bili nagdugang sa 25 nga naandan nga mga yunit. Sa graph kini morag usa ka taas nga pagtaas sa mga kantidad gikan sa gihatag nga punto.
Laing pananglitan. Ang derivative nga bili managsama -0,1 nagpasabot nga sa dihang nabakwit kada usa ka conventional unit, value mikunhod lamang sa 0,1 conventional unit. Sa samang higayon, sa graph sa function, atong maobserbahan ang usa ka halos dili mamatikdan nga paubos nga bakilid. Ang pagdrowing og analohiya sa usa ka bukid, sama ra nga hinay kaayo kita nga nanaog sa usa ka malumo nga bakilid gikan sa usa ka bukid, dili sama sa miaging pananglitan, diin kinahanglan namon nga mosaka sa labi ka titip nga mga taluktok :)
Busa, human sa paglainlain sa function pinaagi sa mga kalisud ΠΈ , among gihubit ang 1st order partial differential equation. Human matino ang mga equation, makadawat kita og usa ka sistema sa duha ka equation, pinaagi sa pagsulbad diin kita makahimo sa pagpili sa maong mga bili sa mga coefficients ΠΈ , diin ang mga kantidad sa katugbang nga mga gigikanan sa gihatag nga mga punto nagbag-o sa usa ka gamay kaayo nga kantidad, ug sa kaso sa usa ka analitikal nga solusyon wala magbag-o. Sa ato pa, ang error function sa nakit-an nga mga coefficient moabot sa labing gamay, tungod kay ang mga kantidad sa partial derivatives sa kini nga mga punto mahimong katumbas sa zero.
Busa, sumala sa mga lagda sa pagkalahi, ang partial derivative equation sa 1st order nga may kalabotan sa coefficient kuhaon ang porma:
1st order partial derivative equation may kalabotan sa kuhaon ang porma:
Ingon usa ka sangputanan, nakadawat kami usa ka sistema sa mga equation nga adunay usa ka yano nga solusyon sa analitikal:
magsugod{equation*}
magsugod{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
katapusan {mga kaso}
katapusan{equation*}
Sa dili pa sulbaron ang equation, i-preload nato, susiha nga husto ang loading, ug i-format ang datos.
Pag-load ug pag-format sa datos
Kini kinahanglan nga matikdan nga tungod sa kamatuoran nga alang sa analytical nga solusyon, ug sunod alang sa gradient ug stochastic gradient descent, atong gamiton ang code sa duha ka mga kalainan: gamit ang librarya. numpy ug sa walay paggamit niini, nan kinahanglan nato ang tukma nga pag-format sa datos (tan-awa ang code).
Data loading ug pagproseso code
# ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ Π½Π°ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
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 '********************************************'
Paglaraw
Karon, pagkahuman namo, una, nag-load sa datos, ikaduha, gisusi ang pagkahusto sa pagkarga ug sa katapusan na-format ang datos, among ipahigayon ang unang visualization. Ang pamaagi nga sagad gigamit alang niini mao ang pairplot mga librarya Kadagatan sa dagat. Sa among pananglitan, tungod sa limitado nga mga numero, walaβy kapuslanan ang paggamit sa librarya Kadagatan sa dagat. Atong gamiton ang regular nga librarya matplotlib ug tan-awa lang ang scatterplot.
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()
Chart Num. 1 "Pagdepende sa kita sa bulan sa tuig"
Analitikal nga solusyon
Atong gamiton ang labing komon nga mga himan sa python ug pagsulbad sa sistema sa mga equation:
magsugod{equation*}
magsugod{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
katapusan {mga kaso}
katapusan{equation*}
Sumala sa lagda ni Cramer atong makit-an ang kinatibuk-ang determinant, ingon man ang mga determinant pinaagi sa ug sa , pagkahuman niini, gibahin ang determinant pinaagi sa sa kinatibuk-ang determinant - pangitaa ang coefficient , sa susama atong makita ang coefficient .
Analytical nga solusyon code
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠ°ΡΡΠ΅ΡΠ° ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² 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)
Ania ang among nakuha:
Mao nga, ang mga kantidad sa mga coefficient nakit-an, ang kantidad sa mga squared deviations natukod. Magdrowing kita og tul-id nga linya sa scattering histogram subay sa nakit-an nga coefficients.
Kodigo sa linya sa pagbag-o
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠ°ΡΡΡΠ΅ΡΠ½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π²ΡΡΡΡΠΊΠΈ
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()
Chart Num. 2 βHusto ug kalkulado nga mga tubagβ
Mahimo nimong tan-awon ang deviation graph alang sa matag bulan. Sa among kaso, dili kami makakuha og bisan unsang mahinungdanong praktikal nga bili gikan niini, apan among tagbawon ang among pagkamausisaon mahitungod sa unsa ka maayo ang yano nga linear regression equation nga nagpaila sa pagsalig sa kita sa bulan sa tuig.
Deviation chart code
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ Π² ΠΏΡΠΎΡΠ΅Π½ΡΠ°Ρ
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()
Tsart Num. 3 βMga Pagtipas, %β
Dili perpekto, apan nahuman namo ang among buluhaton.
Atong isulat ang usa ka function nga, sa pagtino sa mga coefficients ΠΈ naggamit sa librarya numpy, sa mas tukma, kita mosulat sa duha ka mga function: ang usa gamit ang usa ka pseudoinverse matrix (dili girekomendar sa praktis, tungod kay ang proseso mao ang computationally komplikado ug dili lig-on), ang usa sa paggamit sa usa ka matrix equation.
Analytical Solution Code (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
Atong itandi ang oras nga gigugol sa pagtino sa mga coefficient ΠΈ , uyon sa 3 nga gipresentar nga mga pamaagi.
Code alang sa pagkalkula sa oras sa pagkalkula
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)
Uban sa gamay nga kantidad sa datos, usa ka "self-written" nga function ang mogawas sa unahan, nga nakit-an ang mga coefficient gamit ang pamaagi ni Cramer.
Karon mahimo ka nga magpadayon sa ubang mga paagi aron makit-an ang mga coefficient ΠΈ .
Gradient nga Descent
Una, atong ipasabut kung unsa ang gradient. Sa yano nga pagkasulti, ang gradient usa ka bahin nga nagpaila sa direksyon sa labing taas nga pagtubo sa usa ka function. Sa analohiya sa pagsaka sa usa ka bukid, diin ang gradient nag-atubang kung diin ang pinakataas nga pagsaka sa tumoy sa bukid. Pagpalambo sa panig-ingnan uban sa bukid, atong nahinumduman nga sa pagkatinuod kita nagkinahanglan sa labing titip nga paglugsong aron sa pagkab-ot sa ubos nga yuta sa labing madali, nga mao, ang minimum - ang dapit diin ang function dili sa pagdugang o pagkunhod. Niini nga punto ang derivative mahimong katumbas sa zero. Busa, wala kita magkinahanglan og gradient, apan usa ka antigradient. Aron makit-an ang antigradient kinahanglan nimo nga padaghanon ang gradient sa -1 (minus usa).
Atong hatagan ug pagtagad ang kamatuoran nga ang usa ka function mahimong adunay daghang minima, ug sa pagkanaog sa usa niini gamit ang algorithm nga gisugyot sa ubos, dili na nato makit-an ang laing minimum, nga mahimong mas ubos kaysa sa nakit-an. Relax ta, dili kini hulga kanato! Sa among kaso nag-atubang kami sa usa ka minimum, tungod kay ang among gimbuhaton sa graph usa ka regular nga parabola. Ug ingon nga nahibal-an naton tanan gikan sa kurso sa matematika sa eskuylahan, ang parabola adunay usa ra ka minimum.
Pagkahuman nahibal-an namon kung ngano nga kinahanglan namon ang usa ka gradient, ug usab nga ang gradient usa ka bahin, nga mao, usa ka vector nga adunay gihatag nga mga coordinate, nga parehas nga mga coefficient. ΠΈ mahimo natong ipatuman ang gradient descent.
Sa dili pa magsugod, gisugyot ko nga basahon lang ang pipila ka mga tudling-pulong bahin sa algorithm sa pagkunsad:
- Atong determinado sa usa ka pseudo-random nga paagi ang mga koordinasyon sa mga coefficient ΠΈ . Sa among pananglitan, among mahibal-an ang mga coefficient duol sa zero. Kini usa ka komon nga praktis, apan ang matag kaso mahimong adunay kaugalingong praktis.
- Gikan sa coordinate ibawas ang bili sa 1st order partial derivative sa punto . Busa, kung ang derivative positibo, nan ang function nagdugang. Busa, pinaagi sa pagkunhod sa bili sa derivative, kita molihok sa atbang nga direksyon sa pagtubo, nga mao, sa direksyon sa kagikan. Kung negatibo ang derivative, nan ang function sa kini nga punto mikunhod ug pinaagi sa pagkunhod sa kantidad sa derivative kita molihok sa direksyon sa pagkanaog.
- Naghimo kami og susama nga operasyon sa coordinate : ibawas ang bili sa partial derivative sa punto .
- Aron dili molukso sa labing gamay ug molupad sa lawom nga wanang, kinahanglan nga ibutang ang gidak-on sa lakang sa direksyon sa pagkanaog. Sa kinatibuk-an, mahimo nimong isulat ang usa ka tibuuk nga artikulo kung giunsa pagtakda ang lakang sa husto ug kung giunsa kini pagbag-o sa proseso sa pagkunsad aron makunhuran ang gasto sa pagkalkula. Apan karon kami adunay usa ka gamay nga lahi nga buluhaton sa unahan, ug among i-establisar ang gidak-on sa lakang gamit ang siyentipikong pamaagi sa "poke" o, ingon sa giingon nila sa sagad nga parlance, empirically.
- Sa higayon nga kita gikan sa gihatag nga mga coordinate ΠΈ ibawas ang mga kantidad sa mga derivatives, makakuha kami bag-ong mga coordinate ΠΈ . Gikuha namon ang sunod nga lakang (pagkuha), gikan na sa kalkulado nga mga koordinasyon. Ug mao nga ang siklo magsugod pag-usab ug pag-usab, hangtud nga ang gikinahanglan nga convergence makab-ot.
Tanan! Karon andam na kami nga mangita sa kinahiladman nga bung-aw sa Mariana Trench. Magsugod na ta.
Code para sa gradient descent
# Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΡΡΠΊΠ° Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ 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
Nagdive kami sa pinakailawom sa Mariana Trench ug didto among nakit-an ang tanan nga parehas nga coefficient values ΠΈ , nga mao gayod ang gipaabot.
Mag-dive na sab ta, karong panahona, ang atong sakyanan sa lawom nga dagat mapuno sa ubang mga teknolohiya, nga mao ang librarya. numpy.
Code para sa gradient descent (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
Mga kantidad sa coefficient ΠΈ dili mausab.
Atong tan-awon kung giunsa ang pagbag-o sa sayup sa panahon sa gradient descent, nga mao, kung giunsa pagbag-o ang kantidad sa mga square deviation sa matag lakang.
Kodigo alang sa paglaraw sa mga kantidad sa mga squared deviation
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()
Graph Num. 4 "Sum sa mga squared deviation atol sa gradient descent"
Sa graph atong makita nga sa matag lakang ang kasaypanan mikunhod, ug human sa usa ka piho nga gidaghanon sa mga pagbalik-balik atong makita ang halos pinahigda nga linya.
Sa katapusan, atong banabanaon ang kalainan sa oras sa pagpatuman sa code:
Kodigo aron mahibal-an ang oras sa pagkalkula sa gradient descent
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)
Tingali nakahimo kita og usa ka butang nga sayup, apan pag-usab kini usa ka yano nga "gisulat sa balay" nga function nga wala mogamit sa librarya numpy milabaw sa oras sa pagkalkula sa usa ka function gamit ang library numpy.
Apan wala kami nagbarog, apan nagpadayon sa pagtuon sa laing makapahinam nga paagi aron masulbad ang yano nga linear regression equation. Magkita mi!
Stochastic gradient nga pagkanaog
Aron dali nga masabtan ang prinsipyo sa operasyon sa stochastic gradient descent, mas maayo nga mahibal-an ang mga kalainan niini gikan sa ordinaryo nga gradient descent. Kami, sa kaso sa gradient descent, sa mga equation sa derivatives sa ΠΈ gigamit ang mga kantidad sa mga kantidad sa tanan nga mga bahin ug tinuod nga mga tubag nga anaa sa sample (nga mao, ang mga sumada sa tanan ΠΈ ). Sa stochastic gradient descent, dili namo gamiton ang tanang values ββnga naa sa sample, but instead, pseudo-randomly pilia ang gitawag nga sample index ug gamiton ang values ββniini.
Pananglitan, kung ang indeks determinado nga mahimong numero 3 (tulo), nan atong kuhaon ang mga kantidad ΠΈ , unya gipulihan namon ang mga kantidad sa mga derivative equation ug gitino ang bag-ong mga coordinate. Pagkahuman, sa pagtino sa mga koordinasyon, kami usab pseudo-random nga nagtino sa sample index, gipulihan ang mga kantidad nga katumbas sa indeks sa partial differential equation, ug gitino ang mga coordinate sa bag-ong paagi. ΠΈ ug uban pa. hangtud nga ang convergence mahimong berde. Sa una nga pagtan-aw, ingon og dili kini mahimo, apan kini mahimo. Tinuod nga angay hinumdoman nga ang sayup dili mokunhod sa matag lakang, apan adunay usa ka kalagmitan.
Unsa ang mga bentaha sa stochastic gradient descent kaysa sa naandan? Kung ang among sample nga gidak-on dako kaayo ug gisukod sa napulo ka libo nga mga kantidad, nan kini mas sayon ββsa pagproseso, ingnon ta, usa ka random nga libo niini, kay sa tibuok sample. Dinhi diin ang stochastic gradient descent moabut sa pagdula. Sa among kahimtang, siyempre, dili kami makamatikod sa daghang kalainan.
Atong tan-awon ang code.
Code para sa stochastic gradient descent
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠΎΡ
.Π³ΡΠ°Π΄.ΡΠ°Π³Π°
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])
Gitan-aw namon pag-ayo ang mga coefficient ug nahibal-an namon ang among kaugalingon nga gipangutana ang pangutana nga "Sa unsang paagi mahimo kini?" Nakuha namon ang ubang mga kantidad sa coefficient ΠΈ . Tingali ang stochastic gradient descent nakit-an ang labi ka maayo nga mga parameter alang sa equation? Ikasubo nga dili. Igo na ang pagtan-aw sa kadaghanon sa squared deviations ug tan-awa nga sa bag-ong mga kantidad sa mga coefficient, ang sayup mas dako. Wala mi magdali nga mawad-ag paglaom. Magbuhat ta ug graph sa pagbag-o sa sayup.
Kodigo alang sa paglaraw sa sumada sa mga squared deviation sa stochastic gradient descent
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()
Graph No. 5 "Sum sa mga squared deviation atol sa stochastic gradient descent"
Sa pagtan-aw sa eskedyul, ang tanan nahulog sa lugar ug karon atong ayuhon ang tanan.
Busa unsay nahitabo? Ang mosunod nahitabo. Kung kita random nga mopili sa usa ka bulan, nan kini alang sa pinili nga bulan nga ang atong algorithm nagtinguha sa pagpakunhod sa sayup sa pagkalkula sa kita. Dayon mipili kami og laing bulan ug balikon ang kalkulasyon, apan among gipakunhod ang sayop alang sa ikaduhang pinili nga bulan. Karon hinumdomi nga ang unang duha ka bulan nagtipas pag-ayo gikan sa linya sa yano nga linear regression equation. Kini nagpasabot nga kung ang bisan unsa niining duha ka bulan gipili, pinaagi sa pagkunhod sa sayup sa matag usa niini, ang among algorithm seryoso nga nagdugang sa sayup alang sa tibuok sample. Busa unsa ang buhaton? Ang tubag yano ra: kinahanglan nimo nga pakunhuran ang lakang sa pagpaubos. Pagkahuman, pinaagi sa pagkunhod sa lakang sa pagkanaog, ang sayup mohunong usab sa "paglukso" pataas ug paubos. O hinoon, ang "paglukso" nga sayup dili mohunong, apan dili kini mahimo nga dali :) Atong susihon.
Kodigo sa pagpadagan sa SGD nga adunay gagmay nga mga pag-uswag
# Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ, ΡΠΌΠ΅Π½ΡΡΠΈΠ² ΡΠ°Π³ Π² 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()
Graph Num. 6 "Sum sa mga squared deviations sa panahon sa stochastic gradient descent (80 thousand steps)"
Ang mga coefficient miuswag, apan dili gihapon maayo. Sa hypothetically, kini mahimong matul-id niining paagiha. Gipili namon, pananglitan, sa katapusan nga 1000 nga mga pag-uli ang mga kantidad sa mga coefficient diin nahimo ang labing gamay nga sayup. Tinuod, alang niini kinahanglan usab naton isulat ang mga kantidad sa mga coefficient mismo. Dili namo kini buhaton, apan hatagan pagtagad ang iskedyul. Kini tan-awon nga hapsay ug ang sayup ingon nga pagkunhod parehas. Sa pagkatinuod kini dili tinuod. Atong tan-awon ang una nga 1000 nga mga pag-uli ug itandi kini sa katapusan.
Code para sa SGD nga tsart (unang 1000 ka lakang)
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()
Graph Num. 7 "Sum sa squared deviations SGD (unang 1000 nga mga lakang)"
Graph No. 8 "Sum sa mga squared deviations SGD (katapusang 1000 nga mga lakang)"
Sa sinugdanan pa lang sa pagkanaog, atong naobserbahan ang medyo uniporme ug kusog nga pagkunhod sa sayop. Sa katapusan nga mga pag-uli, nakita namon nga ang sayup naglibot ug naglibot sa kantidad nga 1,475 ug sa pipila ka mga gutlo katumbas sa kini nga kamalaumon nga kantidad, apan pagkahuman mosaka pa kini ... Akong gisubli, mahimo nimong isulat ang mga kantidad sa mga coefficient ΠΈ , ug dayon pilia kadtong diin gamay ra ang sayup. Bisan pa, kami adunay usa ka labi ka grabe nga problema: kinahanglan namon nga mohimo og 80 ka libo nga mga lakang (tan-awa ang code) aron makuha ang mga kantidad nga hapit sa kamalaumon. Ug kini sukwahi na sa ideya sa pagtipig sa oras sa pagkalkula sa stochastic gradient descent nga may kalabotan sa gradient descent. Unsa ang matul-id ug mapauswag? Dili lisud nga mamatikdan nga sa unang mga pag-uli kita masaligon nga mopaubos ug, busa, kinahanglan nga magbilin kita og usa ka dako nga lakang sa unang mga pag-usab ug pagpakunhod sa lakang samtang kita nagpadayon. Dili namon kini buhaton sa kini nga artikulo - dugay na kaayo. Kadtong gusto makahunahuna sa ilang kaugalingon kung giunsa kini buhaton, dili kini lisud :)
Karon atong ipahigayon ang stochastic gradient descent gamit ang library numpy (ug dili ta mapandol sa mga bato nga atong giila sa sayo pa)
Code para sa Stochastic Gradient Descent (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
Ang mga kantidad nahimo nga hapit parehas sa kung kanus-a nga wala gigamit numpy. Apan, lohikal kini.
Atong hibal-an kung unsa ka dugay ang stochastic gradient nga pag-ubos.
Kodigo alang sa pagtino sa oras sa pagkalkula sa SGD (80 ka libo nga mga lakang)
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)
Ang dugang ngadto sa lasang, ang mas ngitngit nga mga panganod: pag-usab, ang "self-written" nga pormula nagpakita sa pinakamaayo nga resulta. Kining tanan nagsugyot nga kinahanglan nga adunay mas malalangon nga mga paagi sa paggamit sa librarya numpy, nga makapadali sa mga operasyon sa pagkalkula. Niini nga artikulo dili kita makakat-on mahitungod kanila. Adunay usa ka butang nga hunahunaon sa imong libre nga oras :)
Gipahayag namon
Sa wala pa ang pag-summarize, gusto nakong tubagon ang usa ka pangutana nga lagmit mitungha gikan sa among minahal nga magbabasa. Ngano, sa tinuud, ang ingon nga "torture" uban ang mga pagkanaog, ngano nga kinahanglan naton maglakaw pataas ug paubos sa bukid (kasagaran paubos) aron makit-an ang gipakabahandi nga kapatagan, kung naa sa atong mga kamot ang usa ka kusgan ug yano nga aparato, sa porma sa usa ka analitikal nga solusyon, nga diha-diha dayon nag-teleport kanato ngadto sa Tuo nga dapit?
Ang tubag niini nga pangutana anaa sa ibabaw. Karon atong gitan-aw ang usa ka yano kaayo nga pananglitan, diin ang tinuod nga tubag depende sa usa ka sign . Dili nimo kini makita kanunay sa kinabuhi, busa hunahunaa nga kita adunay 2, 30, 50 o daghan pa nga mga timailhan. Atong idugang kini nga linibo, o bisan napulo ka libo nga mga kantidad alang sa matag hiyas. Sa kini nga kaso, ang analitikal nga solusyon mahimong dili makasugakod sa pagsulay ug mapakyas. Sa baylo, ang gradient descent ug ang mga kalainan niini hinay-hinay apan sigurado nga magdala kanato nga mas duol sa tumong - ang minimum sa function. Ug ayaw kabalaka bahin sa katulin - tingali tan-awon namon ang mga paagi nga magtugot kanamo sa pagtakda ug pag-regulate sa gitas-on sa lakang (nga mao, katulin).
Ug karon ang aktuwal nga mubo nga summary.
Una, nanghinaut ko nga ang materyal nga gipresentar sa artikulo makatabang sa pagsugod sa "data scientists" sa pagsabut kung unsaon pagsulbad ang yano (ug dili lamang) mga linear regression equation.
Ikaduha, gitan-aw namon ang daghang mga paagi aron masulbad ang equation. Karon, depende sa sitwasyon, makapili ta sa labing haom sa pagsulbad sa problema.
Ikatulo, nakita namon ang gahum sa dugang nga mga setting, nga mao ang gradient descent step length. Kini nga parameter dili mapasagdan. Sama sa gihisgutan sa ibabaw, aron makunhuran ang gasto sa mga kalkulasyon, ang gitas-on sa lakang kinahanglan nga usbon sa panahon sa pagkunsad.
Ikaupat, sa among kaso, ang mga function nga "sinulat sa balay" nagpakita sa labing kaayo nga mga resulta sa oras alang sa mga kalkulasyon. Kini lagmit tungod sa dili labing propesyonal nga paggamit sa mga kapabilidad sa librarya numpy. Apan bisan pa niana, ang mosunod nga konklusyon nagsugyot sa iyang kaugalingon. Sa usa ka bahin, usahay takus nga pangutan-on ang natukod nga mga opinyon, ug sa laing bahin, dili kanunay angay nga komplikado ang tanan - sa kasukwahi, usahay ang usa ka yano nga paagi sa pagsulbad sa usa ka problema mas epektibo. Ug tungod kay ang among tumong mao ang pag-analisar sa tulo ka mga pamaagi sa pagsulbad sa usa ka simple nga linear regression equation, ang paggamit sa "self-written" functions igo na alang kanamo.
Literatura (o ingon niana)
1. Linear regression
2. Labing gamay nga mga kuwadrado nga pamaagi
3. Derivative
4. Gradient
5. Gradient nga pagkanaog
6. NumPy librarya