Solvendo aequationem regressuum simplicium linearium

Articulus pluribus modis tractat determinare aequationem mathematicam simplicis (pared) regressionis lineam.

Omnes methodi solvendi aequationem hic tractatam fundantur in minimis quadratis methodi. Eamus modos modos:

  • Analytica solutio
  • Gradiente Descensu
  • Descensus stochastic CLIVUS

Uterque modus solvendi aequationis rectae, articulus varias functiones praebet, quae maxime dividuntur in ea quae scripta sunt sine bibliotheca. numpy et qui usus ad calculos numpy. Creditur usus peritus numpy computatis costs redigendum erit.

Totum codicem datum in articulo lingua scriptum est python 2.7 apud Pentium Jupyter. The source code and file with sample data are posted on Github

Articulus magis intenditur ad tam incipientium quam ab iis qui gradatim iam inceperunt studium latissimum sectionis in artificiali intelligentia obtinere.

Ad materiam illustrandam simplicissimo exemplo utimur.

Exemplum conditionibus

Habemus quinque valores qui dependentiam designant Y ex X (Tabula No. 1);

Tabula No. 1 "Exemplum conditiones"

Solvendo aequationem regressuum simplicium linearium

Ponemus valores Solvendo aequationem regressuum simplicium linearium est mensis anni Solvendo aequationem regressuum simplicium linearium β€” reditus huius mensis. Id est, vectigal ex mense anni pendet Solvendo aequationem regressuum simplicium linearium β€” unicum signum ex quo vectigal dependet.

Exemplum sic est, tam ex parte dependentiae conditionalis reditus in mense anni, tum ex parte numeri valorum - paucissimi sunt. Sed talis simplicitas efficiet, ut aiunt, materiam ab incipientibus acquirendam non semper facile explicare. Et etiam simplicitas numerorum permittet eos qui exemplum in charta sine significantibus laboribus gratuita solvere volunt.

Ponamus exemplum dependentiae in exemplum satis bene approximari posse aequatione mathematicae simplicis (par) regressionis linea formae;

Solvendo aequationem regressuum simplicium linearium

quibus Solvendo aequationem regressuum simplicium linearium mensis est, in quo vectigal receptum est; Solvendo aequationem regressuum simplicium linearium β€” reditus ad mensem respondentem; Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium linearium regressio extimationis lineae sunt.

Nota quod coefficientes Solvendo aequationem regressuum simplicium linearium saepe clivum vel clivum extimationis linea appellatur; significat quantitatem qua Solvendo aequationem regressuum simplicium linearium cum mutat Solvendo aequationem regressuum simplicium linearium.

Uti patet, munus nostrum in exemplo est tales coefficientes in aequatione deligere Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium lineariumin quibus deflexionum nostrarum per mensem a veris responsionibus computata valorum reddituum, i.e. valores in sample exhibitis minimi erunt.

Quadratus modus minimus

Secundum modum quadratis minimis, declinatio calculi quadrandi est. Haec ars tibi concedit ut indultum deviationes mutuae vitentur, si signa opposita habent. Verbi gratia, si in uno casu declinatio est +5 (Quinque), et in aliis -5 tunc summa errorum invicem se destruent et summam 0 (nullam). Fieri non potest ut deviationem quadrare, sed uti moduli proprietate, et tunc omnes errores positivi erunt et accumulabunt. Non singillatim hoc loco immoramur, sed simpliciter indicamus, quod ad calculi commodum solet declinationis quadrare.

Haec est formula similis quacum minimum deflexionum quadratarum determinabimus.

Solvendo aequationem regressuum simplicium linearium

quibus Solvendo aequationem regressuum simplicium linearium functio approximationis verorum responsionum est (id est reditus computavimus);

Solvendo aequationem regressuum simplicium linearium sunt vera responsa (revenue provisum in sample);

Solvendo aequationem regressuum simplicium linearium est specimen index (numerus mensis in quo declinatio determinatur)

Munus differamus, partiales aequationes differentiales definiamus, et ad solutionem analyticam progredi parati sint. Sed primum quid differentiae sit brevem excursionem sumamus, et geometricam significationem derivati ​​meminerimus.

Differentia

