Ҳалли муодилаи регрессияи оддии хатӣ

Дар мақола якчанд роҳҳои муайян кардани муодилаи математикии хати регрессионии оддӣ (ҷуфтшуда) баррасӣ мешавад.

Ҳама усулҳои ҳалли муодилаи дар ин ҷо баррасӣшуда ба усули квадратҳои хурдтарин асос ёфтаанд. Биёед усулҳоро ба таври зерин нишон диҳем:

  • Ҳалли таҳлилӣ
  • Пастшавии градиент
  • Пастшавии градиенти стохастикӣ

Барои ҳар як усули ҳалли муодилаи хати рост, мақола вазифаҳои гуногунро пешниҳод мекунад, ки асосан ба онҳое тақсим мешаванд, ки бидуни истифодаи китобхона навишта шудаанд. нопок ва онҳое, ки барои ҳисобҳо истифода мебаранд нопок. Гумон меравад, ки истифодаи моҳирона нопок харочоти хисоббарориро кам мекунад.

Ҳама рамзҳои дар мақола овардашуда ба забон навишта шудаанд питон 2.7 истифода бурда мешавад Дафтарчаи Юпитер. Рамзи манбаъ ва файл бо маълумоти намунавӣ ҷойгир карда мешаванд Github

Мақола бештар ба ҳам шурӯъкунандагон ва ҳам онҳое нигаронида шудааст, ки аллакай тадриҷан ба омӯзиши як бахши хеле васеъ дар зеҳни сунъӣ - омӯзиши мошинсозӣ шурӯъ кардаанд.

Барои нишон додани мавод мо як мисоли хеле соддаро истифода мебарем.

Намунаи шароит

Мо панҷ арзиш дорем, ки вобастагиро тавсиф мекунанд Y аз он X (Ҷадвали №1):

Ҷадвали № 1 «Шартҳои намунавӣ»

Ҳалли муодилаи регрессияи оддии хатӣ

Мо тахмин мекунем, ки арзишҳо Ҳалли муодилаи регрессияи оддии хатӣ мохи сол аст ва Ҳалли муодилаи регрессияи оддии хатӣ — даромади ин мох. Ба ибораи дигар, даромад аз моҳи сол вобаста аст, ва Ҳалли муодилаи регрессияи оддии хатӣ - ягона аломате, ки даромад аз он вобаста аст.

Мисол ҳамин тавр аст, ҳам аз нуқтаи назари вобастагии шартии даромад аз моҳи сол ва ҳам аз нуқтаи назари шумораи арзишҳо - хеле каманд. Бо вуҷуди ин, чунин соддакунӣ имкон медиҳад, ки, чунон ки мегӯянд, на ҳамеша бо осонӣ, маводеро, ки шурӯъкунандагон азхуд мекунанд, шарҳ диҳанд. Ва инчунин соддагии рақамҳо ба онҳое, ки мехоҳанд мисолро дар рӯи коғаз бидуни хароҷоти зиёди меҳнатӣ ҳал кунанд, имкон медиҳад.

Фарз кунем, ки вобастагии дар мисол овардашударо бо муодилаи математикии хатти регрессияи оддии (ҷуфт) шакли хеле хуб тахмин кардан мумкин аст:

Ҳалли муодилаи регрессияи оддии хатӣ

ки Ҳалли муодилаи регрессияи оддии хатӣ моҳест, ки даромад дар он гирифта шудааст, Ҳалли муодилаи регрессияи оддии хатӣ - даромади мувофиқи моҳ; Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ коэффициентхои регрессионии хатти тахминй мебошанд.

Дар хотир доред, ки коэффициент Ҳалли муодилаи регрессияи оддии хатӣ аксар вақт нишебии ё градиенти хати тахминӣ номида мешавад; маблаѓеро ифода мекунад, ки тавассути он Ҳалли муодилаи регрессияи оддии хатӣ вақте ки он тағйир меёбад Ҳалли муодилаи регрессияи оддии хатӣ.

Аён аст, ки вазифаи мо дар мисол ин аст, ки ин гуна коэффициентҳоро дар муодила интихоб кунем Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ, ки дар он инҳирофҳои арзишҳои даромади ҳисобшудаи мо аз ҷавобҳои ҳақиқӣ, яъне. арзишҳои дар намуна пешниҳодшуда ҳадди ақал хоҳанд буд.

Усули квадрати камтарин

