Famahana ny fitovian'ny fihemorana tsipika tsotra

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 Github

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”

Famahana ny fitovian'ny fihemorana tsipika tsotra

Heverintsika fa ny soatoavina Famahana ny fitovian'ny fihemorana tsipika tsotra dia ny volana amin’ny taona, ary Famahana ny fitovian'ny fihemorana tsipika tsotra - vola miditra amin'ity volana ity. Raha lazaina amin'ny teny hafa, ny vola miditra dia miankina amin'ny volana amin'ny taona, ary Famahana ny fitovian'ny fihemorana tsipika tsotra - 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:

Famahana ny fitovian'ny fihemorana tsipika tsotra

izay Famahana ny fitovian'ny fihemorana tsipika tsotra dia ny volana nahazoana ny vola miditra, Famahana ny fitovian'ny fihemorana tsipika tsotra - vola miditra mifanaraka amin'ny volana, Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra dia ny coefficient fihemorana amin'ny tsipika tombanana.

Mariho fa ny coefficient Famahana ny fitovian'ny fihemorana tsipika tsotra antsoina matetika hoe slope na gradient amin'ny tsipika tombanana; maneho ny habetsahan'ny Famahana ny fitovian'ny fihemorana tsipika tsotra rehefa miova Famahana ny fitovian'ny fihemorana tsipika tsotra.

Mazava ho azy fa ny andraikitsika amin'ny ohatra dia ny mifidy ny coefficient toy izany ao amin'ny equation Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra, 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):

Famahana ny fitovian'ny fihemorana tsipika tsotra

izay Famahana ny fitovian'ny fihemorana tsipika tsotra dia fiasan'ny fanombanana ny valiny marina (izany hoe ny vola miditra kajy),

Famahana ny fitovian'ny fihemorana tsipika tsotra dia ny valiny marina (vola miditra ao amin'ny santionany),

Famahana ny fitovian'ny fihemorana tsipika tsotra 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 Famahana ny fitovian'ny fihemorana tsipika tsotra miankavanana amin'ny singa mahazatra, sanda Famahana ny fitovian'ny fihemorana tsipika tsotra nitombo 25 isa mahazatra. Eo amin'ny tabilao dia toa fisondrotana be loatra ny sandany Famahana ny fitovian'ny fihemorana tsipika tsotra avy amin'ny teboka iray.

Ohatra iray hafa. Mitovy ny sanda derivative -0,1 midika hoe rehefa nafindra toerana Famahana ny fitovian'ny fihemorana tsipika tsotra isaky ny vondrona mahazatra iray, sanda Famahana ny fitovian'ny fihemorana tsipika tsotra 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 Famahana ny fitovian'ny fihemorana tsipika tsotra amin'ny tsy mety Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra, 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. Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra, 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. Famahana ny fitovian'ny fihemorana tsipika tsotra dia handray ny endrika:

Famahana ny fitovian'ny fihemorana tsipika tsotra

1Γ¨me commande partial derivative equation mikasika ny Famahana ny fitovian'ny fihemorana tsipika tsotra dia handray ny endrika:

Famahana ny fitovian'ny fihemorana tsipika tsotra

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”

Famahana ny fitovian'ny fihemorana tsipika tsotra

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 Famahana ny fitovian'ny fihemorana tsipika tsotra ary avy amin'i Famahana ny fitovian'ny fihemorana tsipika tsotra, aorian'izay, mizara ny determinant amin'ny Famahana ny fitovian'ny fihemorana tsipika tsotra amin'ny determinant ankapobeny - tadiavo ny coefficient Famahana ny fitovian'ny fihemorana tsipika tsotra, toy izany koa no ahitantsika ny coefficient Famahana ny fitovian'ny fihemorana tsipika tsotra.

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:

Famahana ny fitovian'ny fihemorana tsipika tsotra

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”

Famahana ny fitovian'ny fihemorana tsipika tsotra

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, %”

Famahana ny fitovian'ny fihemorana tsipika tsotra

Tsy tonga lafatra, fa nahavita ny asantsika.

Andeha hanoratra asa izay, mba hamaritana ny coefficients Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra 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 Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra, 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)

Famahana ny fitovian'ny fihemorana tsipika tsotra

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 Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra.

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 Famahana ny fitovian'ny fihemorana tsipika tsotra 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. Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra 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 Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra. 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 Famahana ny fitovian'ny fihemorana tsipika tsotra esory ny sandan'ny derivative ampahany 1er amin'ny teboka Famahana ny fitovian'ny fihemorana tsipika tsotra. 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 Famahana ny fitovian'ny fihemorana tsipika tsotra: Esorina ny sandan'ny derivative ampahany amin'ny teboka Famahana ny fitovian'ny fihemorana tsipika tsotra.
  • 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 Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra esory ny sandan'ny derivatives, mahazo coordinates vaovao Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra. 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

Famahana ny fitovian'ny fihemorana tsipika tsotra

Nitsoraka tany amin'ny faran'ny Mariana Trench izahay ary hitanay ny sanda coefficient mitovy Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra, 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

Famahana ny fitovian'ny fihemorana tsipika tsotra
Sanda coefficient Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra 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"

Famahana ny fitovian'ny fihemorana tsipika tsotra

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)

Famahana ny fitovian'ny fihemorana tsipika tsotra

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 Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra nampiasa ny fitambaran'ny sandan'ny endri-javatra rehetra sy ny valiny marina hita ao amin'ny santionany (izany hoe ny fitambaran'ny rehetra Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra). 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 Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra, 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. Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra 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])

Famahana ny fitovian'ny fihemorana tsipika tsotra

Mijery tsara ny coefficients isika ary manontany tena hoe "Ahoana no hahatongavan'izany?" Nahazo sanda coefficient hafa izahay Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra. 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"

Famahana ny fitovian'ny fihemorana tsipika tsotra

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()

Famahana ny fitovian'ny fihemorana tsipika tsotra

Grapika No. 6 "Tanisan'ny fiviliana efamira mandritra ny fidinan'ny gradient stochastic (80 arivo dingana)"

Famahana ny fitovian'ny fihemorana tsipika tsotra

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)”

Famahana ny fitovian'ny fihemorana tsipika tsotra

Grapika No. 8 β€œTanisan'ny fivilian-dalana efamira SGD (dingana 1000 farany)”

Famahana ny fitovian'ny fihemorana tsipika tsotra

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 Famahana ny fitovian'ny fihemorana tsipika tsotra ΠΈ Famahana ny fitovian'ny fihemorana tsipika tsotra, 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

Famahana ny fitovian'ny fihemorana tsipika tsotra

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)

Famahana ny fitovian'ny fihemorana tsipika tsotra

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 Famahana ny fitovian'ny fihemorana tsipika tsotra miankina amin'ny famantarana iray Famahana ny fitovian'ny fihemorana tsipika tsotra. 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

http://statistica.ru/theory/osnovy-lineynoy-regressii/

2. Fomba faran'izay kely indrindra

mathprofi.ru/metod_naimenshih_kvadratov.html

3. Derivative

www.mathprofi.ru/chastnye_proizvodnye_primery.html

4. Gradient

mathprofi.ru/proizvodnaja_po_napravleniju_i_gradient.html

5. Fidina miandalana

habr.com/en/post/471458

habr.com/en/post/307312

artemarakcheev.com//2017-12-31/linear_regression

6. Tranomboky NumPy

docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.linalg.solve.html

docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.pinv.html

pythonworld.ru/numpy/2.html

Source: www.habr.com

Add a comment