Differentia est operatio inveniendi inde functionis.

Quid est inde pro? Inde functionis ratem mutati muneris notat atque eius directionem docet. Si in dato puncto positivo derivativum est, munus augetur, secus munus decrescit. Quo maior utilitas derivativae absolutae, altior rate mutationis valorum functionis, ac altior scopuli functionis graphi.

Exempli gratia, sub condicionibus systematis coordinationis Cartesianae, valor inde in puncto M (0,0) aequalis est. + 25 significat quod ad datum punctum, cum valor bipertitus est Solvendo aequationem regressuum simplicium linearium ad dextram per conventional unitas, valorem Solvendo aequationem regressuum simplicium linearium auget XXV unitates conventional. In lacinia purus spectat quasi satis ardua in bonis oriuntur Solvendo aequationem regressuum simplicium linearium ex dato.

Aliud exemplum. Valor inde est aequalis -0,1 significat quod cum moti sunt Solvendo aequationem regressuum simplicium linearium per unum conventional unitas, valorem Solvendo aequationem regressuum simplicium linearium 0,1 unitas conventional modo decrescat. Eodem tempore, in graphe functionis, vix conspici potest prono loco notabilis. Cum monte analogiam ducentes, id est ac si lentissime declivis de monte descendimus, dissimili exemplo praecedenti, ubi cacumina praerupta ascendimus :)

Et sic, post differentiam functionis Solvendo aequationem regressuum simplicium linearium per odds Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium lineariumordinem aequationum differentialium partialium definimus. Post aequationes determinandas, systema duarum aequationum accipiemus, solvendo quas tales valores coefficientium eligere poterimus. Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium lineariumunde valores derivatorum in datis punctis valde mutatis respondentium, minimo et in casu solutionis analyticae prorsus non mutantur. Aliis verbis, error functionis in coefficientibus inventis minimum perveniet, cum valores derivatorum partialium in his punctis aequales erunt nihilo.

Secundum regulas igitur differentiae, aequatio derivativa partialis ordinis primi respectu coΓ«fficientis Solvendo aequationem regressuum simplicium linearium forma erit;

Solvendo aequationem regressuum simplicium linearium

1st ordo partialis aequationis derivativae respectu to Solvendo aequationem regressuum simplicium linearium forma erit;

Solvendo aequationem regressuum simplicium linearium

Quam ob rem systema aequationum quae solutionem analyticam satis simplicem habet, recipimus;

incipe aequationem
incipe
na + bsumlimits_{i=1}^nx_i β€” sumlimits_{i=1}^ny_i = 0

sumlimits_{i=}^nx_i(a + bsumlimits_{i=1}^nx_i β€” sumlimits_{i=}^ny_i) = 1
finis
finem aequationis

Priusquam aequationem solvas, preload, reprehendo quod oneratio recta est et notitia format.

Loading et formatting notitia

Notandum est quod propter hoc quod ad solutionem analyticam, et postea pro descensu gradiente et stochastico, in duobus variationibus codice utemur, utentes bibliotheca. numpy et sine utendo, tunc opportuna notitia formatura egebimus (vide codicem).

Data loading et dispensando codice

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

visualization

Nunc, postquam notitias primum oneratis, secundo rectitudinem onerandi cohibuimus, ac demum datas formatos, primum visualizationem peragemus. Ratio saepe usus est ad hoc pairplot bibliothecam seaborn. In nostro exemplo ob numeros limitatos nihil attinet bibliothecae usus seaborn. Nos bibliothecam regularis utere matplotlib' et vide in scatterplot.

Scatterplot code

print 'Π“Ρ€Π°Ρ„ΠΈΠΊ β„–1 "Π—Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠΈ ΠΎΡ‚ мСсяца Π³ΠΎΠ΄Π°"'

plt.plot(x_us,y_us,'o',color='green',markersize=16)
plt.xlabel('$Months$', size=16)
plt.ylabel('$Sales$', size=16)
plt.show()

Chart N. 1 "Dependentia redituum in mense anni"

Solvendo aequationem regressuum simplicium linearium

Analytica solutio

Utamur instrumenta communissima in python et systema aequationum solve;

