Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Tha an artaigil a’ beachdachadh air grunn dhòighean gus co-aontar matamataigeach loidhne ais-tharraing shìmplidh (càraid) a dhearbhadh.

Tha a h-uile dòigh air fuasgladh fhaighinn air a’ cho-aontar air a bheilear a’ beachdachadh an seo stèidhichte air an dòigh as lugha de cheàrnagan. Leig dhuinn na dòighean a chomharrachadh mar a leanas:

  • Fuasgladh anailis
  • Sliochd caisead
  • Teàrnadh caisead stochastic

Airson gach dòigh air fuasgladh fhaighinn air co-aontar loidhne dhìreach, tha an artaigil a 'toirt seachad diofar dhleastanasan, a tha gu ìre mhòr air an roinn anns an fheadhainn a tha sgrìobhte gun a bhith a' cleachdadh an leabharlainn. ÀireamhPy agus an fheadhainn a bhios gan cleachdadh airson àireamhachadh ÀireamhPy. Thathar a 'creidsinn gu bheil cleachdadh sgileil ÀireamhPy lùghdaichidh e cosgaisean coimpiutaireachd.

Tha a h-uile còd a tha air a thoirt seachad san artaigil sgrìobhte sa chànan python-2.7 a ’cleachdadh Leabhar-nota Jupyter. Tha an còd stòr agus am faidhle le dàta sampall air a phostadh air Github

Tha an artaigil nas motha ag amas air an dà chuid luchd-tòiseachaidh agus an fheadhainn a tha mar-thà air tòiseachadh mean air mhean a bhith ag ionnsachadh earrann fìor fharsaing ann an inntleachd fuadain - ionnsachadh innealan.

Gus an stuth a shoilleireachadh, bidh sinn a’ cleachdadh eisimpleir gu math sìmplidh.

Eisimpleirean de shuidheachaidhean

Tha còig luachan againn a tha a’ comharrachadh eisimeileachd Y от X (Clàr Àir. 1):

Clàr Àir. 1 “Sampall condition”

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Gabhaidh sinn ris gu bheil na luachan Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh is e mìos na bliadhna, agus Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh - teachd a-steach air a’ mhìos seo. Ann am briathran eile, teachd a-steach an crochadh air a 'mhìos den bhliadhna, agus Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh - an aon soidhne air a bheil teachd a-steach an crochadh.

Tha an eisimpleir mar sin - mar sin, an dà chuid bho shealladh an eisimeileachd cumhach teachd a-steach air a 'mhìos den bhliadhna, agus bho shealladh an àireamh de luachan - tha glè bheag dhiubh. Ach, bidh an leithid de shìmpleachadh ga dhèanamh comasach, mar a chanas iad, mìneachadh, chan ann an-còmhnaidh gu furasta, an stuth a bhios luchd-tòiseachaidh a ’cothlamadh. Agus cuideachd leigidh sìmplidheachd nan àireamhan dhaibhsan a tha airson an eisimpleir fhuasgladh air pàipear gun chosgaisean obrach mòra.

Gabhamaid ris gum faodar an eisimeileachd a tha air a thoirt seachad san eisimpleir a thomhas gu math leis a’ cho-aontar matamataigeach de loidhne ais-tharraing sìmplidh (càraid) den fhoirm:

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

far a bheil Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh se am mìos anns an d'fhuaireadh an teachd-a-steach, Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh - teachd a-steach a rèir na mìos, Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh a bheil co-èifeachdan ais-tharraing na loidhne tuairmseach.

Thoir an aire gu bheil an coefficient Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh gu tric ris an canar leathad no caisead na loidhne mheasta; a’ riochdachadh na h-àireimh leis a bheil an Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh nuair a dh'atharraicheas e Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh.

Gu follaiseach, is e an obair againn san eisimpleir a leithid de cho-èifeachdan a thaghadh anns a’ cho-aontar Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh, aig a bheil gluasadan ar luachan teachd-a-steach àireamhaichte gach mìos bho na fìor fhreagairtean, i.e. bidh na luachan a tha air an taisbeanadh san sampall glè bheag.

An dòigh as lugha ceàrnagach

A rèir an dòigh ceàrnagan as lugha, bu chòir an claonadh a thomhas le bhith ga sgùradh. Leigidh an dòigh seo leat cuir às dha chèile de chlaonadh ma tha comharran eile aca. Mar eisimpleir, ma tha ann an aon chùis, tha an claonadh +5 (a bharrachd air còig), agus anns an fhear eile -5 (nas lugha na còig), an uairsin cuiridh suim nan sgaraidhean dheth a chèile agus thig iad gu 0 (neoni). Tha e comasach gun a bhith a 'ceàrnag an claonadh, ach a bhith a' cleachdadh seilbh a 'mhodail agus an uairsin bidh na h-eadar-dhealachaidhean uile deimhinneach agus cruinnichidh iad. Cha bhith sinn a 'fuireach air a' phuing seo gu mionaideach, ach dìreach a 'sealltainn gu bheil e àbhaisteach airson an àireamhachadh a dhèanamh ceàrnagach.

