Idogba idogba ti o rọrun laini ipadasẹhin

Nkan naa jiroro lori awọn ọna pupọ lati pinnu idogba mathematiki ti laini ipadasẹhin ti o rọrun (so pọ).

Gbogbo awọn ọna ti ipinnu idogba ti a jiroro nibi da lori ọna awọn onigun mẹrin ti o kere julọ. Jẹ ki a ṣe akiyesi awọn ọna wọnyi:

  • Analitikali ojutu
  • Isọkalẹ Ilọsiwaju
  • Sitokasitik gradient iran

Fun ọna kọọkan ti ipinnu idogba ti laini taara, nkan naa pese awọn iṣẹ lọpọlọpọ, eyiti o pin ni pataki si awọn ti a kọ laisi lilo ile-ikawe Nọmba ati awọn ti o lo fun isiro Nọmba. O gbagbọ pe lilo ọgbọn Nọmba yoo dinku awọn idiyele iširo.

Gbogbo koodu ti a fun ni nkan naa ni a kọ sinu ede naa ere 2.7 lilo Iwe Jupyter Jupyter. Awọn koodu orisun ati faili pẹlu awọn ayẹwo data ti wa ni Pipa lori Github

Nkan naa jẹ ifọkansi diẹ sii si awọn olubere mejeeji ati awọn ti o ti bẹrẹ ni diėdiė lati kọ ẹkọ ti apakan gbooro pupọ ni oye atọwọda - ẹkọ ẹrọ.

Nado basi zẹẹmẹ nudọnamẹ lọ tọn, mí yí apajlẹ he bọawu de zan.

Awọn ipo apẹẹrẹ

A ni awọn iye marun ti o ṣe afihan igbẹkẹle Y lati X (Tabili No. 1):

Tabili No. 1 "Awọn ipo apẹẹrẹ"

Idogba idogba ti o rọrun laini ipadasẹhin

A yoo ro pe awọn iye Idogba idogba ti o rọrun laini ipadasẹhin ni osu ti odun, ati Idogba idogba ti o rọrun laini ipadasẹhin - wiwọle yi oṣù. Ni awọn ọrọ miiran, owo-wiwọle da lori oṣu ti ọdun, ati Idogba idogba ti o rọrun laini ipadasẹhin - awọn nikan ami lori eyi ti wiwọle da.

Apẹẹrẹ jẹ bẹ bẹ, mejeeji lati oju wiwo ti igbẹkẹle ipo ti owo-wiwọle lori oṣu ti ọdun, ati lati oju-ọna ti nọmba awọn iye - diẹ ninu wọn wa. Sibẹsibẹ, iru simplification kan yoo jẹ ki o ṣee ṣe, bi wọn ti sọ, lati ṣe alaye, kii ṣe nigbagbogbo pẹlu irọrun, awọn ohun elo ti awọn olubere ṣepọ. Ati pe o rọrun ti awọn nọmba naa yoo gba awọn ti o fẹ lati yanju apẹẹrẹ lori iwe laisi awọn idiyele iṣẹ pataki.

Jẹ ki a ro pe igbẹkẹle ti a fun ni apẹẹrẹ le jẹ isunmọ daradara nipasẹ idogba mathematiki ti laini ipadasẹhin ti o rọrun (so pọ) ti fọọmu naa:

Idogba idogba ti o rọrun laini ipadasẹhin

nibi ti Idogba idogba ti o rọrun laini ipadasẹhin ni oṣu ti a ti gba owo-wiwọle, Idogba idogba ti o rọrun laini ipadasẹhin - owo ti n wọle ni ibamu si oṣu, Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin jẹ awọn iṣiro ifasilẹyin ti laini ifoju.

Akiyesi pe olùsọdipúpọ Idogba idogba ti o rọrun laini ipadasẹhin igba ti a npe ni ite tabi gradient ti awọn ifoju ila; duro iye nipa eyi ti awọn Idogba idogba ti o rọrun laini ipadasẹhin nigbati o ba yipada Idogba idogba ti o rọrun laini ipadasẹhin.

O han ni, iṣẹ-ṣiṣe wa ninu apẹẹrẹ ni lati yan iru awọn iye-iye ninu idogba Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin, ninu eyiti awọn iyapa ti awọn iye owo-wiwọle iṣiro wa nipasẹ oṣu lati awọn idahun otitọ, ie. awọn iye ti a gbekalẹ ninu ayẹwo yoo jẹ iwonba.

Ọna square ti o kere julọ