Мувофиқи усули квадратҳои камтарин, инҳироф бояд бо роҳи квадратии он ҳисоб карда шавад. Ин техника ба шумо имкон медиҳад, ки аз бекоркунии мутақобилаи инҳирофҳо канорагирӣ кунед, агар онҳо аломатҳои муқобил дошта бошанд. Масалан, агар дар як ҳолат, инҳироф аст +5 (плюс панҷ) ва дар дигар -5 (минуси панҷ), пас ҷамъи инҳирофҳо ҳамдигарро бекор мекунанд ва ба 0 (сифр) баробар мешаванд. Мумкин аст, ки инҳирофро квадратӣ накунанд, балки хосияти модулро истифода бурдан мумкин аст ва он гоҳ ҳама инҳирофҳо мусбат буда, ҷамъ мешаванд. Мо дар ин бора ба таври муфассал таваққуф намекунем, балки танҳо нишон медиҳем, ки барои роҳати ҳисобҳо квадрат кардани инҳироф маъмул аст.

Формула ин аст, ки бо он мо маблағи камтарини инҳирофҳои квадратиро (хатоҳоро) муайян мекунем:

Ҳалли муодилаи регрессияи оддии хатӣ

ки Ҳалли муодилаи регрессияи оддии хатӣ функсияи тахминии ҷавобҳои ҳақиқӣ аст (яъне даромаде, ки мо ҳисоб кардем),

Ҳалли муодилаи регрессияи оддии хатӣ ҷавобҳои ҳақиқӣ мебошанд (даромаде, ки дар намуна оварда шудааст),

Ҳалли муодилаи регрессияи оддии хатӣ индекси намунавӣ (шумораи моҳе, ки дар он инҳироф муайян карда мешавад) аст

Биёед функсияро дифференсия кунем, муодилаҳои дифференсиалии қисман муайян кунем ва барои гузаштан ба ҳалли аналитикӣ омода бошем. Аммо аввал биёед як экскурсияи кӯтоҳеро дар бораи он ки фарқият чист ва маънои геометрии ҳосиларо ба ёд орем.

Тафовут

Тафовут ин амали дарёфти ҳосилаи функсия мебошад.

Ҳосила барои чӣ истифода мешавад? Ҳосилаи функсия суръати тағирёбии функсияро тавсиф мекунад ва ба мо самти онро мегӯяд. Агар ҳосили дар нуқтаи додашуда мусбат бошад, он гоҳ функсия зиёд мешавад, дар акси ҳол, функсия кам мешавад. Ва чӣ қадаре ки қимати ҳосилаи мутлақ зиёд бошад, ҳамон қадар суръати тағирёбии қимматҳои функсия баландтар аст, инчунин нишебии графики функсия ҳамон қадар баландтар аст.

Масалан, дар шароити системаи координатаҳои декартӣ арзиши ҳосилшуда дар нуқтаи M(0,0) ба 25 + маънои онро дорад, ки дар як нуқтаи додашуда, вақте ки арзиш иваз карда мешавад Ҳалли муодилаи регрессияи оддии хатӣ ба рост бо воҳиди муқаррарӣ, арзиш Ҳалли муодилаи регрессияи оддии хатӣ 25 вохиди шартй меафзояд. Дар график он ба болоравии хеле баланди арзишҳо монанд аст Ҳалли муодилаи регрессияи оддии хатӣ аз нуқтаи додашуда.

Мисоли дигар. Арзиши ҳосилшуда баробар аст -0,1 маънои онро дорад, ки ҳангоми кӯчонида шудан Ҳалли муодилаи регрессияи оддии хатӣ ба як воҳиди шартӣ, арзиш Ҳалли муодилаи регрессияи оддии хатӣ факат 0,1 вохиди шартй кам мешавад. Дар баробари ин, дар графики функсия мо нишебии ба таври базӯр намоёнро ба поён мушоҳида кардан мумкин аст. Бо кӯҳ муқоиса карда, гӯё мо хеле оҳиста аз нишебии мулоим аз кӯҳ фуромада истодаем, бар хилофи мисоли қаблӣ, ки мо бояд ба қуллаҳои хеле нишеб баромадем :)