incipe aequationem
incipe
na + bsumlimits_{i=1}^nx_i β€” sumlimits_{i=1}^ny_i = 0

sumlimits_{i=}^nx_i(a + bsumlimits_{i=1}^nx_i β€” sumlimits_{i=}^ny_i) = 1
finis
finem aequationis

Secundum Crameri regulae inveniemus determinatum generalem ac determinantes Solvendo aequationem regressuum simplicium linearium et ex Solvendo aequationem regressuum simplicium lineariumpost quem, dividens determinat Solvendo aequationem regressuum simplicium linearium ad determinatio generalis - invenire coefficientem Solvendo aequationem regressuum simplicium lineariumsimiliter invenimus coefficientem Solvendo aequationem regressuum simplicium linearium.

Solutio analytica codice

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

Hic est quod cepimus;

Solvendo aequationem regressuum simplicium linearium

Igitur inventae valores coΓ«fficientium, constituitur summa duplicata errorum. Rectam lineam spargamus histogrammis secundum coefficientes inventis.

Regressionem linea codice

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для формирования массива рассчСтных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠΈ
def sales_count(ab,x,y):
    line_answers = []
    [line_answers.append(ab[0]+ab[1]*x[i]) for i in range(len(x))]
    return line_answers

# построим Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ
print 'Π“Ρ€Ρ„ΠΈΠΊβ„–2 "ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΈ расчСтныС ΠΎΡ‚Π²Π΅Ρ‚Ρ‹"'
plt.plot(x_us,y_us,'o',color='green',markersize=16, label = '$True$ $answers$')
plt.plot(x_us, sales_count(ab_us,x_us,y_us), color='red',lw=4,
         label='$Function: a + bx,$ $where$ $a='+str(round(ab_us[0],2))+',$ $b='+str(round(ab_us[1],2))+'$')
plt.xlabel('$Months$', size=16)
plt.ylabel('$Sales$', size=16)
plt.legend(loc=1, prop={'size': 16})
plt.show()

Chart No. 2 "Recte et ratione responsa"

Solvendo aequationem regressuum simplicium linearium

Inspicere potes lacinia purus pro cuiusque mensis declinationis. In nobis, nullum momentum practicum ex eo accipiemus, sed curiositati satisfaciemus quomodo simplex regressio linearis aequationis dependentiam reditus mense anni designat.

Deviationis chart codice

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

Chart No. 3 "Deviationes, %"

Solvendo aequationem regressuum simplicium linearium

Non perfectum, sed negotium nostrum perfecit.

Munus quod scribamus, coefficientes determinare Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium linearium utitur bibliotheca numpypressius scribemus duas functiones: unam utens matrice pseudoinversa (non in praxi commendatur, cum processus computationaliter sit complexus et instabilis), alterum utens aequatione matricis.

SOLUTIO Analytica Codicis (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

Conferamus tempus determinatum coefficientium Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium lineariumservato III modos.

Code ad colligendum tempus

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)

Solvendo aequationem regressuum simplicium linearium

Cum parva notitia copia, munus "se-scriptum" praecedit, quod coefficientes methodo Crameri usus invenit.

Nunc ad alios vias transire coefficientes invenire potes Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium linearium.

Gradiente Descensu

Primum quid sit clivus definiamus. Plane, clivus segmentum est quod directionem maximi incrementi functionis indicat. Et similiter per montem ascensus, ubi gradiens facies est ubi altissimus ascenditur ad cacumen montis. Exemplum cum monte enucleans, meminimus quidem altissimo descensu indigere ut quam celerrime perveniat ad ima, id est minima, locum ubi munus non augetur vel minuitur. Hic erit derivativus nihilo aequalis. Ergo non opus est clivo, sed antigradiente. Ad inveniendam antigradientem vos iustus postulo ut crescat in clivum -1 (minus unus).

Animadvertemus hoc munus habere plura minima posse, et descendendo in unum utens algorithmo infra proposita, non valemus aliud minimum invenire, quod sit infra repertum. Relaxemus, hoc nobis non minatur! In casu nostro de uno minimo agitur, cum munus nostrum Solvendo aequationem regressuum simplicium linearium in graph est parabola regularis. Et quia optime novimus omnes e nostra schola mathematici, parabola unum tantum minimum habet.