Ni ibamu si ọna awọn onigun mẹrin ti o kere ju, iyatọ yẹ ki o ṣe iṣiro nipasẹ squaring. Ilana yii gba ọ laaye lati yago fun ifagile ifagile ti awọn iyapa ti wọn ba ni awọn ami idakeji. Fun apẹẹrẹ, ti o ba jẹ ninu ọran kan, iyapa jẹ +5 (pẹlu marun), ati ninu awọn miiran -5 (iyokuro marun), lẹhinna apao awọn iyapa yoo fagile ara wọn jade ati iye si 0 (odo). O ko ni lati ṣe iwọn iyapa, ṣugbọn lo ohun-ini modulus lẹhinna gbogbo awọn iyapa yoo jẹ rere ati pe yoo kojọpọ. A kii yoo gbe lori aaye yii ni awọn alaye, ṣugbọn tọka nirọrun pe fun irọrun ti awọn iṣiro, o jẹ aṣa lati ṣe iwọn iyapa naa.

Eyi ni ohun ti agbekalẹ naa dabi eyiti a yoo pinnu iye ti o kere julọ ti awọn iyapa onigun mẹrin (awọn aṣiṣe):

Idogba idogba ti o rọrun laini ipadasẹhin

nibi ti Idogba idogba ti o rọrun laini ipadasẹhin jẹ iṣẹ isunmọ ti awọn idahun otitọ (iyẹn ni, owo-wiwọle ti a ṣe iṣiro),

Idogba idogba ti o rọrun laini ipadasẹhin jẹ awọn idahun otitọ (owo ti a pese ninu apẹẹrẹ),

Idogba idogba ti o rọrun laini ipadasẹhin jẹ atọka apẹẹrẹ (nọmba ti oṣu ninu eyiti a ti pinnu iyapa)

Jẹ ki a ṣe iyatọ iṣẹ naa, ṣalaye awọn idogba iyatọ apakan, ki o si ṣetan lati lọ siwaju si ojutu itupalẹ. Ṣugbọn ni akọkọ, jẹ ki a ṣe irin-ajo kukuru kan nipa kini iyatọ jẹ ki a ranti itumọ jiometirika ti itọsẹ naa.

Iyatọ

Iyatọ jẹ iṣẹ ti wiwa itọsẹ ti iṣẹ kan.

Kini itọsẹ ti a lo fun? Itọsẹ ti iṣẹ kan ṣe afihan iwọn iyipada ti iṣẹ naa ati sọ fun wa itọsọna rẹ. Ti itọsẹ ni aaye ti a fun ni rere, lẹhinna iṣẹ naa pọ si; bibẹẹkọ, iṣẹ naa dinku. Ati pe iye ti itọsẹ pipe ti o ga julọ, iwọn iyipada ti awọn iye iṣẹ ti o ga julọ, bakanna bi steeper ite ti iwọn iṣẹ naa.

Fun apẹẹrẹ, labẹ awọn ipo ti eto ipoidojuko Cartesian, iye itọsẹ ni aaye M(0,0) jẹ dọgba si + 25 tumo si wipe ni a fi fun ojuami, nigbati awọn iye ti wa ni yi lọ yi bọ Idogba idogba ti o rọrun laini ipadasẹhin si ọtun nipa a mora kuro, iye Idogba idogba ti o rọrun laini ipadasẹhin pọ nipa 25 mora sipo. Lori eya aworan naa o dabi igbega giga ti o ga ni awọn iye Idogba idogba ti o rọrun laini ipadasẹhin lati a fi fun ojuami.

Apeere miiran. Iye itọsẹ jẹ dogba -0,1 tumo si wipe nigba ti nipo Idogba idogba ti o rọrun laini ipadasẹhin fun ọkan mora kuro, iye Idogba idogba ti o rọrun laini ipadasẹhin dinku nipa nikan 0,1 mora kuro. Ni akoko kanna, lori iyaya ti iṣẹ naa, a le ṣe akiyesi ite ti isalẹ ti ko ni akiyesi. Ti o ṣe afiwe pẹlu oke kan, o dabi ẹnipe a n sọkalẹ lọra pupọ lati oke kan, ko dabi apẹẹrẹ iṣaaju, nibiti a ni lati gun awọn oke giga pupọ :)

Nitorinaa, lẹhin iyatọ iṣẹ naa Idogba idogba ti o rọrun laini ipadasẹhin nipa awọn aidọgba Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin, a setumo 1st ibere apa kan iyato idogba. Lẹhin ti npinnu awọn idogba, a yoo gba eto ti awọn idogba meji, nipa ipinnu eyiti a yoo ni anfani lati yan iru awọn iye ti awọn iye-iye. Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin, fun eyiti awọn iye ti awọn itọsẹ ti o baamu ni awọn aaye fifun yipada nipasẹ iwọn pupọ, pupọ, ati ninu ọran ti ojutu itupalẹ ko yipada rara. Ni awọn ọrọ miiran, iṣẹ aṣiṣe ni awọn iyeida ti a rii yoo de o kere ju, nitori awọn iye ti awọn itọsẹ apakan ni awọn aaye wọnyi yoo dogba si odo.