Хамин тавр, пас аз дифференциацияи функсия Ҳалли муодилаи регрессияи оддии хатӣ аз рӯи эҳтимолият Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ, мо муодилаҳои дифференсиалии қисман тартиби 1-ро муайян мекунем. Пас аз муайян кардани муодилаҳо, мо системаи ду муодиларо мегирем, ки тавассути ҳалли онҳо мо метавонем чунин арзишҳои коэффитсиентҳоро интихоб кунем. Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ, ки барои он кимати ҳосилаҳои мувофиқ дар нуқтаҳои додашуда ба миқдори хеле ва хеле кам тағйир меёбад ва дар ҳолати ҳалли таҳлилӣ умуман тағир намеёбад. Ба ибораи дигар, функсияи хатогӣ дар коэффисиентҳои ёфтшуда ба ҳадди ақал мерасад, зеро арзишҳои ҳосилаҳои қисман дар ин нуқтаҳо ба сифр баробар хоҳанд шуд.

Ҳамин тариқ, мувофиқи қоидаҳои дифференсиатсия муодилаи қисман ҳосилшудаи дараҷаи 1 нисбат ба коэффицент Ҳалли муодилаи регрессияи оддии хатӣ шакл мегирад:

Ҳалли муодилаи регрессияи оддии хатӣ

Муодилаи ҳосилаи қисман тартиби 1 нисбат ба Ҳалли муодилаи регрессияи оддии хатӣ шакл мегирад:

Ҳалли муодилаи регрессияи оддии хатӣ

Дар натиҷа мо системаи муодилаҳоро гирифтем, ки ҳалли хеле соддаи таҳлилӣ дорад:

оғоз{муодила*}
оғоз {ҳодиса}
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
охири{ҳолат}
охири{муодила*}

Пеш аз ҳалли муодила биёед пешакӣ бор кунем, дурустии боркуниро тафтиш кунем ва маълумотро формат кунем.

Боркунӣ ва форматкунии маълумот

Бояд қайд кард, ки аз сабаби он, ки барои ҳалли таҳлилӣ ва баъдан барои пастшавии градиентӣ ва стохастикӣ, мо кодро дар ду вариант истифода мебарем: бо истифода аз китобхона нопок ва бидуни истифода аз он, ба мо форматкунии мувофиқи маълумот лозим мешавад (ниг. код).

Рамзи боркунӣ ва коркарди маълумот

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

Визуализатсия

Акнун, пас аз он ки мо, аввал, маълумотро бор кардем, дуюм, дурустии боркуниро тафтиш кардем ва дар ниҳоят формати маълумотро анҷом додем, мо визуализатсияи аввалро анҷом медиҳем. Усули аксар вақт барои ин истифода мешавад қитъаи ҷуфт китобхонаҳо Баҳри баҳр. Дар мисоли мо, аз сабаби маҳдуд будани шумора, истифодаи китобхона фоидае надорад Баҳри баҳр. Мо аз китобхонаи муқаррарӣ истифода хоҳем кард Матплотлиб ва танҳо ба қитъаи пароканда нигаред.

Рамзи пароканда

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

Диаграммаи №1 «Вобастагии даромад аз моҳи сол»

Ҳалли муодилаи регрессияи оддии хатӣ

Ҳалли таҳлилӣ

Биёед асбобҳои маъмултаринро дар python ва системаи муодилаҳоро ҳал кунед:

оғоз{муодила*}
оғоз {ҳодиса}
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
охири{ҳолат}
охири{муодила*}

Мувофики коидаи Крамер муайянкунандаи умумӣ, инчунин муайянкунандаҳоро тавассути Ҳалли муодилаи регрессияи оддии хатӣ ва аз ҷониби Ҳалли муодилаи регрессияи оддии хатӣ, пас аз он, тақсим кардани муайянкунанда ба Ҳалли муодилаи регрессияи оддии хатӣ ба муайянкунандаи умумӣ - коэффисиентро ёбед Ҳалли муодилаи регрессияи оддии хатӣ, ҳамин тавр мо коэффисиентро пайдо мекунем Ҳалли муодилаи регрессияи оддии хатӣ.

Рамзи ҳалли таҳлилӣ

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

Ин аст он чизе ки мо гирифтем:

Ҳалли муодилаи регрессияи оддии хатӣ

Ҳамин тариқ, арзишҳои коэффицентҳо пайдо шуданд, маблағи инҳирофҳои квадратӣ муқаррар карда шуд. Дар гистограммаи пароканда аз руи коэффициентхои ёфташуда хати рост гузаронем.

Рамзи хати регрессия

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

Диаграммаи № 2 «Ҷавобҳои дуруст ва ҳисобшуда»

