Chiziqli regressiya


ULASHISH

Regressiya

Regressiya atamasi o‘zgaruvchilar orasidagi munosabatni topishga harakat qilganda ishlatiladi.

Mashinani o‘rganishda va statistik modellashtirishda bu munosabatlar kelajakdagi voqealar natijasini bashorat qilish uchun ishlatiladi.


Chiziqli regressiya

Chiziqli regressiya ma’lumotlar nuqtalari o‘rtasidagi munosabatlardan foydalanib, ularning barchasi bo‘ylab to‘g‘ri chiziq chizishadi.

Bu chiziq kelajakdagi qiymatlarni bashorat qilish uchun ishlatilishi mumkin.

Machine Learning-da kelajakni bashorat qilish juda muhimdir.


U qanday ishlaydi?

Python-da ma’lumotlar nuqtalari orasidagi munosabatni topish va chiziqli regressiya chizig‘ini chizish usullari mavjud. Biz sizga matematik formuladan o‘tish o‘rniga ushbu usullardan qanday foydalanishni ko‘rsatamiz.

Quyidagi misolda x o‘qi yoshni, y o‘qi esa tezlikni ifodalaydi. Biz 13 ta mashinaning pullik kassadan o‘tayotganda yoshi va tezligini qayd etdik. Keling, biz to‘plagan ma’lumotlar chiziqli regressiyada ishlatilishi mumkinligini bilib olaylik:

Misol

Tarqalish chizmasini chizish bilan boshlang:

import matplotlib.pyplot as plt x = [5,7,8,7,2,17,2,9,4,11,12,9,6] y = [99,86,87,88,111,86,103,87,94,78,77,85,86] plt.scatter(x, y) plt.show()

Natija:

Misolni ishga tushirish »

Misol

scipyni import qiling va chiziqli regressiya chizig‘ini chizing:

import matplotlib.pyplot as plt from scipy import stats x = [5,7,8,7,2,17,2,9,4,11,12,9,6] y = [99,86,87,88,111,86,103,87,94,78,77,85,86] slope, intercept, r, p, std_err = stats.linregress(x, y) def myfunc(x):   return slope * x + intercept mymodel = list(map(myfunc, x)) plt.scatter(x, y) plt.plot(x, mymodel) plt.show()

Natija:

Misolni ishga tushirish »

Misol tushuntirildi

Sizga kerak bo‘lgan modullarni import qiling.

Matplotlib moduli haqida bizning Matplotlib qo‘llanmamizda bilib olishingiz mumkin.

SciPy moduli haqida bizning SciPy o‘quv qo‘llanmamizdan bilib olishingiz mumkin.

import matplotlib.pyplot as plt
from scipy import stats

X va y o‘qlarining qiymatlarini ifodalovchi massivlarni yarating:

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

Chiziqli regressiyaning muhim kalit qiymatlarini qaytaradigan usulni bajaring:

slope, intercept, r, p, std_err = stats.linregress(x, y)

Yangi qiymatni qaytarish uchunslopeva intercept qiymatlaridan foydalanadigan funksiya yarating. Ushbu yangi qiymat y o‘qida mos keladigan x qiymati qayerga joylashtirilishini ko‘rsatadi:

def myfunc(x):
  return slope * x + intercept

X massivining har bir qiymatini funksiya orqali ishga tushiring. Bu y o‘qi uchun yangi qiymatlarga ega yangi massivga olib keladi:

mymodel = list(map(myfunc, x))

Asl tarqalish chizmasini chizing:

plt.scatter(x, y)

Chiziqli regressiya chizig‘ini chizing:

plt.plot(x, mymodel)

Diagrammani ko‘rsatish:

plt.show()



Munosabatlar uchun R

X o‘qining qiymatlari va y o‘qi qiymatlari o‘rtasidagi bog‘liqlik qanday ekanligini bilish muhimdir, agar aloqa bo‘lmasa, chiziqli regressiya hech narsani bashorat qilish uchun ishlatilmaydi.

Bu munosabat - korrelyatsiya koeffitsienti - r deb ataladi.

r qiymati -1 dan 1 gacha, bu yerda 0 hech qanday munosabatni bildirmaydi va 1 (va -1) 100% bog‘liqligini bildiradi.

Python va Scipy moduli siz uchun bu qiymatni hisoblab chiqadi, faqat uni x va y qiymatlari bilan ta’minlash kifoya.

Misol

Mening ma’lumotlarim chiziqli regressiyaga qanchalik mos keladi?

from scipy import stats x = [5,7,8,7,2,17,2,9,4,11,12,9,6] y = [99,86,87,88,111,86,103,87,94,78,77,85,86] slope, intercept, r, p, std_err = stats.linregress(x, y) print(r)
O‘zingiz sinab ko‘ring »

Eslatma: -0,76 natijasi mukammal emas, balki munosabatlar mavjudligini ko‘rsatadi, lekin kelajakdagi bashoratlarda chiziqli regressiyadan foydalanishimiz mumkinligini ko‘rsatadi.


Kelajakdagi qadriyatlarni bashorat qilish

Endi biz to‘plangan ma’lumotlardan kelajakdagi qiymatlarni bashorat qilish uchun foydalanishimiz mumkin.

Misol: Keling, 10 yillik mashinaning tezligini taxmin qilishga harakat qilaylik.

Buning uchun bizga yuqoridagi misoldagi bir xil myfunc() funksiyasi kerak bo‘ladi:

def myfunc(x):
  return slope * x + intercept

Misol

10 yoshli mashinaning tezligini taxmin qiling:

from scipy import stats x = [5,7,8,7,2,17,2,9,4,11,12,9,6] y = [99,86,87,88,111,86,103,87,94,78,77,85,86] slope, intercept, r, p, std_err = stats.linregress(x, y) def myfunc(x):   return slope * x + intercept speed = myfunc(10) print(speed)
Misolni ishga tushirish »

Misol 85,6 tezlikni bashorat qildi, biz buni diagrammadan ham o‘qiymiz:


Bad Fit?

Keling, chiziqli regressiya kelajakdagi qiymatlarni bashorat qilishning eng yaxshi usuli bo‘lmagan misol yarataylik.

Misol

X va y o‘qlari uchun bu qiymatlar chiziqli regressiya uchun juda yomon mos kelishiga olib kelishi kerak:

import matplotlib.pyplot as plt from scipy import stats x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40] y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15] slope, intercept, r, p, std_err = stats.linregress(x, y) def myfunc(x):   return slope * x + intercept mymodel = list(map(myfunc, x)) plt.scatter(x, y) plt.plot(x, mymodel) plt.show()

Natija:

Misolni ishga tushirish »

Va munosabatlar uchun r?

Misol

Siz juda past r qiymatini olishingiz kerak.

import numpy from scipy import stats x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40] y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15] slope, intercept, r, p, std_err = stats.linregress(x, y) print(r)
O‘zingiz sinab ko‘ring »

Natija: 0,013 juda yomon munosabatlarni ko‘rsatadi va bu ma’lumotlar to‘plami chiziqli regressiya uchun mos emasligini aytadi.


W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!