Nitorinaa, ni ibamu si awọn ofin ti iyatọ, idogba itọsẹ apa kan ti aṣẹ 1st pẹlu ọwọ si olùsọdipúpọ Idogba idogba ti o rọrun laini ipadasẹhin yoo gba fọọmu:

Idogba idogba ti o rọrun laini ipadasẹhin

Idogba itọsẹ apa kan ibere pẹlu ọwọ si Idogba idogba ti o rọrun laini ipadasẹhin yoo gba fọọmu:

Idogba idogba ti o rọrun laini ipadasẹhin

Bi abajade, a gba eto awọn idogba kan ti o ni ojutu itupalẹ ti o rọrun kan:

bere {idogba*}
bẹrẹ{awọn ọran}
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
ipari{awọn ọran}
ipari {idogba*}

Ṣaaju ki o to yanju idogba, jẹ ki a ṣaju tẹlẹ, ṣayẹwo pe ikojọpọ naa tọ, ki o ṣe ọna kika data naa.

Ikojọpọ ati kika data

O yẹ ki o ṣe akiyesi pe nitori otitọ pe fun ojutu analitikali, ati atẹle naa fun isunmọ gradient ati stochastic gradient, a yoo lo koodu naa ni awọn iyatọ meji: lilo ile-ikawe Nọmba ati laisi lilo rẹ, lẹhinna a yoo nilo ọna kika data ti o yẹ (wo koodu).

Data ikojọpọ ati processing koodu

# импортируем все нужные нам библиотеки
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 '********************************************'

Wiwo

Bayi, lẹhin ti a ni, ni akọkọ, ti kojọpọ data, keji, ṣayẹwo deede ti ikojọpọ ati nikẹhin ṣe akoonu data naa, a yoo ṣe iworan akọkọ. Ọna ti a lo nigbagbogbo fun eyi ni ibi-meji .иблиотеки omi okun. Ninu apẹẹrẹ wa, nitori awọn nọmba to lopin, ko si aaye ni lilo ile-ikawe omi okun. A yoo lo ile-ikawe deede matplotlib ati ki o kan wo ni scatterplot.

Scatterplot koodu

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

Aworan No. 1 "Igbẹkẹle owo-wiwọle lori oṣu ti ọdun"

Idogba idogba ti o rọrun laini ipadasẹhin

Analitikali ojutu

Jẹ ki a lo awọn irinṣẹ ti o wọpọ julọ ni Python ati yanju eto awọn idogba:

bere {idogba*}
bẹrẹ{awọn ọran}
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
ipari{awọn ọran}
ipari {idogba*}

Ni ibamu si Cramer ká ofin a yoo ri gbogboogbo determinant, bi daradara bi awọn ipinnu nipa Idogba idogba ti o rọrun laini ipadasẹhin ati nipasẹ Idogba idogba ti o rọrun laini ipadasẹhin, lẹhin eyi, pinpin ipinnu nipasẹ Idogba idogba ti o rọrun laini ipadasẹhin si ipinnu gbogbogbo - wa olùsọdipúpọ Idogba idogba ti o rọrun laini ipadasẹhin, Bakanna a ri olùsọdipúpọ Idogba idogba ti o rọrun laini ipadasẹhin.

Analitikali ojutu koodu

# определим функцию для расчета коэффициентов 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)

Eyi ni ohun ti a ni:

Idogba idogba ti o rọrun laini ipadasẹhin

Nitorinaa, awọn iye ti awọn iye-iye ti a ti rii, apapọ awọn iyapa squared ti fi idi mulẹ. Jẹ ki a fa laini taara lori itan-akọọlẹ ti tuka ni ibamu pẹlu awọn iye-iye ti o rii.

Padasẹyin koodu ila

# определим функцию для формирования массива рассчетных значений выручки
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()

Aworan No. 2 “Awọn idahun ti o tọ ati iṣiro”

Idogba idogba ti o rọrun laini ipadasẹhin

O le wo aworan iyapa fun oṣu kọọkan. Ninu ọran wa, a ko ni gba eyikeyi idiyele iwulo pataki eyikeyi lati ọdọ rẹ, ṣugbọn a yoo ni itẹlọrun iwariiri wa nipa bawo ni deede idogba ipadasẹhin laini ti o rọrun ṣe afihan igbẹkẹle ti owo-wiwọle lori oṣu ti ọdun.

