Ngrampungake persamaan regresi linier prasaja

Artikel kasebut mbahas sawetara cara kanggo nemtokake persamaan matematika saka garis regresi sing prasaja (dipasangake).

Kabeh cara kanggo ngrampungake persamaan sing dianggep ing kene adhedhasar metode kuadrat paling sithik. Kita bakal nemtokake cara kaya ing ngisor iki:

  • Solusi analitik
  • Keturunan Gradien
  • Penurunan gradien stokastik

Kanggo saben cara kanggo ngrampungake persamaan garis lurus, artikel kasebut nyedhiyakake macem-macem fungsi, sing utamane dipΓ©rang dadi sing ditulis tanpa nggunakake perpustakaan. NomPy lan sing digunakake kanggo nindakake petungan NomPy. Punika pitados bilih nggunakake skillful NomPy bakal ngurangi biaya komputasi.

Kabeh kode sing diwenehake ing artikel kasebut ditulis nganggo basa python-2.7 nggunakake Notebook Jupyter KabKode sumber lan file data sampel kasedhiya ing GitHub

Artikel iki utamane ditujokake kanggo para pamula lan wong-wong sing wis mulai nguwasani sinau babagan intelijen buatan sing wiyar banget - learning machine.

Kanggo nggambarake materi, kita bakal nggunakake conto sing gampang banget.

Conto kahanan

Kita duwe limang nilai sing nggambarake katergantungan Y saka X (Tabel No. 1):

Tabel No. 1 "Kahanan Tuladha"

Ngrampungake persamaan regresi linier prasaja

Ayo nganggep yen nilai-nilai kasebut Ngrampungake persamaan regresi linier prasaja - iki sasi taun, lan Ngrampungake persamaan regresi linier prasaja - revenue kanggo sasi iki. Ing tembung liyane, revenue gumantung ing sasi taun, lan Ngrampungake persamaan regresi linier prasaja - mung fitur kang revenue gumantung.

Conto kasebut rada winates, ing babagan hubungan kondisional antarane revenue lan sasi ing taun, lan babagan jumlah nilai-ana sawetara banget. Nanging, nyederhanakake iki bakal ngidini kita nerangake, ing istilah awam, materi, sing ora tansah gampang dicekel dening pemula. Salajengipun, kesederhanaan angka kasebut bakal ngidini wong-wong sing pengin ngrampungake conto ing kertas tanpa gaweyan sing signifikan.

Ayo kita nganggep manawa katergantungan sing diwenehake ing conto kasebut bisa dikira kanthi cukup kanthi persamaan matematika saka garis regresi prasaja (dipasangake) saka formulir:

Ngrampungake persamaan regresi linier prasaja

ngendi Ngrampungake persamaan regresi linier prasaja - iku sasi nalika revenue ditampa, Ngrampungake persamaan regresi linier prasaja - revenue sing cocog karo sasi, Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja - koefisien regresi saka garis sing dikira.

Elinga yen koefisien Ngrampungake persamaan regresi linier prasaja asring disebut slope utawa gradient saka garis kira-kira; nggantosi jumlah kang ing Ngrampungake persamaan regresi linier prasaja nalika ngganti Ngrampungake persamaan regresi linier prasaja.

Cetha yen tugas kita ing conto yaiku milih koefisien kasebut ing persamaan Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja, ing endi panyimpangan saka nilai revenue sing diwilang miturut wulan saka jawaban sing bener, yaiku nilai sing ditampilake ing conto, bakal minimal.

Metode kuadrat paling sithik

Miturut cara kuadrat paling ora, panyimpangan kudu diitung kanthi kuadrat. Teknik iki nyegah panyimpangan saka mbatalake yen padha duwe pratandha ngelawan. Contone, yen ing siji kasus penyimpangan +5 (plus lima), lan liyane -5 (minus lima), banjur jumlah panyimpangan bakal mbatalake siji liyane lan padha karo 0 (nol). Utawa, tinimbang nggawe kuadrat panyimpangan, kita bisa nggunakake properti nilai absolut, ing kasus iki kabeh panyimpangan bakal positif lan kumulatif. Kita ora bakal njlèntrèhaké kanthi rinci babagan iki, nanging mung cathet menawa kanggo ngétung kanthi gampang, praktik umum kanggo nggawe kuadrat penyimpangan.