Ҳалли муодилаи регрессияи оддии хатӣ

Шумо метавонед ба графики инҳироф барои ҳар моҳ нигаред. Дар ҳолати мо, мо аз он ягон арзиши назарраси амалӣ ба даст намеорем, аммо мо кунҷковии худро дар бораи он, ки муодилаи оддии регрессияи хатӣ вобастагии даромадро аз моҳи сол то чӣ андоза хуб тавсиф мекунад, қонеъ хоҳем кард.

Рамзи диаграммаи инҳироф

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

Диаграммаи № 3 «Инҳирофҳо, %»

Ҳалли муодилаи регрессияи оддии хатӣ

Комил нест, вале мо вазифаи худро ичро кардем.

Функсияеро нависед, ки коэффисиентҳоро муайян кунад Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ китобхонаро истифода мебарад нопок, аниқтараш, мо ду функсияро менависем: яке бо истифода аз матритсаи псевдоинверсивӣ (дар амал тавсия дода намешавад, зеро ин раванд аз ҷиҳати ҳисоббарорӣ мураккаб ва ноустувор аст), дигаре бо истифода аз муодилаи матритса.

Рамзи ҳалли таҳлилӣ (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

Вакти барои муайян кардани коэффициентхо сарфшударо мукоиса мекунем Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ, мувофиқи 3 усули пешниҳодшуда.

Рамзи ҳисобкунии вақти ҳисоб

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)

Ҳалли муодилаи регрессияи оддии хатӣ

Бо миқдори ками маълумот, функсияи "худнависӣ" пеш меояд, ки коэффитсиентҳоро бо усули Крамер пайдо мекунад.

Акнун шумо метавонед ба роҳҳои дигари ёфтани коэффицентҳо гузаред Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ.

Пастшавии градиент

Аввалан, биёед муайян кунем, ки градиент чист. Оддӣ карда гӯем, градиент сегментест, ки самти афзоиши максималии функсияро нишон медиҳад. Дар муқоиса бо баромадан ба кӯҳ, ки градиент дар он ҷоест, ки баландтарин кӯҳ ба қуллаи кӯҳ аст. Мисолро бо кӯҳ инкишоф дода, мо дар хотир дорем, ки дар асл ба мо барои ҳарчи зудтар расидан ба пастӣ, яъне ҳадди аққал - ҷойе, ки функсия зиёд ё кам намешавад, лозим аст. Дар ин лаҳза ҳосила ба сифр баробар мешавад. Аз ин рӯ, ба мо на градиент, балки антиградиент лозим аст. Барои пайдо кардани антиградиент ба шумо танҳо лозим аст, ки градиентро бо зарб кунед -1 (минус як).

Ба он диққат диҳем, ки функсия метавонад якчанд минимум дошта бошад ва бо истифода аз алгоритми пешниҳодшуда ба яке аз онҳо ворид шуда, мо дигар минимумро пайдо карда наметавонем, ки он метавонад аз ҳадди ёфтшуда пасттар бошад. Биёед истироҳат кунем, ин ба мо таҳдид намекунад! Дар ҳолати мо, мо бо ҳадди ақали ягона сарукор дорем, зеро вазифаи мо Ҳалли муодилаи регрессияи оддии хатӣ дар график як параболаи муқаррарӣ аст. Ва тавре ки ҳамаи мо бояд аз курси математикаи мактабии худ хеле хуб донем, парабола танҳо як ҳадди аққал дорад.

Пас аз он ки мо фаҳмидем, ки барои чӣ ба мо градиент лозим аст ва инчунин, градиент сегмент аст, яъне вектори координатҳои додашуда, ки маҳз ҳамон коэффитсиентҳо мебошанд Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ мо метавонем пастшавии градиентиро амалӣ кунем.