koodu iyapa chart

# определим функцию для формирования массива отклонений в процентах
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()

Àwòrán No. 3 "Awọn iyatọ,%"

Idogba idogba ti o rọrun laini ipadasẹhin

Ko pipe, ṣugbọn a pari iṣẹ wa.

Jẹ ki a kọ iṣẹ kan ti, lati pinnu awọn iye-iye Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin nlo ìkàwé Nọmba, diẹ sii ni deede, a yoo kọ awọn iṣẹ meji: ọkan nipa lilo matrix pseudoinverse (kii ṣe iṣeduro ni iṣe, niwon ilana naa jẹ iṣiro iṣiro ati riru), ekeji nipa lilo idogba matrix.

Koodu Solusan Itupalẹ (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

Jẹ ki a ṣe afiwe akoko ti o lo lori ṣiṣe ipinnu iye-iye Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin, ni ibamu pẹlu awọn ọna 3 ti a gbekalẹ.

Koodu fun iṣiro akoko iṣiro

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)

Idogba idogba ti o rọrun laini ipadasẹhin

Pẹlu iye kekere ti data, iṣẹ "kikọ ti ara ẹni" wa ni iwaju, eyi ti o wa awọn iṣiro nipa lilo ọna Cramer.

Bayi o le lọ si awọn ọna miiran lati wa iye-iye Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin.

Isọkalẹ Ilọsiwaju

Ni akọkọ, jẹ ki a ṣalaye kini gradient jẹ. Ni irọrun, gradient jẹ apakan ti o tọka si itọsọna ti idagbasoke ti o pọju ti iṣẹ kan. Nípa ìfiwéra pẹ̀lú gígun òkè ńlá kan, níbi tí àwọn ìdojú ìṣàlẹ̀ náà wà níbi tí òkè tí ó ga jù lọ wà. Ṣiṣe idagbasoke apẹẹrẹ pẹlu oke-nla, a ranti pe ni otitọ a nilo igbasilẹ ti o ga julọ lati le de ọdọ kekere ni yarayara bi o ti ṣee, eyini ni, o kere julọ - ibi ti iṣẹ naa ko mu tabi dinku. Ni aaye yii itọsẹ yoo jẹ dogba si odo. Nitorina, a ko nilo a gradient, sugbon ohun antigradient. Lati wa antigradient o kan nilo lati isodipupo gradient nipasẹ -1 (iyokuro ọkan).

Jẹ ki a fiyesi si otitọ pe iṣẹ kan le ni ọpọlọpọ minima, ati pe ti sọkalẹ sinu ọkan ninu wọn nipa lilo algorithm ti a dabaa ni isalẹ, a kii yoo ni anfani lati wa o kere ju miiran, eyiti o le jẹ kekere ju eyiti a rii. Jẹ ki a sinmi, eyi kii ṣe irokeke ewu si wa! Ninu ọran wa a n ṣiṣẹ pẹlu o kere ju kan, niwon iṣẹ wa Idogba idogba ti o rọrun laini ipadasẹhin lori awonya ni a deede parabola. Ati pe bi gbogbo wa ṣe yẹ ki o mọ daradara lati inu ẹkọ mathimatiki ile-iwe wa, parabola kan ni o kere ju kan.

Lẹhin ti a rii idi ti a nilo gradient kan, ati paapaa pe gradient jẹ apakan kan, iyẹn ni, fekito kan pẹlu awọn ipoidojuko ti a fun, eyiti o jẹ deede awọn iye-iye kanna. Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin a le ṣe imuse irandiwọn.