Iki minangka rumus sing bakal mbantu nemtokake jumlah penyimpangan kuadrat sing paling cilik (kesalahan):

Ngrampungake persamaan regresi linier prasaja

ngendi Ngrampungake persamaan regresi linier prasaja - iki minangka fungsi kira-kira saka jawaban sing bener (yaiku, revenue sing diwilang),

Ngrampungake persamaan regresi linier prasaja - iki minangka jawaban sing bener (asil sing diwenehake ing conto),

Ngrampungake persamaan regresi linier prasaja - minangka indeks sampel (nomer sasi ing ngendi panyimpangan ditemtokake)

Ayo mbedakake fungsi kasebut, nemtokake persamaan diferensial parsial, lan siyap nerusake menyang solusi analitis. Nanging pisanan, ayo dipikirake kanthi ringkes babagan diferensiasi lan ngelingi makna geometris saka turunan kasebut.

Diferensiasi

Diferensiasi yaiku operasi nemokake turunan saka sawijining fungsi.

Apa gunane turunan? Turunan saka sawijining fungsi menehi ciri tingkat owah-owahan fungsi lan nuduhake arah. Yen turunan ing titik tartamtu positif, fungsi tambah; yen ora, fungsi iki mudun. Sing luwih gedhe nilai absolut saka turunan, luwih gedhe tingkat owah-owahan saka nilai fungsi, lan kemiringan grafik fungsi sing luwih curam.

Contone, ing sistem koordinat Cartesian, nilai turunan ing titik M(0,0) padha karo + 25 tegese ing titik tartamtu, nalika Nilai wis pindah Ngrampungake persamaan regresi linier prasaja sisih tengen dening unit conventional, Nilai Ngrampungake persamaan regresi linier prasaja mundhak dening 25 Unit conventional. Ing grafik, iki katon kaya kenaikan nilai sing cukup curam. Ngrampungake persamaan regresi linier prasaja saka titik tartamtu.

Conto liyane. Nilai turunan padha karo -0,1 tegese yen dipindhah Ngrampungake persamaan regresi linier prasaja saben unit konvensional, nilai Ngrampungake persamaan regresi linier prasaja Ngurangi mung 0,1 unit konvensional. Kajaba iku, ing grafik fungsi, kita bisa mirsani slope mudhun sing meh ora katon. Nggambarake analogi karo gunung, kaya-kaya kita mudhun alon-alon, ora kaya conto sadurunge, ing ngendi kita kudu munggah ing pucuk sing curam banget.

Mangkono, wis dibedakake fungsi Ngrampungake persamaan regresi linier prasaja dening koefisien Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja, kita nemtokake persamaan diferensial parsial urutan pisanan. Sawise nemtokake persamaan, kita entuk sistem saka rong persamaan, sing bisa milih nilai koefisien. Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja, sing nilai-nilai turunan sing cocog ing titik-titik kasebut diganti kanthi jumlah sing cilik banget, lan ing kasus solusi analitis, ora owah. Ing tembung liya, fungsi kesalahan kanggo koefisien sing ditemokake bakal tekan minimal, amarga nilai turunan parsial ing titik kasebut bakal padha karo nol.

Dadi, miturut aturan diferensiasi, persamaan turunan parsial orde pertama babagan koefisien. Ngrampungake persamaan regresi linier prasaja bakal njupuk formulir:

Ngrampungake persamaan regresi linier prasaja

persamaan derivatif parsial orde kapisan babagan Ngrampungake persamaan regresi linier prasaja bakal njupuk formulir:

Ngrampungake persamaan regresi linier prasaja

AkibatΓ©, kita entuk sistem persamaan sing nduweni solusi analitis sing cukup prasaja:

miwiti {persamaan*}
miwiti {kasus}
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
pungkasan {kasus}
pungkasan {persamaan*}

Sadurunge ngrampungake persamaan, ayo pra-muat, priksa akurasi loading, lan format data.