Postquam invenimus cur opus sit clivo, tum quod gradiens sit segmentum, hoc est, vector cum coordinatis datis, quae plane idem sunt coefficientes. Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium linearium descensus efficere possumus.

Priusquam incipias, moneo paucas sententias de algorithmo descensu legere:

  • Coordinatas coefficientium in pseudo-passim modo statuimus Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium linearium. In exemplo nostro coefficientes prope nulla determinabimus. Hoc commune est, sed suam quisque causam habeat praxim.
  • Ex coordinare Solvendo aequationem regressuum simplicium linearium aufer valorem ex 1 ordinis partialis derivativae ad punctum Solvendo aequationem regressuum simplicium linearium. Si igitur positivus derivativus est, munus augetur. Ergo subtrahendo valorem inde, movebimus in oppositum augmenti, scilicet in directione descensus. Si derivativa negativa est, munus hic decrescit et subtrahendo valorem inde movemur in directione descensus.
  • Similem operationem cum coordinatione exequimur Solvendo aequationem regressuum simplicium linearium: detrahe valorem derivativum partialis in puncto Solvendo aequationem regressuum simplicium linearium.
  • Ut minimum non transilire et in altum spatium volare, necesse est gradum magnitudinis in directione descensus ponere. In genere, totum articulum scribere potuisti quomodo gradum recte constituas et quomodo illum in processu descensu mutes ut sumptus computationales reducere possis. Nunc autem paulo aliud negotium ante nos habemus et gradum amplitudinis utendo methodo scientifica "poke" vel, ut vulgo loquuntur, empirice statuemus.
  • Cum sumus ex coordinatis datis Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium linearium valores derivatorum minue, novos coordinatas accipimus Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium linearium. Proximum gradum sumimus iam ex coordinatis computatis. Et sic iterum iterumque incipit cyclus, donec confluentia debita perficiatur.

Omnis! Nunc parati sumus ad profundissimam fossam Marianae fossae quaerendam. Incipiamus.

Code for gradiente descensu

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

Solvendo aequationem regressuum simplicium linearium

Ad ipsum fundum fossae Marianae iactivimus et ibi omnes valores coefficientes invenimus Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium lineariumquod ipsum erat expectandum.

Alterum dive capiamus, hoc solum tempore, vehiculum altum nostrum cum aliis technologiae technologiae implebitur, nempe bibliotheca. numpy.

Code for gradiente descensu (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

Solvendo aequationem regressuum simplicium linearium
Valores coefficientes Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium linearium immutabilis.

Intueamur quomodo error mutatur in descensu gradiente, hoc est, quomodo summa deflexionum quadrata cum singulis passibus mutatur.

Code consilium summae quadratorum deflexionum perspiciantur

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

Aliquam lacinia purus n.

Solvendo aequationem regressuum simplicium linearium

In grapho videmus singulos gradus decrescere error, et post aliquot iterationes lineam paene horizontalem observamus.

Denique differentiam in codice exsecutionis temporis sestimamus:

Codicem statuere descensum calculi tempore gradientis

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)

Solvendo aequationem regressuum simplicium linearium

Fortasse aliquid mali facimus, sed munus est simplex "domus-scriptum" quod bibliotheca non utitur numpy outperforms calculi tempus functionis in bibliotheca numpy.

Nos autem non subsistimus, sed ad aliam viam excitandam discendam impellimur ad aequationem simplicem regressionem linearem solvendam. Dignum!

Descensus stochastic CLIVUS