Ṣaaju ki o to bẹrẹ, Mo daba kika awọn gbolohun ọrọ diẹ nipa algorithm isosile:

  • A ṣe ipinnu ni ọna atansọ-aileto awọn ipoidojuko ti awọn iye-iye Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin. Ninu apẹẹrẹ wa, a yoo ṣalaye awọn iye-iye ti o sunmọ odo. Eyi jẹ iṣe ti o wọpọ, ṣugbọn ọran kọọkan le ni iṣe tirẹ.
  • Lati ipoidojuko Idogba idogba ti o rọrun laini ipadasẹhin yọkuro iye ti 1st ibere apa kan itọsẹ ni aaye Idogba idogba ti o rọrun laini ipadasẹhin. Nitorinaa, ti itọsẹ ba jẹ rere, lẹhinna iṣẹ naa pọ si. Nitorina, nipa iyokuro iye itọsẹ, a yoo gbe ni idakeji ti idagbasoke, eyini ni, ni itọsọna ti isosile. Ti itọsẹ naa ba jẹ odi, lẹhinna iṣẹ ni aaye yii dinku ati nipa iyokuro iye itọsẹ a gbe ni itọsọna ti iran.
  • A ṣe iṣẹ ṣiṣe ti o jọra pẹlu ipoidojuko Idogba idogba ti o rọrun laini ipadasẹhin: yọkuro iye ti itọsẹ apakan ni aaye Idogba idogba ti o rọrun laini ipadasẹhin.
  • Ni ibere ki o má ba fo lori o kere julọ ki o si fo sinu aaye ti o jinlẹ, o jẹ dandan lati ṣeto iwọn igbesẹ ni itọsọna ti iran. Ni gbogbogbo, o le kọ gbogbo nkan kan nipa bi o ṣe le ṣeto igbesẹ ni deede ati bii o ṣe le yipada lakoko ilana isọkalẹ lati le dinku awọn idiyele iṣiro. Ṣugbọn nisisiyi a ni iṣẹ-ṣiṣe ti o yatọ die-die siwaju wa, ati pe a yoo fi idi iwọn igbesẹ mulẹ nipa lilo ọna ijinle sayensi ti "poke" tabi, bi wọn ti sọ ni ọrọ ti o wọpọ, ni imudani.
  • Ni kete ti a ba wa lati awọn ipoidojuko ti a fun Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin yọkuro awọn iye ti awọn itọsẹ, a gba awọn ipoidojuko tuntun Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin. A ṣe igbesẹ atẹle (iyokuro), tẹlẹ lati awọn ipoidojuko iṣiro. Ati nitorinaa ọmọ naa bẹrẹ lẹẹkansi ati lẹẹkansi, titi ti isọdọkan ti o nilo yoo waye.

Gbogbo! Bayi a ti ṣetan lati lọ si wiwa ti o jinlẹ julọ ti Mariana Trench. Jẹ ká bẹrẹ.

Koodu fun irandiwọn gradient

# напишем функцию градиентного спуска без использования библиотеки 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

Idogba idogba ti o rọrun laini ipadasẹhin

A rì si isalẹ ti Mariana Trench ati pe nibẹ ni a rii gbogbo awọn iye alasọdipúpọ kanna Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin, eyiti o jẹ gangan ohun ti a reti.

Jẹ ki a mu omi omiran, ni akoko yii nikan, ọkọ oju-omi kekere wa yoo kun fun awọn imọ-ẹrọ miiran, eyun ile-ikawe kan Nọmba.

Kóòdù fún ìsálẹ̀ ìsàlẹ̀ (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

Idogba idogba ti o rọrun laini ipadasẹhin
Awọn iye iyeida Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin aileyipada.

Jẹ ki a wo bii aṣiṣe naa ṣe yipada lakoko isunmọ gradient, iyẹn ni, bii apapọ awọn iyapa onigun mẹrin ṣe yipada pẹlu igbesẹ kọọkan.

Koodu fun igbero awọn akopọ ti awọn iyapa onigun mẹrin

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

Nọmba 4 “Apapọ ti awọn iyapa onigun mẹrin lakoko isọkalẹ didient”

Idogba idogba ti o rọrun laini ipadasẹhin

Lori aworan ti a rii pe pẹlu igbesẹ kọọkan aṣiṣe dinku, ati lẹhin nọmba kan ti awọn iterations a ṣe akiyesi laini petele ti o fẹrẹẹ.

Ni ipari, jẹ ki a ṣe iṣiro iyatọ ninu akoko ipaniyan koodu:

Koodu lati pinnu akoko iṣiro isale gradient

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)

Idogba idogba ti o rọrun laini ipadasẹhin

Boya a n ṣe nkan ti ko tọ, ṣugbọn lẹẹkansi o jẹ iṣẹ “ikọ-ile” ti o rọrun ti ko lo ile-ikawe Nọmba outperforms awọn isiro akoko ti a iṣẹ nipa lilo awọn ìkàwé Nọmba.

Ṣugbọn a ko duro jẹ, ṣugbọn a nlọ si kikọ ẹkọ ọna igbadun miiran lati yanju idogba ipadasẹhin laini ti o rọrun. Pade!

Sitokasitik gradient iran

Lati le yara ni oye ipilẹ ti iṣiṣẹ ti isunmọ gradient sitokasitik, o dara lati pinnu awọn iyatọ rẹ lati irandiwọn gradient lasan. A, ninu ọran ti isale gradient, ni awọn idogba ti awọn itọsẹ ti Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin lo awọn akopọ ti awọn iye ti gbogbo awọn ẹya ati awọn idahun otitọ ti o wa ninu apẹẹrẹ (iyẹn ni, awọn akopọ gbogbo Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin). Ni isunmọ gradient sitochastic, a kii yoo lo gbogbo awọn iye ti o wa ninu apẹẹrẹ, ṣugbọn dipo, pseudo-laileto yan ohun ti a pe ni atọka ayẹwo ati lo awọn iye rẹ.