Loading lan format data

Perlu dicathet menawa amarga kasunyatan manawa kanggo solusi analitik, lan mengko kanggo gradien lan gradient stokastik, kita bakal nggunakake kode kasebut ing rong variasi: nggunakake perpustakaan NomPy lan tanpa nggunakake, kita kudu format data cocok (ndeleng kode).

Data loading lan kode pangolahan

# ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ всС Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
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 '********************************************'

Visualisasi

Saiki kita wis pisanan dimuat data, kapindho diverifikasi sing dimuat bener, lan pungkasanipun format data, ayo mbukak visualisasi pisanan kita. Cara sing asring digunakake kanggo iki yaiku pasangan perpustakaan segaraIng conto kita, amarga nomer winates, ora ana gunane nggunakake perpustakaan. segaraKita bakal nggunakake perpustakaan biasa. matplotlib lan ayo kang katon mung ing scatterplot.

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

Bagan No. 1 "Ketergantungan Pendapatan ing Wulan Taun"

Ngrampungake persamaan regresi linier prasaja

Solusi analitik

Ayo nggunakake alat sing paling umum ing python lan ngrampungake sistem persamaan:

miwiti {persamaan*}
miwiti {kasus}
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
pungkasan {kasus}
pungkasan {persamaan*}

Miturut aturan Cramer kita bakal nemokake determinant umum, uga determinants kanggo Ngrampungake persamaan regresi linier prasaja lan dening Ngrampungake persamaan regresi linier prasaja, sawise kang, dibagi determinant dening Ngrampungake persamaan regresi linier prasaja ing determinan umum - kita bakal nemokake koefisien Ngrampungake persamaan regresi linier prasaja, uga kita nemokake koefisien Ngrampungake persamaan regresi linier prasaja.

Kode solusi analitik

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для расчСта коэффициСнтов 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)

Iki sing entuk:

Ngrampungake persamaan regresi linier prasaja

Dadi, nilai koefisien wis ditemokake, lan jumlah panyimpangan kuadrat wis ditemtokake. Ayo tarik garis lurus ing histogram scatterplot sing cocog karo koefisien sing ditemokake.

Kode garis regresi

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для формирования массива рассчСтных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠΈ
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()

Bagan 2: Jawaban sing bener lan diwilang

Ngrampungake persamaan regresi linier prasaja

Kita bisa ndeleng grafik deviasi saben wulan. Ing kasus kita, kita ora bakal entuk nilai praktis sing signifikan saka iku, nanging bakal marem rasa penasaran kita babagan carane persamaan regresi linier sing prasaja nggambarake katergantungan revenue ing sasi taun.

Kode jadwal panyimpangan

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для формирования массива ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°Ρ…
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()

Bagan No. 3 "Penyimpangan, %"

Ngrampungake persamaan regresi linier prasaja

Iku ora sampurna, nanging kita wis rampung goal kita.

Ayo nulis fungsi sing bakal nemtokake koefisien Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja nggunakake perpustakaan NomPy, luwih tepat, kita bakal nulis rong fungsi: siji nggunakake matriks pseudoinverse (ora dianjurake ing laku, amarga proses komputasi rumit lan ora stabil), liyane nggunakake persamaan matriks.

Kode solusi analitik (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

Ayo mbandhingake wektu sing dibutuhake kanggo nemtokake koefisien Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja, sesuai karo 3 cara sing diwenehake.

Kode kanggo ngitung wektu pitungan

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)

Ngrampungake persamaan regresi linier prasaja

Ing jumlah data sing cilik, fungsi sing ditulis dhewe metu ing ngarep, sing nemokake koefisien nggunakake metode Cramer.

Saiki kita bisa pindhah menyang cara liya kanggo nemokake koefisien Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja.

Keturunan Gradien