Ut cito intelligat principium operationis descensus stochastici gradientis, melius est eius differentias a gradiente ordinario descensu determinare. Nos in descensu gradiente, in aequationibus derivatorum Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium linearium summae valorum omnium lineamentorum ac veri responsionum in sample praesto (id est, summarum omnium" Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium linearium). In descensu stochastico gradiente, valores omnes in sample praesentes non adhibebimus, sed pseudo-passim eligimus, qui vocantur index sample et utimur suis valoribus.

Exempli gratia, si index numerus 3 (tres) determinatus est, tum valores accipiamus Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium lineariumtunc valores in aequationibus derivatis substituimus ac novas coordinatas determinamus. Deinde, determinatis coordinatis, iterum pseudo-passim indicem speciminum decernimus, valores in aequationes differentiales partiales indice respondentes substituimus ac coordinatas novo modo determinamus. Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium linearium etc. donec concursus virescit. In prima specie, non videri potest hoc omnino operari, sed facit. Verum est notatu dignum quod error non omni gradu decrescat, sed certe tendentia est.

Quae sunt commoda stochastici clivi descensus super placitum unum? Si magnitudo exempli nostri maxima est et mensurata in decem milibus valorum, multo facilius est ad processum, dicendo, temere milia eorum, quam totum specimen. Hoc est, ubi descensus stochasticus gradientis iungitur. In casu nostro, sane multum differentiae non animadvertimus.

Inspice codicem.

Code for stochastic CLIVUS descensus

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

Solvendo aequationem regressuum simplicium linearium

Diligenter inspicimus coefficientes nosmet ipsos capientes quaerentes quaestionem Β« Quomodo hoc fieri potest? Venimus alia valores coefficientes Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium linearium. Fortasse descensus stochasticus clivus meliorem parametris meliorem inuenit pro aequatione? Quod valde dolendum non. Satis est summam errorum quadratorum inspicere et videre novis valoribus coefficientium maiorem esse errorem. Non properamus desperare. Aliquam lacinia purus consequat error consequat.

Codex ad insidiandum summae deflexionum quadratarum in descensu clivo stochastico

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

Aliquam lacinia purus No. 5 "Summa deflexionum quadratarum in descensu stochastic gradientis"

Solvendo aequationem regressuum simplicium linearium

Spectantes cedulam, omnia in locum cadunt et nunc omnia figemus.

Quid igitur factum est? sequentia facta sunt. Cum passim mensem eligimus, tunc pro mense delecto algorithmus nostrum errorem in vectigalibus computandis minuere quaerit. Deinde alterum mensem eligimus et calculum repetimus, sed errorem in alterum mensem delectum reducimus. Nunc mementote duos primos menses signanter a linea regressionis simplicis linearis deflectere. Hoc significat, cum aliquis ex duobus mensibus deligitur, errorem cuiusque eorum minuendo, nostrum algorithmus errorem pro integritate exempli serio auget. Quid igitur faciam? Responsio simplex est: debes gradum descensum reducere. Post omnes, descensum gradum reducendo, error etiam "silire" et descendere desinet. Vel potius error "silire" non cessabit, sed non tam cito:) Reprehendo.

Codex currere SGD minoribus incrementis

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

Solvendo aequationem regressuum simplicium linearium

Aliquam lacinia purus No. 6 "Summa deflexionum quadratarum in descensu stochastic gradientis (80 mille gradibus)"

Solvendo aequationem regressuum simplicium linearium

Emendarunt nnn, sed adhuc non sunt ideales. Hypothetice hoc modo corrigi potest. Eligemus, exempli gratia, in ultimis 1000 iterationibus valores coefficientium quibus minimus error factus est. Verum, ad hoc etiam ipsi valores coΓ«fficientium scribere debebimus. Hoc non faciemus, sed potius cedulam attendimus. Spectat lenis, et aequaliter decrescere error videtur. Profecto hoc non est verum. Inspiciamus primum 1000 iterationes et eas cum ultimis confer.

Code for SGD chart (prima 1000 vestigia)

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

Aliquam lacinia purus No.

Solvendo aequationem regressuum simplicium linearium

Aliquam lacinia purus N. 8 "SGD deflexionum quadratarum summarum (vestigiorum 1000)"

Solvendo aequationem regressuum simplicium linearium

In ipso exordio descensus satis aequabilis et praeceps error observamus decrementa. In ultimis iterationibus videmus errorem circuire et circa valorem 1,475 et in quibusdam momentis etiam hanc meliorem valorem aequare, sed tunc adhuc ascendit... Iterum dico, valores ipsius scribere potes. coefficientes Solvendo aequationem regressuum simplicium linearium ΠΈ Solvendo aequationem regressuum simplicium lineariumet eligendi ea error minima enim. Tamen problema gravius ​​habuimus: LXXX milia passum (vide codicem) accipere debebamus ut bona proxima ad optimales perveniamus. Et hoc iam repugnat rationi computandi tempus servandi cum descensu clivo stochastico relativo ad descensum clivum. Quid corrigi et emendari potest? Haud difficile est animadvertere in primis iterationibus confidenter descendere ac proinde in primis iterationibus magnum gradum relinquere ac gradum progrediendo reducere. Nolumus hoc in hoc articulo - iam nimis longum est. Qui hoc facere sibi volunt, cogitare non difficile est :)