Fun apẹẹrẹ, ti atọka ba pinnu lati jẹ nọmba 3 (mẹta), lẹhinna a mu awọn iye Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin, lẹhinna a paarọ awọn iye sinu awọn idogba itọsẹ ati pinnu awọn ipoidojuko tuntun. Lẹhinna, ti pinnu awọn ipoidojuko, a tun ṣe ipinnu-laileto pinnu atọka apẹẹrẹ, rọpo awọn iye ti o baamu atọka sinu awọn idogba iyatọ apakan, ati pinnu awọn ipoidojuko ni ọna tuntun. Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin ati be be lo. titi ti convergence yipada alawọ ewe. Ni wiwo akọkọ, o le ma dabi pe eyi le ṣiṣẹ rara, ṣugbọn o ṣe. O jẹ otitọ pe o tọ lati ṣe akiyesi pe aṣiṣe ko dinku pẹlu gbogbo igbesẹ, ṣugbọn esan kan wa ifarahan.

Kini awọn anfani ti isunmọ gradient sitokasitik ju ọkan ti aṣa lọ? Ti iwọn ayẹwo wa ba tobi pupọ ati pe o ni iwọn ẹgbẹẹgbẹrun awọn iye, lẹhinna o rọrun pupọ lati ṣe ilana, sọ, ẹgbẹẹgbẹrun laileto ninu wọn, ju gbogbo apẹẹrẹ lọ. Eyi ni ibi ti isunmọ gradient sitokasitik wa sinu ere. Ninu ọran wa, dajudaju, a kii yoo ṣe akiyesi pupọ ti iyatọ.

Jẹ ki a wo koodu naa.

Koodu fun sitokasitik gradient ayalu

# определим функцию стох.град.шага
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])

Idogba idogba ti o rọrun laini ipadasẹhin

A farabalẹ wo awọn iye-iye ati pe ara wa ni bibeere ibeere “Bawo ni eyi ṣe le jẹ?” A ni iye olùsọdipúpọ miiran Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin. Boya sitokasitik gradient iran ti ri diẹ ti aipe sile fun idogba? Laanu rara. O to lati wo apao awọn iyapa onigun mẹrin ati rii pe pẹlu awọn iye tuntun ti awọn iye-iye, aṣiṣe naa tobi julọ. A ko yara si ireti. Jẹ ki ká kọ kan awonya ti awọn aṣiṣe ayipada.

Koodu fun igbero apao awọn iyapa onigun mẹrin ni sitokasitik gradient iran

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

Nọmba 5 “Apapọ ti awọn iyapa onigun mẹrin lakoko isunle isale sitokasitik”

Idogba idogba ti o rọrun laini ipadasẹhin

Wiwo iṣeto naa, ohun gbogbo ṣubu si aaye ati bayi a yoo ṣatunṣe ohun gbogbo.

Nitorina kini o ṣẹlẹ? Awọn wọnyi sele. Nigba ti a ba yan laileto oṣu kan, lẹhinna o jẹ fun oṣu ti a yan ti algorithm wa n wa lati dinku aṣiṣe ni iṣiro owo-wiwọle. Lẹhinna a yan oṣu miiran ki o tun ṣe iṣiro naa, ṣugbọn a dinku aṣiṣe fun oṣu keji ti a yan. Ni bayi ranti pe awọn oṣu meji akọkọ ti yapa ni pataki lati laini ti idogba ipadasẹhin laini ti o rọrun. Eyi tumọ si pe nigbati eyikeyi ninu awọn oṣu meji wọnyi ba yan, nipa idinku aṣiṣe ti ọkọọkan wọn, algorithm wa pọ si ni pataki aṣiṣe fun gbogbo apẹẹrẹ. Nitorina kini lati ṣe? Idahun si jẹ rọrun: o nilo lati dinku igbesẹ iran. Lẹhin gbogbo ẹ, nipa idinku igbesẹ isọkalẹ, aṣiṣe yoo tun da “fifo” si oke ati isalẹ. Tabi dipo, aṣiṣe "fifo" kii yoo da duro, ṣugbọn kii yoo ṣe bẹ ni kiakia :) Jẹ ki a ṣayẹwo.

Koodu lati ṣiṣẹ SGD pẹlu awọn afikun kekere

# запустим функцию, уменьшив шаг в 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()