Pisanan, ayo nemtokake gradien. Cukup, gradien minangka bagean sing nuduhake arah pertumbuhan maksimal sawijining fungsi. Padha karo munggah gunung, arah titik gradien minangka pendakian paling curam menyang ndhuwur. Ngembangake conto gunung, elinga yen apa sing kita butuhake yaiku turunan sing paling curam kanggo tekan lembah, utawa minimal, kanthi cepet-titik ing ngendi fungsi kasebut ora mundhak utawa nyuda. Ing titik iki, turunan bakal nol. Mulane, kita ora butuh gradien, nanging antigradient. Kanggo nemokake antigradient, mung multiply gradien dening -1 (minus siji).

Elinga yen fungsi bisa duwe pirang-pirang minima, lan kanthi mudhun menyang salah sijine nggunakake algoritma sing diusulake ing ngisor iki, kita ora bakal bisa nemokake minimal liyane, sing bisa uga luwih murah tinimbang sing ditemokake. Tenang, iki ora bakal kelakon! Ing kasus kita, kita lagi dealing karo minimal siji, wiwit kita fungsi Ngrampungake persamaan regresi linier prasaja Ing grafik, katon kaya parabola biasa. Lan kita kabeh kudu ngerti saka kelas matematika sekolah, parabola mung duwe minimal siji.

Sawise kita ngerti sebabe kita butuh kecerunan, lan uga kecerunan minangka bagean, yaiku, vektor kanthi koordinat sing diwenehake, sing persis koefisien kasebut. Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja Kita bisa ngleksanakake keturunan gradien.

Sadurunge diluncurake, aku saranake sampeyan maca sawetara ukara babagan algoritma keturunan:

  • Kita nemtokake koordinat saka koefisien kanthi cara pseudo-acak Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasajaIng conto kita, kita bakal nemtokake koefisien cedhak nol. Iki minangka praktik umum, nanging saben kasus mbutuhake pendekatan khusus dhewe.
  • Saka koordinat Ngrampungake persamaan regresi linier prasaja kita nyuda nilai turunan parsial urutan pisanan ing titik kasebut Ngrampungake persamaan regresi linier prasajaDadi, yen turunan positif, fungsi kasebut mundhak. Mulane, kanthi nyuda turunan, kita bakal pindhah menyang arah ngelawan saka kenaikan, yaiku, ing arah keturunan. Yen turunan kasebut negatif, mula fungsi kasebut mudhun ing titik iki, lan kanthi nyuda turunan kasebut, kita pindhah menyang arah keturunan.
  • Kita nindakake operasi sing padha karo koordinat Ngrampungake persamaan regresi linier prasaja: nyuda nilai turunan parsial ing titik kasebut Ngrampungake persamaan regresi linier prasaja.
  • Kanggo ngindhari overshooting minimal lan mabur menyang papan sing jero, sampeyan kudu nyetel ukuran langkah mudhun. Nyatane, artikel kabeh bisa ditulis babagan carane nyetel ukuran langkah kanthi bener lan carane ngganti nalika mudhun kanggo nyuda biaya komputasi. Nanging saiki kita ngadhepi tugas sing rada beda, lan kita bakal nggunakake metode uji coba ilmiah, utawa, kaya sing dikandhakake, kanthi empiris, kanggo nemtokake ukuran langkah.
  • Sawise kita wis ninggalake koordinat diwenehi Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja nyuda nilai turunan, kita entuk koordinat anyar Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasajaKita njupuk langkah sabanjure (subtraction), wektu iki saka koordinat sing diwilang. Dadi siklus diwiwiti maneh lan maneh nganti konvergensi sing dikarepake bisa ditindakake.

Mekaten! Saiki kita wis siyap budhal golek jurang paling jero ing Palung Mariana. Ayo dadi miwiti.

Kode keturunan gradien

# напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска Π±Π΅Π· использования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ 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

Ngrampungake persamaan regresi linier prasaja

Kita nyilem menyang paling ngisor Mariana Trench lan nemokake nilai koefisien sing padha ing kana. Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja, sing sejatine sing dikarepake.

Ayo nggawe nyilem maneh, mung wektu iki, ngisi peralatan laut jero bakal dadi teknologi sing beda, yaiku perpustakaan. NomPy.