Seo an coltas a tha air an fhoirmle leis am bi sinn a’ dearbhadh an t-suim as lugha de chlaonaidhean ceàrnagach (mearachdan):

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

far a bheil Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh a tha na ghnìomh airson tuairmse a dhèanamh air fìor fhreagairtean (is e sin, an teachd a-steach a rinn sinn àireamhachadh),

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh a bheil na fìor fhreagairtean (teachd-a-steach air a thoirt seachad san sampall),

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh a bheil an clàr-amais sampall (àireamh na mìos anns a bheil an claonadh air a dhearbhadh)

Dèanamaid eadar-dhealachadh air a’ ghnìomh, mìnich sinn na co-aontaran eadar-dhealaichte ann am pàirt, agus bi deiseil airson gluasad air adhart chun fhuasgladh anailis. Ach an toiseach, bheir sinn cuairt ghoirid air dè a th’ ann an eadar-dhealachadh agus cuimhnich air brìgh geoimeatrach an derivative.

Eadar-dhealachadh

Is e eadar-dhealachadh an obrachadh a bhith a’ lorg toradh gnìomh.

Carson a tha an derivative air a chleachdadh? Tha toradh gnìomh a’ comharrachadh ìre atharrachaidh na gnìomh agus ag innse dhuinn a stiùir. Ma tha an derivative aig puing sònraichte dearbhach, bidh an gnìomh ag àrdachadh; air dhòigh eile, bidh an gnìomh a ’dol sìos. Agus mar as motha luach an derivative iomlan, is ann as àirde an ìre atharrachaidh air luachan gnìomh, a bharrachd air mar as cas a tha leathad graf gnìomh.

Mar eisimpleir, fo chumhachan siostam co-òrdanachaidh Cartesianach, tha luach an derivative aig a’ phuing M(0,0) co-ionann ri + 25 a 'ciallachadh sin aig àm sònraichte, nuair a thèid an luach atharrachadh Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh air an taobh dheas le aonad àbhaisteach, luach Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh àrdachadh le 25 aonadan àbhaisteach. Air a’ ghraf tha e coltach ri àrdachadh gu math cas ann an luachan Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh bho phuing ainmichte.

Eisimpleir eile. Tha an luach derivative co-ionann -0,1 a’ ciallachadh nuair a thèid a chur às Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh gach aonad àbhaisteach, luach Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh lùghdachadh le dìreach 0,1 aonad àbhaisteach. Aig an aon àm, air graf a 'ghnìomh, chì sinn leathad sìos a tha gu math follaiseach. A’ tarraing samhlachas le beinn, tha e mar gum biodh sinn gu math slaodach a’ teàrnadh leathad socair bho bheinn, eu-coltach ris an eisimpleir roimhe, far an robh againn ri stùcan gu math cas a dhìreadh :)

Mar sin, an dèidh eadar-dhealachadh a dhèanamh air a 'ghnìomh Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh gu h-obann Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh, bidh sinn a’ mìneachadh co-aontaran eadar-dhealaichte pàirt 1d òrdugh. Às deidh dhuinn na co-aontaran a dhearbhadh, gheibh sinn siostam de dhà cho-aontar, le bhith a’ fuasgladh a bhios e comasach dhuinn luachan mar sin de na co-èifeachdan a thaghadh Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh, aig a bheil luachan nan derivatives co-fhreagarrach aig puingean sònraichte ag atharrachadh le glè bheag, glè bheag, agus ann an cùis fuasgladh anailis nach atharraich idir. Ann am faclan eile, ruigidh an gnìomh mearachd aig na co-èifeachdan a chaidh a lorg an ìre as ìsle, leis gu bheil luachan nan toraidhean pàirt aig na puingean sin co-ionann ri neoni.

Mar sin, a rèir riaghailtean eadar-dhealachaidh, co-aontar pàirt derivative den òrdugh 1d a thaobh coefficient Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh bidh am foirm:

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Co-aontar pàirt derivative òrdugh 1 a thaobh Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh bidh am foirm:

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Mar thoradh air an sin, fhuair sinn siostam de cho-aontaran aig a bheil fuasgladh anailis gu math sìmplidh:

tòiseachadh {co-aontar*}
tòiseachadh {cùisean}
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
crìoch {cùisean}
crìoch {co-aontar*}

Mus fuasgladh sinn an co-aontar, leig dhuinn ro-luchdachadh, dèan cinnteach gu bheil an luchdachadh ceart, agus cruth an dàta.

A’ luchdachadh is a’ cruth dàta