Idogba idogba ti o rọrun laini ipadasẹhin

Aworan No. 6 “Apapọ ti awọn iyapa onigun mẹrin lasiko isunmọ isale sitokasitik (awọn igbesẹ 80 ẹgbẹrun)”

Idogba idogba ti o rọrun laini ipadasẹhin

Awọn iyeida ti ni ilọsiwaju, ṣugbọn ko tun dara. Ni arosọ, eyi le ṣe atunṣe ni ọna yii. A yan, fun apẹẹrẹ, ni awọn aṣetunṣe 1000 to kẹhin awọn iye ti awọn alafisodipupo pẹlu eyiti aṣiṣe ti o kere ju ti ṣe. Otitọ, fun eyi a yoo tun ni lati kọ awọn iye ti awọn iye owo ti ara wọn. A kii yoo ṣe eyi, ṣugbọn kuku fiyesi si iṣeto naa. O dabi dan ati pe aṣiṣe dabi pe o dinku ni boṣeyẹ. Lootọ eyi kii ṣe otitọ. Jẹ ki a wo awọn aṣetunṣe 1000 akọkọ ki a ṣe afiwe wọn pẹlu ti o kẹhin.

Koodu fun apẹrẹ SGD (awọn igbesẹ 1000 akọkọ)

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

Nọmba 7 “Apapọ ti awọn iyapa onigun mẹrin SGD (awọn igbesẹ 1000 akọkọ)”

Idogba idogba ti o rọrun laini ipadasẹhin

Nọmba 8 “Apapọ ti awọn iyapa onigun mẹrin SGD (awọn igbesẹ 1000 to kẹhin)”

Idogba idogba ti o rọrun laini ipadasẹhin

Ni ibẹrẹ ibẹrẹ ti isosile, a ṣe akiyesi aṣọ-aṣọ deede ati idinku ga ni aṣiṣe. Ni awọn iterations to kẹhin, a rii pe aṣiṣe n lọ ni ayika ati ni ayika iye ti 1,475 ati ni awọn akoko kan paapaa dogba iye ti o dara julọ, ṣugbọn lẹhinna o tun lọ soke… Mo tun ṣe, o le kọ awọn iye ti iyeida Idogba idogba ti o rọrun laini ipadasẹhin и Idogba idogba ti o rọrun laini ipadasẹhin, ati lẹhinna yan awọn ti aṣiṣe jẹ iwonba fun. Sibẹsibẹ, a ni iṣoro to ṣe pataki diẹ sii: a ni lati ṣe awọn igbesẹ 80 ẹgbẹrun (wo koodu) lati gba awọn iye isunmọ si aipe. Ati pe eyi tẹlẹ tako imọran ti fifipamọ akoko iṣiro pẹlu isunmọ isọdọtun sitokasitik ti o ni ibatan si isunmọ gradient. Kini o le ṣe atunṣe ati ilọsiwaju? Ko ṣoro lati ṣe akiyesi pe ni awọn itọka akọkọ a ni igboya lọ si isalẹ ati, nitorina, o yẹ ki a lọ kuro ni ipele ti o tobi ni awọn iṣaju akọkọ ati dinku igbesẹ bi a ti nlọ siwaju. A kii yoo ṣe eyi ni nkan yii - o ti pẹ ju. Awọn ti o fẹ le ronu fun ara wọn bi wọn ṣe le ṣe eyi, ko nira :)

Bayi jẹ ki a ṣe sitokasitik gradient iranse nipa lilo awọn ìkàwé Nọmba (ati pe ki a maṣe kọsẹ lori awọn okuta ti a mọ tẹlẹ)

Koodu fun Sitokasitik Gradient Isalẹ (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

Idogba idogba ti o rọrun laini ipadasẹhin

Awọn iye yipada lati fẹrẹ jẹ kanna bi nigbati wọn ba sọkalẹ laisi lilo Nọmba. Sibẹsibẹ, eyi jẹ ọgbọn.

Jẹ ki a wa bawo ni awọn iran-ijinlẹ sitokasitik ti gba wa.

Koodu fun ipinnu akoko iṣiro SGD (awọn igbesẹ 80 ẹgbẹrun)

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)

Idogba idogba ti o rọrun laini ipadasẹhin

Ti o siwaju sii sinu igbo, awọn awọsanma dudu: lẹẹkansi, ilana ti "ara-ara" fihan abajade ti o dara julọ. Gbogbo eyi ni imọran pe awọn ọna arekereke paapaa gbọdọ wa lati lo ile-ikawe naa Nọmba, eyiti o yara awọn iṣẹ ṣiṣe iṣiro gaan. Ninu àpilẹkọ yii a kii yoo kọ ẹkọ nipa wọn. Ohunkan yoo wa lati ronu ni akoko apoju rẹ :)