Пеш аз оғоз, ман тавсия медиҳам, ки танҳо чанд ҷумларо дар бораи алгоритми фаромадан хонед:

  • Мо координатахои коэффициентхоро ба таври псевдо-тасодуфй муайян мекунем Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ. Дар мисоли мо, мо коэффитсиентҳоро наздик ба сифр муайян мекунем. Ин як таҷрибаи маъмул аст, аммо ҳар як ҳолат метавонад таҷрибаи худро дошта бошад.
  • Аз координата Ҳалли муодилаи регрессияи оддии хатӣ арзиши ҳосилаи қисман тартиби 1-ро дар нуқта тарҳ кунед Ҳалли муодилаи регрессияи оддии хатӣ. Ҳамин тавр, агар ҳосила мусбат бошад, он гоҳ функсия зиёд мешавад. Аз ин рӯ, бо тарҳи арзиши ҳосилшуда, мо ба самти муқобили афзоиш, яъне ба самти пастшавӣ ҳаракат хоҳем кард. Агар ҳосила манфӣ бошад, он гоҳ функсия дар ин нуқта кам мешавад ва бо тарҳ кардани арзиши ҳосила мо ба самти пастшавӣ ҳаракат мекунем.
  • Мо бо координата чунин амал мекунем Ҳалли муодилаи регрессияи оддии хатӣ: арзиши ҳосилаи қисман дар нуқта тарҳ кунед Ҳалли муодилаи регрессияи оддии хатӣ.
  • Барои он ки аз ҳадди минимум ҷаҳида, ба фазои чуқур парвоз накунад, андозаи қадамро дар самти фуромадан муқаррар кардан лозим аст. Умуман, шумо метавонед як мақолаи пурра дар бораи чӣ гуна дуруст гузоштани қадам ва чӣ гуна тағир додани он дар ҷараёни фаромадан бо мақсади кам кардани хароҷоти ҳисоббарорӣ нависед. Аммо ҳоло дар назди мо вазифаи каме дигар аст ва андозаи қадамро бо истифода аз усули илмии "поке" ё, чунон ки ба истилоҳи маъмулӣ мегӯянд, ба таври таҷрибавӣ муқаррар мекунем.
  • Вақте ки мо аз координатҳои додашуда ҳастем Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ арзишҳои ҳосилшударо хориҷ мекунем, мо координатҳои нав мегирем Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ. Мо қадами ояндаро (тарҳи) мегузорем, ки аллакай аз координатҳои ҳисобшуда. Ва аз ин рӯ, давра такроран оғоз меёбад, то он даме, ки конвергенсияи зарурӣ ба даст ояд.

Ҳама! Акнун мо тайёрем, ки ба чустучуи дараи чукуртарини хандаки Мариана равем. Биёед оғоз кунем.

Рамзи пастшавии градиент

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

Ҳалли муодилаи регрессияи оддии хатӣ

Мо ба қаъри чуқури Мариана ғарқ шудем ва дар он ҷо ҳамаи арзишҳои коэффиценти якхеларо ёфтем Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ, ки маҳз ҳамон чизест, ки интизор мерафт.

Биёед боз як ғавб кунем, танҳо ин дафъа мошини амиқи мо бо технологияҳои дигар, яъне китобхона пур мешавад нопок.

Рамзи пастшавии градиент (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

Ҳалли муодилаи регрессияи оддии хатӣ
Қиматҳои коэффициент Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ тағйирнопазир.

Биёед бубинем, ки хатогӣ ҳангоми пастшавии градиент чӣ гуна тағир ёфт, яъне ҷамъи инҳирофҳои квадратӣ бо ҳар як қадам чӣ гуна тағир ёфт.

Рамз барои тарҳрезии маблағи инҳирофҳои квадратӣ

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

Графики № 4 «Ҷамъи инҳирофҳои квадратӣ ҳангоми пастшавии градиент»

Ҳалли муодилаи регрессияи оддии хатӣ

Дар график мо мебинем, ки бо хар як кадам хато кам мешавад ва пас аз шумораи муайяни такрорхо хатти кариб уфукиро мушохида мекунем.

Ниҳоят, биёед фарқияти вақти иҷрои кодро ҳисоб кунем:

Рамз барои муайян кардани вақти ҳисобкунии градиент

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)

Ҳалли муодилаи регрессияи оддии хатӣ

Шояд мо кори нодуруст карда истодаем, аммо боз ин як функсияи оддии "дар хона навишташуда" аст, ки китобхонаро истифода намебарад нопок бо истифода аз китобхона аз вақти ҳисобкунии функсия бартарӣ дорад нопок.

Аммо мо дар як ҷо намеистем, балки ба сӯи омӯхтани роҳи дигари ҳаяҷонбахши ҳалли муодилаи оддии регрессияи хатӣ ҳаракат карда истодаем. Бо мо вохӯред!

Пастшавии градиенти стохастикӣ