Bu chòir a thoirt fa-near, leis gu bheil sinn airson an fhuasgladh anailis, agus às deidh sin airson teàrnadh caisead caisead agus stochastic, cleachdaidh sinn an còd ann an dà atharrachadh: a’ cleachdadh an leabharlainn ÀireamhPy agus gun a bhith ga chleachdadh, bidh feum againn air cruth dàta iomchaidh (faic an còd).

Còd a’ luchdachadh is a’ làimhseachadh dàta

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

Ìomhaigh

A-nis, às deidh dhuinn, an toiseach, an dàta a luchdachadh, san dàrna àite, sgrùdadh a dhèanamh air ceartachd an luchdachadh agus mu dheireadh cruth a chuir air an dàta, nì sinn a’ chiad sealladh. Is e an dòigh-obrach a thathar a 'cleachdadh gu tric airson seo paidhrichean leabharlannan seabhag. Anns an eisimpleir againn, mar thoradh air na h-àireamhan cuibhrichte, chan eil feum air an leabharlann a chleachdadh seabhag. Cleachdaidh sinn an leabharlann àbhaisteach Mathplotlib agus dìreach coimhead air a 'phlota scatter.

Còd 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()

Cairt Àir. 1 “An eisimeil teachd-a-steach air mìos na bliadhna”

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Fuasgladh anailis

Cleachdamaid na h-innealan as cumanta ann an python agus fuasgladh fhaighinn air siostam nan co-aontaran:

tòiseachadh {co-aontar*}
tòiseachadh {cùisean}
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
crìoch {cùisean}
crìoch {co-aontar*}

A rèir riaghailt Cramer gheibh sinn an dearbh-chinntiche coitcheann, cho math ri cinntiche le Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh agus le Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh, às deidh sin, a 'roinn an dearbhadair le Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh chun an dearbhaiche coitcheann - lorg an coefficient Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh, mar an ceudna lorg sinn an coefficient Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh.

Còd fuasgladh anailis

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

Seo na fhuair sinn:

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Mar sin, chaidh luachan nan co-èifeachdan a lorg, chaidh suim nan sgaraidhean ceàrnagach a stèidheachadh. Tarraingidh sinn loidhne dhìreach air an histogram sgapadh a rèir nan co-èifeachdan a chaidh a lorg.

Còd loidhne regression

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

Cairt Àir. 2 “Freagairtean ceart is àireamhaichte”

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Faodaidh tu coimhead air a’ ghraf de chlaonadh airson gach mìos. Anns a’ chùis againn, cha bhith sinn a’ faighinn luach practaigeach sam bith bhuaithe, ach sàsaichidh sinn ar feòrachas mu cho math sa tha an co-aontar ais-tharraing sreathach sìmplidh a’ comharrachadh eisimeileachd teachd-a-steach air mìos na bliadhna.

Còd deviation cairt

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

Cairt Àir. 3 “Deviations, %”

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Chan eil e foirfe, ach chuir sinn crìoch air an obair againn.

Sgrìobhamaid gnìomh a tha, gus na co-èifeachdan a dhearbhadh Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh cleachdadh an leabharlainn ÀireamhPy, nas mionaidiche, sgrìobhaidh sinn dà ghnìomh: aon a 'cleachdadh pseudoinverse matrix (chan eil e air a mholadh ann an cleachdadh, leis gu bheil am pròiseas iom-fhillte agus neo-sheasmhach), am fear eile a' cleachdadh co-aontar matrix.

Còd Fuasglaidh Anailitigeach (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

Dèanamaid coimeas eadar an ùine a chaidh a chosg air co-èifeachdan a dhearbhadh Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh, a rèir nan 3 dòighean a chaidh a thaisbeanadh.

Còd airson àireamhachadh ùine

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)

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Le beagan dàta, thig gnìomh “fèin-sgrìobhte” a-mach air thoiseach, a lorgas na co-èifeachdan a’ cleachdadh modh Cramer.

A-nis faodaidh tu gluasad air adhart gu dòighean eile gus co-èifeachdan a lorg Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh.

Sliochd caisead

An toiseach, mìnichidh sinn dè a th’ ann an caisead. Gu sìmplidh, is e caisead a th’ ann an earrann a tha a’ comharrachadh an stiùir airson fàs as motha ann an gnìomh. Ann an co-chòrdadh ri sreap beinne, far a bheil aghaidhean caisead far a bheil an sreap as cas gu mullach na beinne. Le bhith a 'leasachadh an eisimpleir leis a' bheinn, tha sinn a 'cuimhneachadh gu bheil feum againn air an t-slighe as cas gus an ruig sinn an talamh ìosal cho luath' sa ghabhas, is e sin, an ìre as lugha - an t-àite far nach eil an gnìomh a 'meudachadh no a' lùghdachadh. Aig an àm seo bidh an derivative co-ionann ri neoni. Mar sin, chan fheum sinn caisead, ach antigradient. Gus an antigradient a lorg chan fheum thu ach an caisead iomadachadh le -1 (a-mhàin aon).