Jẹ ki a ṣe akopọ

Ṣaaju ki o to ṣe akopọ, Emi yoo fẹ lati dahun ibeere kan ti o ṣeeṣe julọ dide lati ọdọ oluka olufẹ wa. Kilode, ni otitọ, iru "ijiya" pẹlu awọn iran, kilode ti a nilo lati rin si oke ati isalẹ oke (julọ si isalẹ) lati wa ilẹ pẹtẹlẹ ti o niyelori, ti a ba ni ọwọ wa iru ẹrọ ti o lagbara ati ti o rọrun, ninu fọọmu ti ojutu analitikali, eyiti o firanṣẹ lẹsẹkẹsẹ wa si aaye ọtun?

Idahun si ibeere yii wa lori oke. Bayi a ti wo apẹẹrẹ ti o rọrun pupọ, ninu eyiti idahun otitọ jẹ Idogba idogba ti o rọrun laini ipadasẹhin da lori ọkan ami Idogba idogba ti o rọrun laini ipadasẹhin. Iwọ ko rii eyi nigbagbogbo ni igbesi aye, nitorinaa jẹ ki a fojuinu pe a ni awọn ami 2, 30, 50 tabi diẹ sii. Jẹ ki a ṣafikun si ẹgbẹẹgbẹrun yii, tabi paapaa ẹgbẹẹgbẹrun awọn iye fun ẹya kọọkan. Ni idi eyi, ojutu analitikali le ma koju idanwo naa ki o kuna. Ni ọna, irandiwọn ati awọn iyatọ rẹ yoo rọra ṣugbọn dajudaju mu wa sunmọ ibi-afẹde - o kere julọ ti iṣẹ naa. Maṣe yọ ara rẹ lẹnu nipa iyara - o ṣee ṣe pe a yoo wo awọn ọna ti yoo gba wa laaye lati ṣeto ati ṣe ilana gigun igbese (iyẹn ni iyara).

Ati ni bayi akopọ kukuru gangan.

Ni akọkọ, Mo nireti pe ohun elo ti a gbekalẹ ninu nkan naa yoo ṣe iranlọwọ lati bẹrẹ “awọn onimọ-jinlẹ data” ni oye bi o ṣe le yanju awọn idogba isọdọtun laini rọrun (ati kii ṣe nikan).

Keji, a wo awọn ọna pupọ lati yanju idogba naa. Bayi, da lori ipo naa, a le yan eyi ti o dara julọ lati yanju iṣoro naa.

Kẹta, a rii agbara ti awọn eto afikun, eyun ni gigun igbesẹ isale gradient. Yi paramita ko le wa ni igbagbe. Gẹgẹbi a ti ṣe akiyesi loke, lati le dinku iye owo awọn iṣiro, ipari igbesẹ yẹ ki o yipada lakoko isunmọ.

Ni ẹẹrin, ninu ọran wa, awọn iṣẹ "ikọwe-ile" fihan awọn esi akoko ti o dara julọ fun awọn iṣiro. Eyi ṣee ṣe nitori kii ṣe lilo ọjọgbọn julọ ti awọn agbara ile-ikawe naa Nọmba. Ṣugbọn jẹ pe bi o ti le ṣe, ipari ti o tẹle ni imọran funrararẹ. Ni ọna kan, nigbami o tọ lati bibeere awọn ero ti iṣeto, ati ni apa keji, kii ṣe nigbagbogbo ni idiju ohun gbogbo - ni ilodi si, nigbakan ọna ti o rọrun lati yanju iṣoro kan jẹ doko diẹ sii. Ati pe niwọn igba ti ibi-afẹde wa ni lati ṣe itupalẹ awọn ọna mẹta lati yanju idogba isọdọtun laini ti o rọrun, lilo awọn iṣẹ “kikọ ti ara ẹni” ti to fun wa.

Litireso (tabi nkan bii iyẹn)

1. Iyipada ila

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

2. Ọna onigun mẹrin ti o kere julọ

mathprofi.ru/metod_naimenshih_kvadratov.html

3. Itọsẹ

www.mathprofi.ru/chastnye_proizvodnye_primery.html

4. Onitẹsẹ

mathprofi.ru/proizvodnaja_po_napravleniju_i_gradient.html

5. Isokale gradient

habr.com/en/post/471458

habr.com/en/post/307312

artemarakcheev.com/2017-12-31/linear_regression

6. NumPy ìkàwé

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

orisun: www.habr.com

Fi ọrọìwòye kun