Kode Keturunan Gradien (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

Ngrampungake persamaan regresi linier prasaja
Nilai saka koefisien Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja ora owah.

Ayo goleki carane kesalahan diganti nalika keturunan gradien, yaiku, carane jumlah penyimpangan kuadrat diganti karo saben langkah.

Kode kanggo jumlah kuadrat deviasi grafik

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

Grafik #4: "Jumlah penyimpangan kuadrat ing keturunan gradien"

Ngrampungake persamaan regresi linier prasaja

Ing grafik, kita weruh yen saben langkah kesalahane suda, lan sawise sawetara iterasi kita mirsani garis sing meh horisontal.

Pungkasan, ayo ngevaluasi bedane wektu eksekusi kode:

Kode kanggo nemtokake wektu komputasi turunan gradien

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)

Ngrampungake persamaan regresi linier prasaja

Mbok kita nindakake soko salah, nanging maneh iku prasaja "omah-digawe" fungsi sing ora nggunakake perpustakaan NomPy ngluwihi fungsi sing nggunakake perpustakaan ing syarat-syarat wektu pitungan NomPy.

Nanging kita ora mandheg; kita pindhah menyang njelajah cara liyane sing menarik kanggo ngatasi persamaan regresi linier sing prasaja. Ketemu!

Penurunan gradien stokastik

Kanggo mangerteni kanthi cepet cara kerja turunan gradient stokastik, luwih becik nemtokake bedane saka turunan gradien biasa. Ing kasus keturunan gradien, kita nggunakake persamaan turunan Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja nggunakake jumlah nilai kabeh fitur lan jawaban sing bener sing kasedhiya ing sampel (yaiku, jumlah kabeh Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja). Ing keturunan kecerunan stokastik, kita ora bakal nggunakake kabeh nilai sing kasedhiya ing sampel, nanging, kita bakal pseudo-acak milih indeks sampel sing diarani lan nggunakake nilai kasebut.

Contone, yen indeks ditemtokake dadi nomer 3 (telu), banjur njupuk nilai Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja, banjur kita ngganti nilai kasebut menyang persamaan turunan lan nemtokake koordinat anyar. Banjur, sawise nemtokake koordinat, kita pseudorandomly nemtokake indeks sampel, ngganti nilai sing cocog karo indeks menyang persamaan turunan parsial, lan nemtokake maneh koordinat. Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja Lan sateruse nganti konvergensi dadi ijo. Sepisanan, bisa uga angel kanggo ndeleng kepiye cara iki bisa ditindakake, nanging bisa uga. Wigati dicathet, yen kesalahan ora suda saben langkah, nanging mesthi ana tren.

Apa kaluwihan saka turunan gradient stokastik tinimbang keturunan standar? Yen ukuran sampel kita gedhe banget, diukur ing puluhan ewu nilai, iku Ngartekno luwih gampang kanggo proses, ngomong, sampel acak saka sewu mau saka kabeh sampel. Iki ngendi keturunan gradient stokastik teka menyang muter. Ing kasus kita, kita mesthi ora bakal weruh akeh prabΓ©dan.

Ayo katon ing kode.

Kode kanggo turunan gradient stokastik

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ стох.Π³Ρ€Π°Π΄.шага
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])

Ngrampungake persamaan regresi linier prasaja

Kita katon rapet ing koefisien lan nemokake dhéwé takon, "Kepiye iki bisa?" Kita wis entuk nilai koefisien sing beda. Ngrampungake persamaan regresi linier prasaja и Ngrampungake persamaan regresi linier prasajaMbok menawa keturunan kecerunan stokastik nemokake paramèter persamaan sing luwih optimal? Sayange, ora. Cukup deleng jumlah panyimpangan kuadrat lan deleng yen kanthi nilai koefisien anyar, kesalahane luwih gedhe. Ayo ora kentekan niat. Ayo plot grafik saka owah-owahan kesalahan.

Kode kanggo jumlah plot penyimpangan kuadrat ing turunan gradient stokastik

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

Grafik #5: "Jumlah penyimpangan kuadrat ing turunan gradient stokastik"

Ngrampungake persamaan regresi linier prasaja

Deleng ing grafik, kabeh wis ana lan saiki kita bakal ndandani kabeh.