Thoir dhuinn aire gum faod grunn minima a bhith aig gnìomh, agus às deidh dhuinn a dhol a-steach do aon dhiubh a ’cleachdadh an algairim a chaidh a mholadh gu h-ìosal, cha bhith e comasach dhuinn ìre as ìsle eile a lorg, a dh’ fhaodadh a bhith nas ìsle na an tè a chaidh a lorg. Gabhamaid fois, chan eil seo na chunnart dhuinn! Anns a 'chùis againn tha sinn a' dèiligeadh ri aon ìre as ìsle, bhon obair againn Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh air a’ ghraf tha parabola cunbhalach. Agus mar a bu chòir fios a bhith againn uile bhon chùrsa matamataig sgoile againn, chan eil ach aon parabola aig a’ char as lugha.

Às deidh dhuinn faighinn a-mach carson a bha feum againn air caisead, agus cuideachd gu bheil an caisead na roinn, is e sin, vectar le co-chomharran sònraichte, a tha dìreach na h-aon cho-èifeachdan Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh is urrainn dhuinn teàrnadh caisead a chur an gnìomh.

Mus tòisich mi, tha mi a’ moladh dìreach beagan sheantansan a leughadh mun algairim teàrnaidh:

  • Bidh sinn a’ dearbhadh ann an dòigh meallta air thuaiream co-chomharran nan co-èifeachdan Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh. Anns an eisimpleir againn, mìnichidh sinn co-èifeachdan faisg air neoni. Is e cleachdadh cumanta a tha seo, ach faodaidh a chleachdadh fhèin a bhith aig gach cùis.
  • Bho cho-òrdanachadh Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh thoir air falbh luach an òrdugh 1d pàirt derivative aig a’ phuing Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh. Mar sin, ma tha an derivative dearbhach, bidh an gnìomh ag àrdachadh. Mar sin, le bhith a 'toirt air falbh luach an derivative, gluaisidh sinn an taobh eile de fhàs, is e sin, ann an stiùireadh teàrnaidh. Ma tha an derivative àicheil, bidh an gnìomh aig an ìre seo a’ dol sìos agus le bhith a’ toirt air falbh luach an derivative gluaisidh sinn a dh’ionnsaigh teàrnaidh.
  • Bidh sinn a’ dèanamh obair coltach ris leis a’ cho-chomharran Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh: thoir air falbh luach an derivative pàirteach aig a’ phuing Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh.
  • Gus nach leum thu thairis air an ìre as ìsle agus itealaich a-steach gu àite domhainn, feumar meud a ’cheum a shuidheachadh a dh’ ionnsaigh teàrnadh. San fharsaingeachd, dh'fhaodadh tu artaigil slàn a sgrìobhadh mu mar a shuidhicheas tu an ceum gu ceart agus mar a dh'atharraicheas tu e tron ​​​​phròiseas teàrnaidh gus cosgaisean coimpiutaireachd a lùghdachadh. Ach a-nis tha gnìomh beagan eadar-dhealaichte air thoiseach oirnn, agus suidhichidh sinn meud a ’cheum a’ cleachdadh an dòigh saidheansail “poke” no, mar a chanas iad ann an co-theacsa cumanta, gu empirigeach.
  • Aon uair 's gu bheil sinn bho na co-chomharran a chaidh a thoirt seachad Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh thoir air falbh luachan nan derivatives, gheibh sinn co-chomharran ùra Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh. Gabhaidh sinn an ath cheum (toirt air falbh), mar-thà bho na co-chomharran àireamhaichte. Agus mar sin bidh an cearcall a 'tòiseachadh a-rithist is a-rithist, gus an tèid an co-ghluasad a tha a dhìth a choileanadh.

Uile! A-nis tha sinn deiseil airson a dhol a shireadh a’ mhòr-ghil as doimhne den Mariana Trench. Feuch an tòisich sinn.

Còdan airson gradient teàrnadh

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

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Chaidh sinn gu fìor bhonn an Mariana Trench agus an sin lorg sinn na h-aon luachan co-èifeachd Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh, agus sin dìreach mar a bha dùil.

Gabhamaid dàibheadh ​​​​eile, dìreach an turas seo, bidh ar carbad mara domhainn air a lìonadh le teicneòlasan eile, is e sin leabharlann ÀireamhPy.