Барои зуд фаҳмидани принсипи кори градиенти стохастикӣ, беҳтар аст, ки фарқияти он аз градиенти муқаррарӣ муайян карда шавад. Мо, дар сурати пастшавии градиент, дар муодилахои ҳосилаҳои Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ ҷамъи арзишҳои ҳамаи хусусиятҳо ва ҷавобҳои ҳақиқии дар намуна мавҷудбударо истифода бурд (яъне маблағи ҳама Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ). Ҳангоми пайдоиши градиенти стохастикӣ, мо на ҳама арзишҳои дар намуна мавҷудбударо истифода мебарем, балки ба ҷои ин, псевдо-тасодуфӣ индекси ба ном намунаро интихоб карда, арзишҳои онро истифода мебарем.

Масалан, агар индекс рақами 3 (се) муайян карда шавад, мо арзишҳоро мегирем Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ, пас мо арзишҳоро ба муодилаҳои ҳосилавӣ иваз мекунем ва координатаҳои навро муайян мекунем. Пас аз муайян кардани координатҳо, мо боз ба таври псевдотасодуфан индекси интихобро муайян мекунем, арзишҳои ба индекс мувофиқро ба муодилаҳои дифференсиалии қисман иваз мекунем ва координатаҳоро ба таври нав муайян мекунем. Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ ва ғайра. то даме ки конвергенция сабз шавад. Дар назари аввал, чунин ба назар мерасад, ки ин тамоман кор намекунад, аммо ин кор мекунад. Дуруст аст, ки кайд кардан бамаврид аст, ки хато бо хар кадам кам намешавад, вале бешубха тамоюл мавчуд аст.

Бартарии градиенти стохастикӣ нисбат ба анъанавӣ чист? Агар андозаи намунаи мо хеле калон бошад ва бо даҳҳо ҳазор арзишҳо чен карда шавад, пас коркард кардани, масалан ҳазори тасодуфии онҳо, на тамоми интихоб, хеле осонтар аст. Дар ин ҷо пайдоиши градиенти стохастикӣ ба кор меояд. Дар ҳолати мо, албатта, мо фарқияти зиёдро мушоҳида намекунем.

Биёед кодро бубинем.

Рамзи градиенти стохастикӣ

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

Ҳалли муодилаи регрессияи оддии хатӣ

Мо ба коэффициентхо бодиккат назар карда, худамонро ба саволи «Ин чй тавр шуданаш мумкин?». Мо дигар арзишҳои коэффицентӣ гирифтем Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ. Шояд пастшавии градиенти стохастикӣ параметрҳои оптималии муодиларо пайдо карда бошад? Мутаассифона не. Ба ҷамъи инҳирофҳои квадратӣ нигоҳ кардан кифоя аст ва бубинед, ки бо арзишҳои нави коэффицентҳо хатогиҳо зиёдтаранд. Мо ба ноумедӣ шитоб намекунем. Биёед графики тағирёбии хаторо созем.

Рамз барои тарҳрезии маблағи инҳирофҳои квадратӣ дар градиенти стохастикӣ

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

Графики № 5 «Маблағи инҳирофҳои квадратӣ ҳангоми пастшавии градиенти стохастикӣ»

Ҳалли муодилаи регрессияи оддии хатӣ

Ба ҷадвал нигоҳ карда, ҳама чиз ба ҷои худ меафтад ва ҳоло мо ҳама чизро ислоҳ мекунем.

Пас, чӣ шуд? Ҳодисаи зерин рӯй дод. Вақте ки мо ба таври тасодуфӣ як моҳро интихоб мекунем, он гоҳ алгоритми мо кӯшиш мекунад, ки хатогиро дар ҳисоб кардани даромад кам кунад. Пас аз он мо як моҳи дигарро интихоб мекунем ва ҳисобро такрор мекунем, аммо хатогиро барои моҳи дуюми интихобшуда кам мекунем. Акнун дар хотир доред, ки ду моҳи аввал аз хати муодилаи оддии регрессияи хатӣ ба таври назаррас дур мешаванд. Ин маънои онро дорад, ки вақте ки яке аз ин ду моҳ интихоб карда мешавад, бо кам кардани хатогии ҳар яки онҳо, алгоритми мо хатогиро барои тамоми намуна ба таври ҷиддӣ афзоиш медиҳад. Пас, чӣ бояд кард? Ҷавоб оддӣ аст: шумо бояд қадами фаромаданро кам кунед. Баъд аз ҳама, бо кам кардани қадами фаромадан, хато низ "ҷаҳидан" -ро ба боло ва поён қатъ мекунад. Дурусттараш, хатогии "ҷаҳидан" қатъ намешавад, аммо он қадар зуд иҷро намекунад :) Биёед тафтиш кунем.