Dadi, apa sing kedadeyan? Ing ngisor iki kedadeyan. Nalika kita milih sasi kanthi acak, algoritma kita ngupaya nyuda kesalahan ing pitungan revenue kanggo sasi kasebut. Banjur kita pilih sasi liyane lan baleni pitungan, nanging kita nyuda kesalahan kanggo sasi kapindho sing dipilih. Saiki elinga yen rong sasi kapisan kita nyimpang sacara signifikan saka persamaan regresi linier sing prasaja. Iki tegese nalika kita milih salah siji saka rong sasi iki, kanthi ngurangi kesalahan kanggo saben, algoritma kita Ngartekno nambah kesalahan kanggo kabeh sampel. Dadi apa sing kudu kita lakoni? Jawaban iki prasaja: kita kudu ngurangi langkah keturunan. Sawise kabeh, kanthi nyuda langkah mudhun, kesalahan uga bakal mandheg mlumpat munggah lan mudhun. Utawa, kesalahan ora bakal mandheg mlumpat, nanging bakal ditindakake kanthi cepet. Ayo priksa.

Kode kanggo mbukak SGD kanthi langkah sing luwih cilik

# запустим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ² шаг Π² 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()

Ngrampungake persamaan regresi linier prasaja

Grafik #6: "Jumlah penyimpangan kuadrat ing turunan gradient stokastik (80 langkah)"

Ngrampungake persamaan regresi linier prasaja

Nilai koefisien wis apik, nanging isih durung sampurna. Kanthi hipotesis, iki bisa didandani kanthi cara ing ngisor iki. Contone, kita bakal milih nilai koefisien kanggo 1000 iterasi pungkasan sing ngasilake kesalahan minimal. Nanging, kanggo nindakake iki, kita kudu ngrekam nilai koefisien dhewe. Kita ora bakal nindakake; tinimbang, ayo kang katon ing graph. Katon lancar, lan kesalahan katon mudhun kanthi rata. Ing kasunyatan, iki ora. Ayo ndeleng 1000 iterasi pisanan lan mbandhingake karo sing pungkasan.

Kode kanggo grafik SGD (1000 langkah pisanan)

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

Grafik #7 "Jumlah sisihan kuadrat SGD (1000 langkah pisanan)"

Ngrampungake persamaan regresi linier prasaja

Bagan #8 "Jumlah SGD saka Penyimpangan Kuadrat (1000 Langkah Terakhir)"

Ngrampungake persamaan regresi linier prasaja

Ing awal banget mudhun, kita mirsani nyuda cukup mantep lan tajem ing kesalahan. Ing pengulangan final, kita waca sing kesalahan fluctuates watara 1,475 lan ing sawetara titik malah padha karo Nilai optimal iki, nanging banjur isih munggah ... Maneh, kita bisa ngrekam nilai koefisien. Ngrampungake persamaan regresi linier prasaja ΠΈ Ngrampungake persamaan regresi linier prasaja, banjur pilih sing duwe kesalahan paling sithik. Nanging, kita nemoni masalah sing luwih serius: kita kudu nindakake 80 langkah (deleng kode) kanggo entuk nilai sing paling optimal. Iki mbantah ide kanggo ngirit wektu komputasi kanthi turunan gradient stokastik dibandhingake karo turunan gradien. Apa sing bisa didandani lan didandani? Iku gampang kanggo ndeleng sing ing iterasi pisanan, kita ajeg obah mudhun, lan mulane, kita kudu tetep ukuran langkah gedhe kanggo iterasi pisanan lan ngurangi nalika kita maju. Kita ora bakal nindakake ing artikel iki - wis cukup suwe. Sing pengin bisa ngerteni dhewe; ora angel.

Saiki ayo nindakake turunan gradient stokastik nggunakake perpustakaan NomPy (lan aja nganti kesandhung ing watu sing wis dingerteni sadurunge)

Kode kanggo turunan gradient stokastik (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

Ngrampungake persamaan regresi linier prasaja

Nilai-nilai kasebut meh padha karo nalika mudhun tanpa nggunakake NomPy. Nanging, iki logis.

Ayo goleki sepira suwene turune kecerunan stokastik.

Kode kanggo nemtokake wektu komputasi SGD (80 ewu langkah)

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)