Còd airson teàrnadh caisead (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

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh
Luachan coefficient Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh neo-chaochlaideach.

Feuch gun coimhead sinn ri mar a dh'atharraich a' mhearachd nuair a bha an caisead a' teàrnadh, is e sin, mar a dh'atharraich suim nan sgaraidhean ceàrnagach le gach ceum.

Còd airson a bhith a 'dealbhadh suimean de ghluasadan ceàrnagach

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

Graf Àir. 4 “Suim de chlaonaidhean ceàrnagach aig teàrnadh caisead”

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Air a 'ghraf tha sinn a' faicinn gu bheil a 'mhearachd a' lùghdachadh le gach ceum, agus an dèidh àireamh sònraichte de dh 'aithrisean bidh sinn a' faicinn loidhne cha mhòr còmhnard.

Mu dheireadh, leig dhuinn tuairmse a dhèanamh air an eadar-dhealachadh ann an ùine cur an gnìomh còd:

Còd gus ùine àireamhachaidh teàrnaidh caisead a dhearbhadh

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)

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Is dòcha gu bheil sinn a’ dèanamh rudeigin ceàrr, ach a-rithist is e gnìomh sìmplidh “sgrìobhte aig an taigh” a th’ ann nach bi a’ cleachdadh an leabharlann ÀireamhPy a’ coileanadh nas fheàrr na ùine àireamhachaidh gnìomh a’ cleachdadh an leabharlainn ÀireamhPy.

Ach chan eil sinn a 'seasamh fhathast, ach tha sinn a' gluasad a dh'ionnsaigh a bhith a 'sgrùdadh dòigh inntinneach eile gus fuasgladh fhaighinn air a' cho-aontar ais-tharraing sreathach sìmplidh. Coinnich!

Teàrnadh caisead stochastic

Gus tuigse fhaighinn gu sgiobalta air prionnsapal obrachaidh teàrnadh caisead stochastic, tha e nas fheàrr na h-eadar-dhealachaidhean aca a dhearbhadh bho teàrnadh caisead àbhaisteach. Bidh sinn, a thaobh teàrnadh caisead, ann an co-aontaran derivatives of Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh chleachd sinn suimean luachan gach feart agus fìor fhreagairtean a tha rim faighinn san sampall (is e sin, suimean nan uile Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh). Ann an teàrnadh caisead stochastic, cha chleachd sinn a h-uile luach a tha an làthair san sampall, ach an àite sin, tagh pseudo-air thuaiream an clàr-amais sampall ris an canar agus cleachdaidh sinn na luachan aige.

Mar eisimpleir, ma tha an clàr-amais air a dhearbhadh gu bhith na àireamh 3 (trì), gabhaidh sinn na luachan Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh, an uairsin bidh sinn a 'cur nan luachan a-steach do na co-aontaran derivative agus a' dearbhadh co-chomharran ùra. An uairsin, às deidh dhuinn na co-chomharran a dhearbhadh, bidh sinn a-rithist a’ dearbhadh clàr-amais an t-sampall air thuaiream, a’ cuir na luachan a tha co-chosmhail ris a’ chlàr-amais a-steach do na co-aontaran eadar-dhealaichte, agus a’ dearbhadh na co-chomharran ann an dòigh ùr. Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh etc. gus an tionndaidh an co-chruinneachadh uaine. Aig a 'chiad sealladh, is dòcha nach eil e coltach gum faodadh seo obrachadh idir, ach tha e a' dèanamh. Tha e fìor gum bu chòir a thoirt fa-near nach eil am mearachd a 'lùghdachadh leis a h-uile ceum, ach gu cinnteach tha claonadh ann.

Dè na buannachdan a th’ ann an teàrnadh caisead stochastic an taca ri tè àbhaisteach? Ma tha am meud sampall againn glè mhòr agus air a thomhas ann an deichean de mhìltean de luachan, tha e mòran nas fhasa a bhith a’ giullachd, can, mìle air thuaiream dhiubh, seach an sampall gu lèir. Seo far a bheil teàrnadh caisead stochastic a’ tighinn a-steach. Anns a 'chùis againn, gu dearbh, chan fhaic sinn mòran de dh' eadar-dhealachadh.

Bheir sinn sùil air a’ chòd.

Còd airson teàrnadh caisead stochastic

# определим функцию стох.град.шага
def stoch_grad_step_usual(vector_init, x_us, ind, y_us, l):
#     выбираем значение икс, которое соответствует случайному значению параметра ind 
# (см.ф-цию stoch_grad_descent_usual)
    x = x_us[ind]
#     рассчитывыаем значение y (выручку), которая соответствует выбранному значению x
    y_pred = vector_init[0] + vector_init[1]*x_us[ind]
#     вычисляем ошибку расчетной выручки относительно представленной в выборке
    error = y_pred - y_us[ind]
#     определяем первую координату градиента ab
    grad_a = error
#     определяем вторую координату ab
    grad_b = x_us[ind]*error
#     вычисляем новый вектор коэффициентов
    vector_new = [vector_init[0]-l*grad_a, vector_init[1]-l*grad_b]
    return vector_new


# определим функцию стох.град.спуска
def stoch_grad_descent_usual(x_us, y_us, l=0.1, steps = 800):
#     для самого начала работы функции зададим начальные значения коэффициентов
    vector_init = [float(random.uniform(-0.5, 0.5)), float(random.uniform(-0.5, 0.5))]
    errors = []