Рамз барои иҷро кардани SGD бо афзоиши хурдтар

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

Ҳалли муодилаи регрессияи оддии хатӣ

Графики № 6 «Маблағи инҳирофҳои квадратӣ ҳангоми пастшавии градиенти стохастикӣ (80 ҳазор қадам)»

Ҳалли муодилаи регрессияи оддии хатӣ

Коэффициентхо бехтар шуданд, вале хануз идеал нестанд. Гипотетика, инро бо ин роҳ ислоҳ кардан мумкин аст. Мо, масалан, дар 1000 такрори охир арзишҳои коэффитсиентҳоеро интихоб мекунем, ки бо онҳо хатогии ҳадди ақал содир шудааст. Дуруст аст, ки барои ин мо низ бояд арзишҳои худи коэффитсиентҳоро нависед. Мо ин корро не, балки ба график диккат медихем. Он ҳамвор менамояд ва хато ба таври баробар кам мешавад. Дар асл ин дуруст нест. Биёед ба 1000 такрори аввал назар андозем ва онҳоро бо охирин муқоиса кунем.

Рамзи диаграммаи SGD (1000 қадами аввал)

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

Графикаи № 7 «Ҷамъи инҳирофҳои квадратии SGD (1000 қадами аввал)»

Ҳалли муодилаи регрессияи оддии хатӣ

Графикаи № 8 «Ҷамъи инҳирофҳои квадратии SGD (1000 қадами охирин)»

Ҳалли муодилаи регрессияи оддии хатӣ

Дар ибтидои фуромадан мо камшавии хеле якранг ва якбора дар хатогиро мушохида мекунем. Дар такрори охирин, мо мебинем, ки хато дар атрофи арзиши 1,475 меравад ва дар баъзе лаҳзаҳо ҳатто ба ин арзиши оптималӣ баробар мешавад, аммо баъдан он боло меравад... Такрор мекунам, шумо метавонед арзишҳои коэффициентхо Ҳалли муодилаи регрессияи оддии хатӣ и Ҳалли муодилаи регрессияи оддии хатӣ, ва он гоҳ онҳоеро интихоб кунед, ки хатогиашон ҳадди ақалл аст. Бо вуҷуди ин, мо як мушкилоти ҷиддитаре доштем: мо маҷбур шудем, ки 80 ҳазор қадам гузорем (ниг. код) барои ба даст овардани арзишҳо ба оптималӣ наздиктар. Ва ин аллакай мухолифи идеяи сарфаи вақти ҳисобкунӣ бо пастшавии градиенти стохастикӣ нисбат ба пастшавии градиент мебошад. Чиро ислоҳ ва такмил додан мумкин аст? Муайян кардан душвор нест, ки мо дар такрори аввал дилпурона ба поён меравем ва аз ин ру, мо бояд дар такрори аввал кадами калон гузорем ва дар баробари пеш рафтан кадамро кам кунем. Мо инро дар ин мақола иҷро намекунем - он аллакай хеле дароз аст. Онҳое, ки мехоҳанд ин корро кунанд, худашон фикр кунанд, ин мушкил нест :)

Акнун биёед бо истифода аз китобхона градиенти стохастикиро иҷро кунем нопок (ва биёед ба сангҳое, ки қаблан муайян карда будем, пешпо нахӯрем)

Рамзи градиенти стохастикӣ (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

Ҳалли муодилаи регрессияи оддии хатӣ

Арзишҳо тақрибан якхела буданд, ки ҳангоми фуромадан бидуни истифода нопок. Бо вуҷуди ин, ин мантиқист.

Биёед бифаҳмем, ки градиентҳои стохастикӣ моро чӣ қадар тӯл кашидаанд.

Рамз барои муайян кардани вақти ҳисобкунии SGD (80 ҳазор қадам)

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)

Ҳалли муодилаи регрессияи оддии хатӣ

Хар кадар ба беша дуртар равад, абрхо хамон кадар тиратар мешаванд: боз формулаи «худнависанда» натичаи бехтаринро нишон медихад. Хамаи ин аз он гувохй медихад, ки роххои боз хам нозукитар истифода бурдани китобхона мавчуданд нопок, ки воқеан амалиёти ҳисоббарориро суръат мебахшад. Дар ин мақола мо дар бораи онҳо намефаҳмем. Дар вақти холии шумо чизе барои фикр кардан вуҷуд дорад :)