Ngrampungake persamaan regresi linier prasaja

Luwih menyang alas, awan sing luwih peteng: sepisan maneh, rumus "digawe omah" nuduhake asil sing paling apik. Kabeh iki nuduhake yen kudu ana cara sing luwih halus kanggo nggunakake perpustakaan. NomPy, sing tenan nyepetake operasi komputasi. Kita ora bakal sinau babagan iki ing artikel iki. Iku bakal menehi sampeyan mikir babagan ing wektu luang. :)

Ringkesan

Sadurunge nyimpulake, aku pengin mangsuli pitakon sing ditakoni para pamaca. Kok repot-repot karo turunan? Yagene kita kudu mlaku munggah lan mudhun gunung (biasane mudhun) kanggo nemokake titik kurang coveted, nalika kita duwe piranti kuat lan prasaja ing tangan kita, solusi analitis, sing langsung teleports kita menyang lokasi sing dikarepake?

Jawaban kanggo pitakonan iki ketok. Kita mung ndeleng conto sing gampang banget sing jawabane bener Ngrampungake persamaan regresi linier prasaja gumantung ing siji tandha Ngrampungake persamaan regresi linier prasajaIki dudu perkara sing asring sampeyan temoni ing urip nyata, mula bayangake manawa kita duwe 2, 30, 50, utawa luwih akeh fitur. Tambah ewu, malah puluhan ewu, nilai kanggo saben fitur. Ing kasus iki, solusi analitis bisa gagal lan gagal. Katurunan gradien lan variasi, ing tangan liyane, bakal alon-alon nanging mesthi nggawa kita nyedhaki goal kita-minimal fungsi. Lan aja kuwatir babagan kacepetan - kita mesthi bakal njelajah cara sing ngidini kita nyetel lan nyetel dawa langkah (yaiku, kacepetan).

Lan saiki ringkesan ringkes.

Kaping pisanan, muga-muga materi sing disedhiyakake ing artikel kasebut bakal mbantu para ilmuwan data wiwit ngerti carane ngatasi persamaan regresi linier sing prasaja (lan ora mung).

Kapindho, kita wis ndeleng sawetara cara kanggo ngatasi persamaan kasebut. Saiki, gumantung saka kahanan, kita bisa milih sing paling cocog karo tugas sing ditindakake.

Katelu, kita wis ndeleng kekuwatan setelan tambahan, yaiku dawa langkah keturunan gradien. Parameter iki ora kudu diabaikan. Kaya sing kasebut ing ndhuwur, kanggo nyuda biaya komputasi, dawa langkah kudu disetel nalika mudhun.

Papat, ing kasus kita, fungsi "ditulis ing omah" nuduhake wektu komputasi sing luwih apik. Iki bisa uga amarga panggunaan perpustakaan sing kurang profesional. NomPyNanging apa wae, kesimpulan ing ngisor iki jelas. Ing tangan siji, kadhangkala worth takon panemu sing wis mapan, nanging ing sisih liyane, iku ora tansah worth overcomplicating iku - ing nalisir, kadhangkala solusi prasaja kanggo masalah dadi luwih efektif. Lan amarga tujuane kanggo nliti telung pendekatan kanggo ngrampungake persamaan regresi linier sing sederhana, nggunakake fungsi "gawean omah" cukup cukup.

Sastra (utawa sapanunggalane)

1. Regresi linier

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

2. Metode kuadrat paling sithik

mathprofi.ru/metod_naimenshih_kvadratov.html

3. Turunan

www.mathprofi.ru/chastnye_proizvodnye_primery.html

4. Gradien

mathprofi.ru/proizvodnaja_po_napravleniju_i_gradient.html

5. Keturunan gradien

habr.com/en/post/471458

habr.com/en/post/307312

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

6. Pustaka 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

Tuku hosting sing dipercaya kanggo situs kanthi proteksi DDoS, server VPS VDS πŸ”₯ Tuku hosting situs web sing bisa dipercaya nganggo proteksi DDoS, server VPS VDS | ProHoster