#     запустим цикл спуска
# цикл расчитан на определенное количество шагов (steps)
    for i in range(steps):
        ind = random.choice(range(len(x_us)))
        new_vector = stoch_grad_step_usual(vector_init, x_us, ind, y_us, l)
        vector_init = new_vector
        errors.append(errors_sq_Kramer_method(vector_init,x_us,y_us))
    return (vector_init),(errors)


# запишем массив значений 
list_parametres_stoch_gradient_descence = stoch_grad_descent_usual(x_us, y_us, l=0.1, steps = 800)

print ' 33[1m' + ' 33[4m' + "Значения коэффициентов a и b:" + ' 33[0m'
print 'a =', round(list_parametres_stoch_gradient_descence[0][0],3)
print 'b =', round(list_parametres_stoch_gradient_descence[0][1],3)
print


print ' 33[1m' + ' 33[4m' + "Сумма квадратов отклонений:" + ' 33[0m'
print round(list_parametres_stoch_gradient_descence[1][-1],3)
print

print ' 33[1m' + ' 33[4m' + "Количество итераций в стохастическом градиентном спуске:" + ' 33[0m'
print len(list_parametres_stoch_gradient_descence[1])

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Bidh sinn a’ coimhead gu faiceallach air na co-èifeachdan agus gam ghlacadh fhìn a’ faighneachd na ceiste “Ciamar as urrainn seo a bhith?” Fhuair sinn luachan co-èifeachd eile Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh. Is dòcha gu bheil teàrnadh caisead stochastic air crìochan nas fheàrr a lorg airson a’ cho-aontar? Gu mì-fhortanach chan eil. Tha e gu leòr sùil a thoirt air an t-suim de chlaonaidhean ceàrnagach agus faicinn sin le luachan ùra de na co-èifeachdan, tha a’ mhearachd nas motha. Chan eil sinn ann an cabhag gu eu-dòchas. Togamaid graf den atharrachadh mearachd.

Còd airson a bhith a’ dealbhadh suim sgaraidhean ceàrnagach ann an teàrnadh caisead stochastic

print 'График №5 "Сумма квадратов отклонений по-шагово"'
plt.plot(range(len(list_parametres_stoch_gradient_descence[1])), list_parametres_stoch_gradient_descence[1], color='red', lw=2)
plt.xlabel('Steps (Iteration)', size=16)
plt.ylabel('Sum of squared deviations', size=16)
plt.show()

Graf Àir. 5 “Suim de chlaonadh ceàrnagach aig àm teàrnadh caisead stochastic”

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

A’ coimhead air a’ chlàr, bidh a h-uile càil a’ tuiteam na àite agus a-nis bidh sinn a’ ceartachadh a h-uile càil.

Mar sin dè thachair? Thachair na leanas. Nuair a thaghas sinn mìos air thuaiream, is ann airson a’ mhìos a chaidh a thaghadh a bhios an algairim againn a’ feuchainn ris a’ mhearachd ann an obrachadh a-mach teachd a-steach a lughdachadh. An uairsin bidh sinn a’ taghadh mìos eile agus ag ath-aithris an àireamhachadh, ach bidh sinn a’ lughdachadh na mearachd airson an dàrna mìos taghte. A-nis cuimhnich gu bheil a 'chiad dà mhìos a' gluasad gu mòr bho loidhne a 'cho-aontar ais-tharraing sreathach sìmplidh. Tha seo a’ ciallachadh, nuair a thèid gin den dà mhìos sin a thaghadh, le bhith a’ lughdachadh mearachd gach fear dhiubh, bidh an algairim againn gu mòr a’ meudachadh a’ mhearachd airson an t-sampall gu lèir. Mar sin dè a nì thu? Tha am freagairt sìmplidh: feumaidh tu an ceum teàrnaidh a lughdachadh. Às deidh na h-uile, le bhith a 'lùghdachadh a' cheum teàrnaidh, cuiridh am mearachd stad air "leum" suas is sìos. No an àite sin, cha stad a’ mhearachd “leum”, ach cha dèan e cho luath e :) Feuch an dèan sinn sgrùdadh.

Còd airson SGD a ruith le àrdachaidhean nas lugha

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

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Graf Àir. 6 “Suim de ghluasadan ceàrnagach aig àm teàrnadh caisead stochastic (80 mìle ceum)”

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Tha na co-èifeachdan air a thighinn air adhart, ach chan eil iad fhathast air leth freagarrach. Gu h-inntinneach, faodar seo a cheartachadh san dòigh seo. Bidh sinn a’ taghadh, mar eisimpleir, anns na 1000 tionndadh mu dheireadh luachan nan co-èifeachdan leis an deach an mearachd as lugha a dhèanamh. Fìor, airson seo feumaidh sinn cuideachd luachan nan co-èifeachdan fhèin a sgrìobhadh sìos. Cha dèan sinn seo, ach bheir sinn aire don chlàr-ama. Tha e a’ coimhead rèidh agus tha coltas gu bheil a’ mhearachd a’ dol sìos gu cothromach. Gu dearbh chan eil seo fìor. Bheir sinn sùil air a’ chiad 1000 tionndadh agus dèan coimeas eadar iad agus an fheadhainn mu dheireadh.

