Mae'r erthygl yn trafod sawl ffordd o bennu hafaliad mathemategol llinell atchweliad syml (mewn parau).
Mae pob dull o ddatrys yr hafaliad a drafodir yma yn seiliedig ar y dull sgwariau lleiaf. Gadewch i ni nodi'r dulliau fel a ganlyn:
- Datrysiad dadansoddol
- Disgyniad Graddfa
- Disgyniad graddastig stochastig
Ar gyfer pob dull o ddatrys hafaliad llinell syth, mae'r erthygl yn darparu swyddogaethau amrywiol, sy'n cael eu rhannu'n bennaf i'r rhai sydd wedi'u hysgrifennu heb ddefnyddio'r llyfrgell nympy a'r rhai sy'n defnyddio ar gyfer cyfrifiadau nympy. Credir bod defnydd medrus nympy yn lleihau costau cyfrifiadurol.
Mae'r holl god a roddir yn yr erthygl wedi'i ysgrifennu yn yr iaith python 2.7 gan ddefnyddio Llyfr Nodiadau Jupyter. Mae'r cod ffynhonnell a'r ffeil gyda data sampl yn cael eu postio ymlaen
Mae'r erthygl wedi'i hanelu'n fwy at ddechreuwyr a'r rhai sydd eisoes wedi dechrau meistroli'r astudiaeth o adran eang iawn mewn deallusrwydd artiffisial - dysgu peiriant yn raddol.
I ddarlunio'r deunydd, rydym yn defnyddio enghraifft syml iawn.
Amodau enghreifftiol
Mae gennym bum gwerth sy'n nodweddu dibyniaeth Y o X (Tabl Rhif 1):
Tabl Rhif 1 βAmodau enghreifftiolβ
Byddwn yn cymryd yn ganiataol bod y gwerthoedd yw mis y flwyddyn, a - refeniw y mis hwn. Mewn geiriau eraill, mae refeniw yn dibynnu ar fis y flwyddyn, a - yr unig arwydd y mae refeniw yn dibynnu arno.
Mae'r enghraifft mor-felly, o safbwynt dibyniaeth amodol refeniw ar fis y flwyddyn, ac o safbwynt nifer y gwerthoedd - ychydig iawn ohonynt. Fodd bynnag, bydd symleiddio o'r fath yn ei gwneud hi'n bosibl, fel y dywedant, esbonio, nid bob amser yn rhwydd, y deunydd y mae dechreuwyr yn ei gymathu. A hefyd bydd symlrwydd y niferoedd yn caniatΓ‘u i'r rhai sy'n dymuno datrys yr enghraifft ar bapur heb gostau llafur sylweddol.
Gadewch i ni dybio y gellir brasamcanuβr ddibyniaeth a roddir yn yr enghraifft yn eithaf da gan hafaliad mathemategol llinell atchweliad syml (mewn parau) oβr ffurf:
lle yw'r mis y derbyniwyd y refeniw, - refeniw sy'n cyfateb i'r mis, ΠΈ yw cyfernodau atchweliad y llinell amcangyfrifedig.
Sylwch fod y cyfernod a elwir yn aml yn lethr neu raddiant y llinell amcangyfrifedig; yn cynrychioli y swm y mae'r pan fydd yn newid .
Yn amlwg, ein tasg yn yr enghraifft yw dewis cyfernodau o'r fath yn yr hafaliad ΠΈ , lle mae gwyriadau ein gwerthoedd refeniw cyfrifedig fesul mis oddi wrth y gwir atebion, h.y. bydd y gwerthoedd a gyflwynir yn y sampl yn fach iawn.
Dull lleiaf sgwΓ’r
Yn Γ΄l y dull sgwariau lleiaf, dylid cyfrifo'r gwyriad trwy ei sgwario. Mae'r dechneg hon yn eich galluogi i osgoi canslo gwyriadau ar y cyd os oes ganddynt arwyddion cyferbyniol. Er enghraifft, os mewn un achos, y gwyriad yw +5 (plus pump), ac yn y llall -5 (llai pump), yna bydd swm y gwyriadau yn canslo ei gilydd ac yn dod i 0 (sero). Mae'n bosibl peidio Γ’ sgwario'r gwyriad, ond defnyddio eiddo'r modwlws ac yna bydd yr holl wyriadau yn bositif ac yn cronni. Ni fyddwn yn canolbwyntio ar y pwynt hwn yn fanwl, ond yn syml yn nodi, er hwylustod cyfrifiadau, ei bod yn arferol sgwario'r gwyriad.
Dyma sut olwg sydd ar y fformiwla y byddwn yn ei defnyddio i bennuβr swm lleiaf o wyriadau sgwΓ’r (gwallau):
lle yn swyddogaeth brasamcan o atebion cywir (hynny yw, y refeniw a gyfrifwyd gennym),
yw'r gwir atebion (refeniw a ddarperir yn y sampl),
yw'r mynegai sampl (nifer y mis y pennir y gwyriad ynddo)
Gadewch i ni wahaniaethu'r swyddogaeth, diffinio'r hafaliadau gwahaniaethol rhannol, a bod yn barod i symud ymlaen i'r datrysiad dadansoddol. Ond yn gyntaf, gadewch i ni fynd ar daith fer i weld beth yw gwahaniaethu a chofio ystyr geometrig y deilliad.
Gwahaniaethu
Gwahaniaethu yw gweithrediad canfod deilliad ffwythiant.
Ar gyfer beth mae'r deilliad yn cael ei ddefnyddio? Mae deilliad ffwythiant yn nodweddu cyfradd newid y ffwythiant ac yn dweud wrthym ei gyfeiriad. Os yw'r deilliad ar bwynt penodol yn bositif, yna mae'r swyddogaeth yn cynyddu fel arall, mae'r swyddogaeth yn lleihau. A po fwyaf yw gwerth y deilliad absoliwt, yr uchaf yw cyfradd newid y gwerthoedd swyddogaeth, yn ogystal Γ’'r mwyaf serth yw llethr y graff swyddogaeth.
Er enghraifft, o dan amodau system gyfesurynnau Cartesaidd, mae gwerth y deilliad ar y pwynt M(0,0) yn hafal i +25 yn golygu, ar bwynt penodol, pan fydd y gwerth yn cael ei symud i'r dde gan uned gonfensiynol, gwerth cynnydd o 25 uned confensiynol. Ar y graff mae'n edrych fel cynnydd eithaf serth mewn gwerthoedd o bwynt penodol.
Enghraifft arall. Mae'r gwerth deilliadol yn gyfartal 0,1- yn golygu hynny pan fydd wedi'i ddadleoli fesul un uned gonfensiynol, gwerth yn gostwng dim ond 0,1 uned gonfensiynol. Ar yr un pryd, ar graff y swyddogaeth, gallwn arsylwi ar lethr i lawr prin amlwg. Gan dynnu cyfatebiaeth Γ’ mynydd, mae fel petaem yn araf iawn yn disgyn ar lethr ysgafn o fynydd, yn wahanol i'r enghraifft flaenorol, lle bu'n rhaid dringo copaon serth iawn :)
Felly, ar Γ΄l gwahaniaethu'r swyddogaeth gan groes ΠΈ , rydym yn diffinio hafaliadau gwahaniaethol rhannol gorchymyn 1af. Ar Γ΄l pennu'r hafaliadau, byddwn yn derbyn system o ddau hafaliad, trwy ddatrys y byddwn yn gallu dewis gwerthoedd o'r fath o'r cyfernodau ΠΈ , y mae gwerthoedd y deilliadau cyfatebol ar bwyntiau penodol yn newid o swm bach iawn, iawn, ac yn achos datrysiad dadansoddol nid ydynt yn newid o gwbl. Mewn geiriau eraill, bydd y swyddogaeth gwall yn y cyfernodau a ddarganfuwyd yn cyrraedd isafswm, gan y bydd gwerthoedd y deilliadau rhannol ar y pwyntiau hyn yn hafal i sero.
Felly, yn Γ΄l y rheolau gwahaniaethu, hafaliad deilliadol rhannol y gorchymyn 1af mewn perthynas Γ’'r cyfernod bydd ar y ffurf:
Hafaliad deilliadol rhannol trefn 1af mewn perthynas Γ’ bydd ar y ffurf:
O ganlyniad, cawsom system o hafaliadau sydd Γ’ datrysiad dadansoddol eithaf syml:
dechrau{ hafaliad*}
dechrau{achosion}
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
diwedd{achosion}
diwedd{ hafaliad*}
Cyn datrys yr hafaliad, gadewch i ni rag-lwytho, gwirio bod y llwytho yn gywir, a fformatio'r data.
Llwytho a fformatio data
Dylid nodi, oherwydd y ffaith, ar gyfer y datrysiad dadansoddol, ac wedi hynny ar gyfer disgyniad graddiant graddiant a stochastig, y byddwn yn defnyddio'r cod mewn dau amrywiad: defnyddio'r llyfrgell nympy a heb ei ddefnyddio, yna bydd angen fformatio data priodol arnom (gweler y cod).
Cod llwytho a phrosesu data
# ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ Π½Π°ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
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 '********************************************'
Delweddu
Nawr, ar Γ΄l i ni, yn gyntaf, lwytho'r data, yn ail, gwirio cywirdeb y llwytho ac yn olaf fformatio'r data, byddwn yn cynnal y delweddu cyntaf. Y dull a ddefnyddir yn aml ar gyfer hyn yw plot pΓ’r llyfrgelloedd Mor-eni. Yn ein hesiampl, oherwydd y niferoedd cyfyngedig, nid oes diben defnyddio'r llyfrgell Mor-eni. Byddwn yn defnyddio'r llyfrgell arferol matplotlib a dim ond edrych ar y plot gwasgariad.
Cod 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()
Siart Rhif 1 βDibyniaeth refeniw ar fis y flwyddynβ
Datrysiad dadansoddol
Gadewch i ni ddefnyddio'r offer mwyaf cyffredin yn python a datrys y system o hafaliadau:
dechrau{ hafaliad*}
dechrau{achosion}
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
diwedd{achosion}
diwedd{ hafaliad*}
Yn ol rheol Cramer cawn y penderfynydd cyffredinol, yn gystal a phenderfynyddion gan a chan , wedi hynny, rhannu'r penderfynydd Γ’ i'r penderfynydd cyffredinol - darganfyddwch y cyfernod , yn yr un modd rydym yn dod o hyd i'r cyfernod .
Cod datrysiad dadansoddol
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠ°ΡΡΠ΅ΡΠ° ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² 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)
Dyma beth gawson ni:
Felly, mae gwerthoedd y cyfernodau wedi'u canfod, mae swm y gwyriadau sgwΓ’r wedi'u sefydlu. Gadewch i ni dynnu llinell syth ar yr histogram gwasgariad yn unol Γ’'r cyfernodau a ddarganfuwyd.
Cod llinell atchweliad
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠ°ΡΡΡΠ΅ΡΠ½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π²ΡΡΡΡΠΊΠΈ
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()
Siart Rhif 2 βAtebion cywir a chyfrifolβ
Gallwch edrych ar y graff gwyriad ar gyfer pob mis. Yn ein hachos ni, ni fyddwn yn cael unrhyw werth ymarferol sylweddol ohono, ond byddwn yn bodloni ein chwilfrydedd ynghylch pa mor dda y mae'r hafaliad atchweliad llinol syml yn nodweddu dibyniaeth refeniw ar fis y flwyddyn.
Cod siart gwyriad
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ Π² ΠΏΡΠΎΡΠ΅Π½ΡΠ°Ρ
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()
Siart Rhif 3 βGwyriadau, %β
Ddim yn berffaith, ond fe wnaethom gwblhau ein tasg.
Gadewch i ni ysgrifennu swyddogaeth sydd, i benderfynu ar y cyfernodau ΠΈ yn defnyddio'r llyfrgell nympy, yn fwy manwl gywir, byddwn yn ysgrifennu dwy swyddogaeth: un gan ddefnyddio matrics ffug-wrthdro (nid argymhellir yn ymarferol, gan fod y broses yn gymhleth ac yn ansefydlog yn gyfrifiadol), a'r llall gan ddefnyddio hafaliad matrics.
Cod Datrysiad Dadansoddol (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
Gadewch i ni gymharu'r amser a dreulir ar bennu'r cyfernodau ΠΈ , yn unol Γ’'r 3 dull a gyflwynwyd.
Cod ar gyfer cyfrifo amser cyfrifo
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)
Gydag ychydig bach o ddata, mae swyddogaeth βhunanysgrifenedigβ yn dod allan, sy'n dod o hyd i'r cyfernodau gan ddefnyddio dull Cramer.
Nawr gallwch symud ymlaen i ffyrdd eraill o ddod o hyd i cyfernodau ΠΈ .
Disgyniad Graddfa
Yn gyntaf, gadewch i ni ddiffinio beth yw graddiant. Yn syml, segment yw'r graddiant sy'n nodi cyfeiriad twf mwyaf ffwythiant. Trwy gydweddiad Γ’ dringo mynydd, lle mae'r graddiant yn wynebu yw lle mae'r ddringfa fwyaf serth i ben y mynydd. Wrth ddatblygu'r enghraifft gyda'r mynydd, cofiwn fod angen y disgyniad mwyaf serth arnom mewn gwirionedd er mwyn cyrraedd yr iseldir cyn gynted Γ’ phosibl, hynny yw, y lleiafswm - y man lle nad yw'r swyddogaeth yn cynyddu neu'n lleihau. Ar y pwynt hwn bydd y deilliad yn hafal i sero. Felly, nid graddiant sydd ei angen arnom, ond gwrthraddiant. I ddod o hyd i'r gwrthraddiant y cyfan sydd angen i chi ei wneud yw lluosi'r graddiant Γ’ -1 (llai un).
Gadewch inni roi sylw i'r ffaith y gall swyddogaeth gael nifer o leiafrifoedd, ac ar Γ΄l disgyn i un ohonynt gan ddefnyddio'r algorithm a gynigir isod, ni fyddwn yn gallu dod o hyd i isafswm arall, a all fod yn is na'r un a ddarganfuwyd. Gadewch i ni ymlacio, nid yw hyn yn fygythiad i ni! Yn ein hachos ni rydym yn delio ag isafswm sengl, ers ein swyddogaeth ar y graff mae parabola rheolaidd. Ac fel y dylem ni i gyd wybod yn iawn o'n cwrs mathemateg ysgol, dim ond un lleiafswm sydd gan barabola.
Ar Γ΄l i ni ddarganfod pam roedd angen graddiant arnom, a hefyd bod y graddiant yn segment, hynny yw, fector gyda chyfesurynnau penodol, sydd yn union yr un cyfernodau ΠΈ gallwn weithredu disgyniad graddiant.
Cyn dechrau, rwy'n awgrymu darllen dim ond ychydig o frawddegau am yr algorithm disgyniad:
- Rydym yn pennu mewn modd ffug-hap gyfesurynnau'r cyfernodau ΠΈ . Yn ein hesiampl, byddwn yn diffinio cyfernodau ger sero. Mae hwn yn arfer cyffredin, ond gall fod gan bob achos ei arfer ei hun.
- O cyfesuryn tynnu gwerth y deilliad rhannol gorchymyn 1af ar y pwynt . Felly, os yw'r deilliad yn bositif, yna mae'r swyddogaeth yn cynyddu. Felly, trwy dynnu gwerth y deilliad, byddwn yn symud i gyfeiriad arall y twf, hynny yw, i gyfeiriad disgyniad. Os yw'r deilliad yn negatif, yna mae'r ffwythiant ar y pwynt hwn yn lleihau a thrwy dynnu gwerth y deilliad rydym yn symud i gyfeiriad disgyniad.
- Rydym yn cynnal gweithrediad tebyg gyda'r cyfesuryn : tynnu gwerth y deilliad rhannol ar y pwynt .
- Er mwyn peidio Γ’ neidio dros yr isafswm a hedfan i'r gofod dwfn, mae angen gosod maint y cam i gyfeiriad disgyniad. Yn gyffredinol, gallech ysgrifennu erthygl gyfan am sut i osod y cam yn gywir a sut i'w newid yn ystod y broses ddisgyn er mwyn lleihau costau cyfrifiannol. Ond nawr mae gennym ni dasg ychydig yn wahanol o'n blaenau, a byddwn yn sefydlu maint y gris gan ddefnyddio'r dull gwyddonol o βbrocioβ neu, fel maen nhw'n dweud yn gyffredin, yn empirig.
- Unwaith y byddwn o'r cyfesurynnau a roddir ΠΈ tynnu gwerthoedd y deilliadau, rydym yn cael cyfesurynnau newydd ΠΈ . Rydym yn cymryd y cam nesaf (tynnu), eisoes o'r cyfesurynnau a gyfrifwyd. Ac felly mae'r cylch yn dechrau dro ar Γ΄l tro, nes cyflawni'r cydgyfeiriant gofynnol.
I gyd! Nawr rydym yn barod i fynd i chwilio am geunant dyfnaf Ffos Mariana. Gadewch i ni ddechrau.
Cod ar gyfer disgyniad graddiant
# Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΡΡΠΊΠ° Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ 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
Fe wnaethom blymio i waelod Ffos Mariana ac yno daethom o hyd i'r un gwerthoedd cyfernod ΠΈ , sef yr union beth oedd i'w ddisgwyl.
Gadewch i ni blymio arall, dim ond y tro hwn, bydd ein cerbyd mΓ΄r dwfn yn cael ei lenwi Γ’ thechnolegau eraill, sef llyfrgell nympy.
Cod ar gyfer disgyniad graddiant (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
Gwerthoedd cyfernod ΠΈ anghyfnewidiol.
Gadewch i ni edrych ar sut y newidiodd y gwall yn ystod disgyniad graddiant, hynny yw, sut y newidiodd swm y gwyriadau sgwΓ’r gyda phob cam.
Cod ar gyfer plotio symiau gwyriadau sgwΓ’r
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()
Graff Rhif 4 βSwm y gwyriadau sgwΓ’r yn ystod disgyniad graddiantβ
Ar y graff gwelwn fod y gwall yn lleihau gyda phob cam, ac ar Γ΄l nifer penodol o iteriadau rydym yn arsylwi llinell lorweddol bron.
Yn olaf, gadewch i ni amcangyfrif y gwahaniaeth mewn amser gweithredu cod:
Cod i bennu amser cyfrifo graddiant disgyniad
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)
Efallai ein bod yn gwneud rhywbeth o'i le, ond eto mae'n swyddogaeth βysgrifenedig gartrefβ syml nad yw'n defnyddio'r llyfrgell nympy yn perfformio'n well nag amser cyfrifo swyddogaeth gan ddefnyddio'r llyfrgell nympy.
Ond nid ydym yn sefyll yn ein hunfan, ond rydym yn symud tuag at astudio ffordd gyffrous arall o ddatrys yr hafaliad atchweliad llinol syml. Cyfarfod!
Disgyniad graddastig stochastig
Er mwyn deall yn gyflym yr egwyddor o weithredu disgyniad graddiant stochastig, mae'n well pennu ei wahaniaethau o ddisgyniad graddiant cyffredin. Rydym ni, yn achos disgyniad graddiant, yn hafaliadau deilliadau o ΠΈ defnyddio symiau gwerthoedd yr holl nodweddion a gwir atebion sydd ar gael yn y sampl (hynny yw, symiau'r cyfan ΠΈ ). Mewn disgyniad graddiant stochastig, ni fyddwn yn defnyddio'r holl werthoedd sy'n bresennol yn y sampl, ond yn hytrach, ffug-hap yn dewis y mynegai sampl fel y'i gelwir a defnyddio ei werthoedd.
Er enghraifft, os penderfynir bod y mynegai yn rhif 3 (tri), yna rydym yn cymryd y gwerthoedd ΠΈ , yna rydym yn amnewid y gwerthoedd yn yr hafaliadau deilliadol a phennu cyfesurynnau newydd. Yna, ar Γ΄l pennu'r cyfesurynnau, rydym unwaith eto yn ffug-hap yn pennu'r mynegai sampl, yn amnewid y gwerthoedd sy'n cyfateb i'r mynegai yn yr hafaliadau gwahaniaethol rhannol, ac yn pennu'r cyfesurynnau mewn ffordd newydd ΠΈ etc. nes bod y cydgyfeiriant yn troi'n wyrdd. Ar yr olwg gyntaf, efallai na fydd yn ymddangos y gallai hyn weithio o gwbl, ond mae'n gwneud hynny. Mae'n wir ei bod yn werth nodi nad yw'r gwall yn lleihau gyda phob cam, ond yn sicr mae tuedd.
Beth yw manteision disgyniad graddiant stocastig o'i gymharu Γ’'r un confensiynol? Os yw maint ein sampl yn fawr iawn ac wedi'i fesur mewn degau o filoedd o werthoedd, yna mae'n llawer haws prosesu, dyweder, mil ar hap ohonynt, yn hytrach na'r sampl gyfan. Dyma lle mae disgyniad graddiant stocastig yn dod i rym. Yn ein hachos ni, wrth gwrs, ni fyddwn yn sylwi ar lawer o wahaniaeth.
Gadewch i ni edrych ar y cod.
Cod ar gyfer disgyniad graddiant stocastig
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠΎΡ
.Π³ΡΠ°Π΄.ΡΠ°Π³Π°
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])
Edrychwn yn ofalus ar y cyfernodau a dal ein hunain yn gofyn y cwestiwn βSut all hyn fod?β Cawsom werthoedd cyfernod eraill ΠΈ . Efallai bod disgyniad graddiant stocastig wedi dod o hyd i baramedrau mwy optimaidd ar gyfer yr hafaliad? Yn anffodus na. Mae'n ddigon i edrych ar swm y gwyriadau sgwΓ’r a gweld bod gyda gwerthoedd newydd o'r cyfernodau, y gwall yn fwy. Nid ydym mewn unrhyw frys i anobaith. Gadewch i ni adeiladu graff o'r newid gwall.
Cod ar gyfer plotio swm y gwyriadau sgwΓ’r mewn disgyniad graddiant stochastig
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()
Graff Rhif 5 βSwm y gwyriadau sgwΓ’r yn ystod disgyniad graddiant stocastigβ
O edrych ar yr amserlen, mae popeth yn disgyn i'w le a nawr byddwn yn trwsio popeth.
Felly beth ddigwyddodd? Digwyddodd y canlynol. Pan fyddwn yn dewis mis ar hap, yna ar gyfer y mis a ddewiswyd y mae ein algorithm yn ceisio lleihau'r gwall wrth gyfrifo refeniw. Yna rydyn ni'n dewis mis arall ac yn ailadrodd y cyfrifiad, ond rydyn ni'n lleihau'r gwall am yr ail fis a ddewiswyd. Nawr cofiwch fod y ddau fis cyntaf yn gwyro'n sylweddol oddi wrth linell yr hafaliad atchweliad llinol syml. Mae hyn yn golygu, pan ddewisir unrhyw un o'r ddau fis hyn, trwy leihau gwall pob un ohonynt, mae ein algorithm yn cynyddu'r gwall ar gyfer y sampl gyfan yn ddifrifol. Felly beth i'w wneud? Mae'r ateb yn syml: mae angen i chi leihau'r cam disgyn. Wedi'r cyfan, trwy leihau'r cam disgyn, bydd y gwall hefyd yn atal "neidio" i fyny ac i lawr. Neu yn hytrach, ni fydd y gwall βneidioβ yn dod i ben, ond ni fydd yn ei wneud mor gyflym :) Gadewch i ni wirio.
Cod i redeg SGD gyda chynyddrannau llai
# Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ, ΡΠΌΠ΅Π½ΡΡΠΈΠ² ΡΠ°Π³ Π² 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()
Graff Rhif 6 βSwm y gwyriadau sgwΓ’r yn ystod disgyniad graddiant stocastig (80 mil o gamau)β
Mae'r cyfernodau wedi gwella, ond nid ydynt yn ddelfrydol o hyd. Yn ddamcaniaethol, gellir cywiro hyn fel hyn. Rydym yn dewis, er enghraifft, yn y 1000 o iteriadau diwethaf werthoedd y cyfernodau y gwnaed y gwall lleiaf ohonynt. Yn wir, ar gyfer hyn bydd yn rhaid i ni hefyd ysgrifennu gwerthoedd y cyfernodau eu hunain. Ni fyddwn yn gwneud hyn, ond yn hytrach yn rhoi sylw i'r amserlen. Mae'n edrych yn llyfn ac mae'n ymddangos bod y gwall yn gostwng yn gyfartal. Mewn gwirionedd nid yw hyn yn wir. Edrychwn ar y 1000 o iteriadau cyntaf a'u cymharu Γ’'r olaf.
Cod ar gyfer siart SGD (1000 cam cyntaf)
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()
Graff Rhif 7 βSwm y gwyriadau sgwΓ’r SGD (1000 cam cyntaf)β
Graff Rhif 8 βSwm y gwyriadau sgwΓ’r SGD (1000 cam olaf)β
Ar ddechrau'r disgyniad, gwelwn ostyngiad eithaf unffurf a serth mewn gwallau. Yn yr iteriadau diwethaf, gwelwn fod y gwall yn mynd o gwmpas ac o gwmpas gwerth 1,475 ac ar rai eiliadau mae hyd yn oed yn cyfateb i'r gwerth gorau posibl hwn, ond yna mae'n dal i fynd i fyny ... Rwy'n ailadrodd, gallwch chi ysgrifennu gwerthoedd y cyfernodau ΠΈ , ac yna dewiswch y rhai y mae'r gwall yn fach iawn ar eu cyfer. Fodd bynnag, roedd gennym broblem fwy difrifol: roedd yn rhaid i ni gymryd 80 mil o gamau (gweler y cod) i gael gwerthoedd yn agos at optimaidd. Ac mae hyn eisoes yn gwrth-ddweud y syniad o arbed amser cyfrifiant gyda disgyniad graddiant stochastig o'i gymharu Γ’ disgyniad graddiant. Beth ellir ei gywiro a'i wella? Nid ywβn anodd sylwi ein bod yn mynd i lawr yn hyderus yn yr iteriadau cyntaf ac, felly, dylem adael cam mawr yn yr iteriadau cyntaf a lleihauβr cam wrth inni symud ymlaen. Ni fyddwn yn gwneud hyn yn yr erthygl hon - mae eisoes yn rhy hir. Gall y rhai sy'n dymuno feddwl drostynt eu hunain sut i wneud hyn, nid yw'n anodd :)
Nawr gadewch i ni berfformio disgyniad graddiant stochastig gan ddefnyddio'r llyfrgell nympy (a pheidiwn Γ’ baglu dros y cerrig a nodwyd gennym yn gynharach)
Cod ar gyfer Disgyniad Graddiant Stochastig (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
Trodd y gwerthoedd bron yr un fath ag wrth ddisgyn heb ddefnyddio nympy. Fodd bynnag, mae hyn yn rhesymegol.
Dewch i ni ddarganfod pa mor hir y cymerodd disgyniadau graddiant stochastig ni.
Cod ar gyfer pennu amser cyfrifo SGD (80 mil o gamau)
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)
Po bellaf i mewn iβr goedwig, y tywyllaf ywβr cymylau: eto, maeβr fformiwla βhunanysgrifenedigβ yn dangos y canlyniad gorau. Mae hyn i gyd yn awgrymu bod yn rhaid cael ffyrdd mwy cynnil fyth o ddefnyddio'r llyfrgell nympy, sydd wir yn cyflymu gweithrediadau cyfrifiant. Yn yr erthygl hon ni fyddwn yn dysgu amdanynt. Bydd rhywbeth i feddwl amdano yn eich amser hamdden :)
Rydym yn crynhoi
Cyn crynhoi, hoffwn ateb cwestiwn a gododd yn fwyaf tebygol gan ein hanwyl ddarllenydd. Pam, mewn gwirionedd, y fath βartaithβ gyda disgyniadau, pam fod angen i ni gerdded i fyny ac i lawr y mynydd (i lawr yn bennaf) er mwyn dod o hyd i'r iseldir gwerthfawr, os oes gennym ddyfais mor bwerus a syml yn ein dwylo, yn y ffurf datrysiad dadansoddol, sy'n ein teleportio ar unwaith i'r Lle Iawn?
Mae'r ateb i'r cwestiwn hwn yn gorwedd ar yr wyneb. Nawr rydym wedi edrych ar enghraifft syml iawn, yn yr hon y mae'r ateb cywir yn dibynnu ar un arwydd . Nid ydych chi'n gweld hyn yn aml mewn bywyd, felly gadewch i ni ddychmygu bod gennym ni 2, 30, 50 neu fwy o arwyddion. Gadewch i ni ychwanegu at hyn filoedd, neu hyd yn oed ddegau o filoedd o werthoedd ar gyfer pob priodoledd. Yn yr achos hwn, efallai na fydd yr ateb dadansoddol yn gwrthsefyll y prawf ac yn methu. Yn ei dro, bydd disgyniad graddiant a'i amrywiadau yn araf ond yn sicr yn dod Γ’ ni'n agosach at y nod - lleiafswm y swyddogaeth. A pheidiwch Γ’ phoeni am gyflymder - mae'n debyg y byddwn yn edrych ar ffyrdd a fydd yn caniatΓ‘u inni osod a rheoleiddio hyd cam (hynny yw, cyflymder).
Ac yn awr y crynodeb byr gwirioneddol.
Yn gyntaf, gobeithio y bydd y deunydd a gyflwynir yn yr erthygl yn helpu i ddechrau βgwyddonwyr dataβ i ddeall sut i ddatrys hafaliadau atchweliad llinol syml (ac nid yn unig).
Yn ail, buom yn edrych ar sawl ffordd o ddatrys yr hafaliad. Nawr, yn dibynnu ar y sefyllfa, gallwn ddewis yr un sydd fwyaf addas i ddatrys y broblem.
Yn drydydd, gwelsom bΕ΅er gosodiadau ychwanegol, sef hyd y cam disgyniad graddiant. Ni ellir esgeuluso'r paramedr hwn. Fel y nodwyd uchod, er mwyn lleihau cost cyfrifiadau, dylid newid hyd y cam yn ystod y disgyniad.
Yn bedwerydd, yn ein hachos ni, swyddogaethau βysgrifenedig gartrefβ a ddangosodd y canlyniadau amser gorau ar gyfer cyfrifiadau. Mae'n debyg mai nid y defnydd mwyaf proffesiynol o alluoedd y llyfrgell sy'n gyfrifol am hyn nympy. Ond boed hyny fel y byddo, y mae y casgliad canlynol yn ei awgrymu ei hun. Ar y naill law, weithiau mae'n werth cwestiynu barn sefydledig, ac ar y llaw arall, nid yw bob amser yn werth cymhlethu popeth - i'r gwrthwyneb, weithiau mae ffordd symlach o ddatrys problem yn fwy effeithiol. A chan mai ein nod oedd dadansoddi tri dull o ddatrys hafaliad atchweliad llinol syml, roedd y defnydd o swyddogaethau βhunanysgrifenedigβ yn ddigon i ni.
Llenyddiaeth (neu rywbeth felly)
1. Atchweliad llinol
2. Sgwariau lleiaf dull
3. Deilliadol
4. graddiant
5. Disgyniad graddiant
6. llyfrgell NumPy
Ffynhonnell: hab.com