Bu modulda nazariya kodga aylandi: linear regression NumPy bilan noldan yozildi — tayyor kutubxona (scikit-learn) ishlatilmadi, chunki maqsad ichki mexanizmni ko’rish.
Ma’lumot va gipoteza
Boshlanish nuqtasi — (x, y) juftliklari va parametrlarning boshlang’ich qiymati:
import numpy as np
x = np.array([1.0, 2.0, 3.0, 4.0, 5.0]) # xususiyat
y = np.array([3.0, 5.2, 6.8, 9.1, 11.0]) # javob
w, b = 0.0, 0.0 # boshlang'ich parametrlar
def h(x, w, b):
return w * x + b
E’tibor bering: h bitta son emas, butun massiv uchun ishlaydi — NumPy vektorlashuvi tufayli sikl kerak emas. Bu ham qisqa, ham sezilarli tez.
Cost funksiyani kodlash
def cost(x, y, w, b):
m = len(x)
xato = h(x, w, b) - y
return (xato ** 2).sum() / (2 * m)
print(cost(x, y, w, b))
Natija:
28.6858
w = b = 0 da model hamma narsaga 0 deb javob beradi — xato katta. O’qitishning butun maqsadi shu sonni kamaytirish.
Gradient descent sikli
alpha = 0.02
m = len(x)
for i in range(1000):
xato = h(x, w, b) - y
dw = (xato * x).sum() / m # ∂J/∂w
db = xato.sum() / m # ∂J/∂b
w = w - alpha * dw # bir vaqtda yangilash:
b = b - alpha * db # dw, db avval hisoblab olindi
if i % 200 == 0:
print(f"{i}: J = {cost(x, y, w, b):.4f}")
Natija (taxminan):
0: J = 24.1341
200: J = 0.0684
400: J = 0.0464
600: J = 0.0330
800: J = 0.0249
J ning har chiqishda kamayib borishi — algoritm to’g’ri ishlayotganining asosiy belgisi. Agar J o’ssa yoki sakrasa — birinchi gumon α da: uni kamaytiring. Bu tekshiruv odatini tashlamang: cost egri chizig’i (learning curve) — o’qitishning "yurak kardiogrammasi".
Klassik xato — yangilashda ketma-ketlikni buzish: w ni yangilab, so’ng db ni yangi w bilan hisoblash. Yuqoridagi kodda dw va db ikkalasi eski parametrlarda hisoblanib, keyin o’zlashtirilgan — shuni saqlang.
Natijani ko’rish
import matplotlib.pyplot as plt
plt.scatter(x, y, label="ma'lumot")
plt.plot(x, h(x, w, b), color="red", label=f"h(x) = {w:.2f}x + {b:.2f}")
plt.legend()
plt.show()
Qizil chiziq — model o’rgangan bog’lanish. U nuqtalar orasidan "eng kam kvadrat xato" ma’nosida o’tadi. Yangi x uchun bashorat — shunchaki h(yangi_x, w, b).
Xulosa
Butun supervised learning shu uch qadamda mujassam: model tanla → xatoni o’lchaydigan cost yoz → costni optimallashtir. Keyinroq model murakkablashadi (neyron tarmoqlar), cost boshqa bo’ladi (cross-entropy), optimizator rivojlanadi (Adam) — lekin skelet o’sha-o’sha. Shu modulni qo’lda yozib chiqqan odam keyingi mavzularda "sehr" ko’rmaydi — faqat tanish qadamlarni ko’radi.
Amaliyot
- Yuqoridagi kodni to’liq terib ishga tushiring; oxirgi w va b ni yozib oling (w ≈ 2, b ≈ 1 atrofida chiqishi kerak).
- α = 0.5 qilib qayta ishga tushiring va J ga nima bo’lishini kuzating; keyin α = 0.001 bilan — nechta iteratsiya yetmayotganini baholang.
- Har 10-iteratsiyadagi J qiymatlarini listga yig’ib, iteratsiya bo’yicha grafigini chizing (learning curve).
- O’zingiz kichik dataset o’ylab toping (masalan, tajriba yili → maosh, 6–8 nuqta) va modelni shunga o’qiting; 10 yil tajriba uchun bashorat qiling.
- Kodni
def fit(x, y, alpha, iters):funksiyaga o’rang — u (w, b) qaytarsin. Bu sizning birinchi mini-kutubxonangiz.
Modul testi keyingi darsda.