Còd airson cairt SGD (a’ chiad 1000 ceum)

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

Graf Àir. 7 “Suim de chlaonaidhean ceàrnagach SGD (a’ chiad 1000 ceum)”

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Graf Àir. 8 “Suim de chlaonaidhean ceàrnagach SGD (1000 ceum mu dheireadh)”

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Aig fìor thoiseach an teàrnadh, tha sinn a’ faicinn lùghdachadh gu math èideadh agus cas ann am mearachd. Anns na h-aithrisean mu dheireadh, chì sinn gu bheil a 'mhearachd a' dol timcheall agus timcheall air luach 1,475 agus aig cuid de dh'amannan eadhon co-ionann ris an luach as fheàrr seo, ach an uairsin bidh e fhathast a 'dol suas ... co-èifeachdan Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh и Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh, agus an uairsin tagh an fheadhainn airson nach eil a’ mhearachd cho beag. Ach, bha duilgheadas nas miosa againn: bha againn ri 80 mìle ceum a ghabhail (faic an còd) gus luachan fhaighinn faisg air an ìre as fheàrr. Agus tha seo mar-thà a’ dol an-aghaidh a’ bheachd a bhith a’ sàbhaladh ùine cunntais le teàrnadh caisead stochastic an coimeas ri teàrnadh caisead. Dè as urrainn a cheartachadh agus a leasachadh? Chan eil e duilich a thoirt fa-near gu bheil sinn gu misneachail a’ dol sìos anns a’ chiad chuairtean agus, mar sin, bu chòir dhuinn ceum mòr fhàgail anns a’ chiad chuairtean agus an ceum a lùghdachadh mar a ghluaiseas sinn air adhart. Cha dèan sinn seo san artaigil seo - tha e mar-thà ro fhada. Faodaidh an fheadhainn a tha ag iarraidh smaoineachadh air an son fhèin mar a nì iad seo, chan eil e duilich :)

A-nis leig leinn teàrnadh caisead stochastic a’ cleachdadh an leabharlainn ÀireamhPy (agus nach tuislich sinn thairis air na clachan a dh’ ainmich sinn na bu thràithe)

Còd airson teàrnadh caisead Stochastic (NumPy)

# для начала напишем функцию градиентного шага
def stoch_grad_step_numpy(vector_init, X, ind, y, l):
    x = X[ind]
    y_pred = np.dot(x,vector_init)
    err = y_pred - y[ind]
    grad_a = err
    grad_b = x[1]*err
    return vector_init - l*np.array([grad_a, grad_b])

# определим функцию стохастического градиентного спуска
def stoch_grad_descent_numpy(X, y, l=0.1, steps = 800):
    vector_init = np.array([[np.random.randint(X.shape[0])], [np.random.randint(X.shape[0])]])
    errors = []
    for i in range(steps):
        ind = np.random.randint(X.shape[0])
        new_vector = stoch_grad_step_numpy(vector_init, X, ind, y, l)
        vector_init = new_vector
        errors.append(error_square_numpy(vector_init,X,y))
    return (vector_init), (errors)

# запишем массив значений 
list_parametres_stoch_gradient_descence = stoch_grad_descent_numpy(x_np, y_np, l=0.001, steps = 80000)

print ' 33[1m' + ' 33[4m' + "Значения коэффициентов a и b:" + ' 33[0m'
print 'a =', round(list_parametres_stoch_gradient_descence[0][0],3)
print 'b =', round(list_parametres_stoch_gradient_descence[0][1],3)
print


print ' 33[1m' + ' 33[4m' + "Сумма квадратов отклонений:" + ' 33[0m'
print round(list_parametres_stoch_gradient_descence[1][-1],3)
print



print ' 33[1m' + ' 33[4m' + "Количество итераций в стохастическом градиентном спуске:" + ' 33[0m'
print len(list_parametres_stoch_gradient_descence[1])
print

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Thionndaidh na luachan a-mach gu bhith cha mhòr an aon rud ri nuair a thàinig iad sìos gun a bhith gan cleachdadh ÀireamhPy. Ach, tha seo loidsigeach.

Feuch an lorg sinn a-mach dè cho fada ‘s a thug teàrnadh caisead stochastic oirnn.

Còd airson a bhith a’ dearbhadh ùine àireamhachaidh SGD (80 mìle ceum)

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)

Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh

Mar as fhaide a-steach don choille, is ann as dorcha a bhios na sgòthan: a-rithist, tha am foirmle “fèin-sgrìobhte” a’ sealltainn an toradh as fheàrr. Tha seo uile a’ nochdadh gum feum dòighean eadhon nas seòlta a bhith ann airson an leabharlann a chleachdadh ÀireamhPy, a tha dha-rìribh a’ luathachadh gnìomhachd àireamhachd. San artaigil seo cha bhith sinn ag ionnsachadh mun deidhinn. Bidh rudeigin ri smaoineachadh anns an ùine shaor agad :)

Dèan geàrr-chunntas

Mus cuir mi geàrr-chunntas air, bu mhath leam ceist a fhreagairt a dh’ èirich as coltaiche bho ar leughadair gràdhach. Carson, gu dearbh, a leithid de “chràdh” le teàrnadh, carson a dh’ fheumas sinn coiseachd suas is sìos a ’bheinn (sìos gu ìre mhòr) gus an talamh ìosal luachmhor a lorg, ma tha inneal cho cumhachdach agus cho sìmplidh nar làmhan, anns an cruth de fhuasgladh anailis, a bhios sa bhad gar teleport chun àite cheart?

Tha am freagairt don cheist seo na laighe air an uachdar. A-nis tha sinn air sùil a thoirt air eisimpleir gu math sìmplidh, anns a bheil am fìor fhreagairt Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh an urra ri aon chomharra Fuasgladh co-aontar ath-thilleadh loidhneach sìmplidh. Chan fhaic thu seo gu tric nad bheatha, mar sin smaoinich sinn gu bheil 2, 30, 50 no barrachd shoidhnichean againn. Nach cuir sinn ris na mìltean seo, no eadhon deichean de mhìltean de luachan airson gach feart. Anns a 'chùis seo, is dòcha nach seas am fuasgladh anailis ris an deuchainn agus fàiligeadh. An uair sin, bidh teàrnadh caisead agus na h-atharrachaidhean aige gu slaodach ach gu cinnteach gar toirt nas fhaisge air an amas - an ìre as lugha den ghnìomh. Agus na gabh dragh mu astar - is dòcha gun coimhead sinn air dòighean a leigeas leinn fad ceum a shuidheachadh agus a riaghladh (is e sin, astar).

Agus a-nis an fhìor gheàrr-chunntas.

An toiseach, tha mi an dòchas gun cuidich an stuth a tha air a thaisbeanadh san artaigil le bhith a’ tòiseachadh “luchd-saidheans dàta” ann a bhith a’ tuigsinn mar a dh’ fhuasglas tu co-aontaran ais-tharraing sreathach sìmplidh (agus chan ann a-mhàin).

San dàrna h-àite, choimhead sinn air grunn dhòighean gus an co-aontar fhuasgladh. A-nis, a rèir an t-suidheachaidh, faodaidh sinn taghadh am fear as freagarraiche airson an duilgheadas fhuasgladh.

San treas àite, chunnaic sinn cumhachd shuidheachaidhean a bharrachd, is e sin fad ceum teàrnaidh caisead. Chan urrainnear am paramadair seo a dhìochuimhneachadh. Mar a chaidh a ràdh gu h-àrd, gus cosgais àireamhachadh a lughdachadh, bu chòir an fhad ceum atharrachadh aig àm an teàrnadh.

An ceathramh, anns a 'chùis againn, sheall gnìomhan "sgrìobhte dachaigh" na toraidhean ùine as fheàrr airson àireamhachadh. Is dòcha gu bheil seo mar thoradh air nach e an cleachdadh as proifeiseanta de chomasan an leabharlainn ÀireamhPy. Ach biodh sin mar a dh' fhaodas e, tha an co-dhùnadh a leanas 'ga mholadh fèin. Air an aon làimh, uaireannan is fhiach a bhith a 'ceasnachadh bheachdan stèidhichte, agus air an làimh eile, chan fhiach a h-uile càil a dhèanamh nas duilghe - air an làimh eile, uaireannan tha dòigh nas sìmplidh air fuasgladh fhaighinn air duilgheadas nas èifeachdaiche. Agus leis gur e ar n-amas trì dòighean-obrach a mhion-sgrùdadh gus fuasgladh fhaighinn air co-aontar ais-tharraing sreathach sìmplidh, bha cleachdadh gnìomhan “fèin-sgrìobhte” ceart gu leòr dhuinn.

Litreachas (no rudeigin mar sin)

1. Regression loidhneach

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

2. Modh ceàrnagan as lugha

mathprofi.ru/metod_naimenshih_kvadratov.html

3. Deudach

www.mathprofi.ru/chastnye_proizvodnye_primery.html

4. Caisead

mathprofi.ru/proizvodnaja_po_napravleniju_i_gradient.html

5. Sliochd caisead

habr.com/ga/post/471458

habr.com/ga/post/307312

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

6. Leabharlann àireamh

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

Cuir beachd ann