Биёед бубинем

Пеш аз хулоса кардан мехостам ба саволе посух диҳам, ки ба эҳтимоли зиёд аз ҷониби хонандаи азизи мо омадааст. Чаро, дар хакикат, ин гуна «шиканча» бо фуромадан, чаро мо лозим меояд, ки ба пастиву баландии кух (асосан поин) гардем, то дашти гаронбахоро пайдо кунем, агар дар дасти мо чунин асбоби тавоно ва оддие дошта бошем, дар шакли ҳалли таҳлилӣ, ки моро фавран ба ҷои рост телепорт мекунад?

Ҷавоби ин савол дар рӯи замин аст. Ҳоло мо як мисоли хеле соддаро дида баромадем, ки ҷавоби ҳақиқӣ дар он аст Ҳалли муодилаи регрессияи оддии хатӣ ба як аломат вобаста аст Ҳалли муодилаи регрессияи оддии хатӣ. Шумо инро дар ҳаёт аксар вақт намебинед, пас биёед тасаввур кунед, ки мо 2, 30, 50 ё зиёда аломатҳо дорем. Биёед ба ин ҳазорҳо ё ҳатто даҳҳо ҳазор арзишҳоро барои ҳар як атрибут илова кунем. Дар ин ҳолат, ҳалли таҳлилӣ метавонад ба санҷиш тоб наоварад ва ноком шавад. Дар навбати худ, пастшавии градиент ва вариантҳои он оҳиста, вале бешубҳа моро ба ҳадаф - ҳадди ақали функсия наздик мекунанд. Ва дар бораи суръат хавотир нашавед - мо эҳтимолан роҳҳоеро дида мебароем, ки ба мо имкон медиҳанд дарозии қадамро (яъне суръат) муқаррар ва танзим кунанд.

Ва ҳоло хулосаи мухтасари воқеӣ.

Аввалан, ман умедворам, ки маводи дар мақола овардашуда ба "олимони маълумот" дар фаҳмидани тарзи ҳал кардани муодилаҳои оддии (ва на танҳо) регрессияи хатӣ кӯмак хоҳад кард.

Дуюм, мо якчанд роҳҳои ҳалли муодиларо дида баромадем. Акнун, вобаста ба вазъият, мо метавонем якеро интихоб кунем, ки барои ҳалли мушкилот беҳтар аст.

Сеюм, мо қудрати танзимоти иловагӣ, яъне дарозии қадами пастшавии градиентро дидем. Ин параметрро нодида гирифтан мумкин нест. Чунон ки дар боло кайд карда шуд, бо максади кам кардани харочоти хисобхо дар вакти фуромадан дарозии кадамро тагьир додан лозим аст.

Чорум, дар ҳолати мо, функсияҳои «дар хона навишташуда» натиҷаҳои беҳтарини вақтро барои ҳисобҳо нишон доданд. Эҳтимол, ин аз он сабаб аст, ки аз ҳадди касбӣ истифода набурдани имкониятҳои китобхона бошад нопок. Аммо, ҳарчӣ бошад, хулосаи зерин аз худ бармеояд. Аз як тараф, баъзан ба андешаҳои муқарраршуда шубҳа кардан лозим аст, ва аз тарафи дигар, на ҳамеша ба ҳама чиз душвор кардан лозим аст - баръакс, баъзан роҳи соддатари ҳалли мушкилот самараноктар аст. Ва азбаски ҳадафи мо таҳлили се равиш барои ҳалли муодилаи оддии регрессияи хатӣ буд, истифодаи функсияҳои «худнависӣ» барои мо кофӣ буд.

Адабиёт (ё чизе монанди он)

1. Регрессияи хатӣ

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

2. Усули квадратҳои хурдтарин

mathprofi.ru/metod_naimenshih_kvadratov.html

3. Ҳосила

www.mathprofi.ru/chastnye_proizvodnye_primery.html

4. Градиент

mathprofi.ru/proizvodnaja_po_napravleniju_i_gradient.html

5. Пастшавии градиент

habr.com/en/post/471458

habr.com/en/post/307312

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

6. Китобхонаи NumPy

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

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

pythonworld.ru/numpy/2.html

Манбаъ: will.com

Илова Эзоҳ