Nunc agamus descensus stochastic clivos utens bibliotheca numpy (et non offendamus super lapides quos antea notavimus)

Code for Stochastic Gradiente Descensu (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

Solvendo aequationem regressuum simplicium linearium

Valores evasit eaedem fere ac sine usu descendentes numpy. Sed haec logica est.

Inueniamus quam diu descensus stochastici cliuos nos susceperint.

Codex ad determinandum SGD tempus calculi (80 mille gradus)

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)

Solvendo aequationem regressuum simplicium linearium

Longius in silvam, nubes obscuriores: iterum formula "se-scripta" optimum exitum ostendit. Haec omnia suggerit subtilioribus etiam modis uti bibliotheca numpyquae quidem computationem accelerent. Nolumus in hoc articulo de illis. Erit aliquid cogitandum in vacat :)

Summatim

Priusquam perstringamus, quaestioni respondere velim, quam maxime a lectore nostro probabile est ortam. Cur, revera, talis "tortura" cum descensu, cur montem sursum ac deorsum (plerumque descendens) opus est ut campestrem thesaurum inveniamus, si tantam vim ac simplicem machinam in manibus habemus. forma solutionis analyticae, quae nos statim perspicit ad locum?

Responsio huius quaestionis est in superficie. Nunc inspeximus exemplum simplicissimum, in quo vera responsio est Solvendo aequationem regressuum simplicium linearium pendent uno signo Solvendo aequationem regressuum simplicium linearium. Hoc saepe in vita non vides, ut putes nos habere signa 2, 30, 50 vel plura. His mille vel etiam decem milia valorum pro singulis attributis adde. In hoc casu, solutio analytica non potest sustinere tentationem et defectum. Iamvero descensus gradiens eiusque variationes lente sed certe propius nos adducunt ad finem - minimum functionis. Et celeritatem non cures - probabiliter videbimus vias quae nos passum longitudinis (id est velocitatis) disponere et ordinare sinunt.

Jamque ipsa brevis summa est.

Primo, spero quod materialia in articulo exhibita adiuvabunt principium "datae phisicae" ad intelligendum quomodo solutionem simplicem (et non solum) lineares aequationes procedere.

Secundo, pluribus modis ad aequationem solvendam inspeximus. Nunc, pro rerum condicione, eligere possumus id quod maxime convenit ad problema solvendum.

Tertio vidimus virtutem accessionis occasus, scilicet descensus gradus longitudinis gradientis. Hic modulus negligendus non est. Sicut supra dictum est, ad reducendum sumptus calculi, debet immutari gradus longitudinis in descensu.

Quarto, in nobis functiones "domus-scriptas" optime ostendit eventus ad calculos. Hoc verisimile est ex usu maxime professio facultatum bibliothecae numpy. Sed ut sit, haec conclusio se suggerit. Ex altera parte, interdum valet percontationes opiniones constitutas, ex altera vero parte, non semper omnia intricata β€” e contra, interdum simplicior solvendae quaestionis modus efficacior est. Et cum propositum nobis esset tres aditus resolvere ad aequationem simplicem regressionem linearem solvendam, usus functionum "auto-scriptorum" satis nobis fuit.

Litterae (vel aliquid tale)

Linearibus 1. procedere

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

2. quadrata minime modum

mathprofi.ru/metod_naimenshih_kvadratov.html

3. Derivative

www.mathprofi.ru/chastnye_proizvodnye_primery.html

4. Gradiente

mathprofi.ru/proizvodnaja_po_napravleniju_i_gradient.html

5. Gradiente descensu

habr.com/en/post/471458

habr.com/en/post/307312

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

6. NumPy bibliotheca

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