Tek değişkenli lineer regresyonda aşağıdaki gibi bir veri setini en iyi (hata kareleri toplamı en düşük) açıklayan $$ y = \beta_0 + \beta_1 x$$ doğrunun parametrelerini ($\beta_0$ ve $\beta_1$) hesaplamamız gerekir:
x |
y |
1.2 |
2.4 |
2.1 |
5.5 |
3 |
7.9 |
3.9 |
10.5 |
5 |
14.2 |
Yukarıdaki verisetinin satırlarına $(x_i,y_i)$, lineer regresyon modelinin çıktılarına $y_{pred}$ dersek, hata kareleri toplamı $$\sum (y_{pred} - y_i)^2$$ olur. Bu hata fonksiyonunu (loss function) minimize edecek katsayıların analitik çözümünü kullanalım, $x$'in ortalamasına $\bar{x}$ ve $y$'in ortalamasına $\bar{y}$ dersek: $$\begin{aligned} \beta_1 &= \frac{\sum (x_i - \bar{x}) (y_i - \bar{y})}{\sum (x_i - \bar{x})^2} \\ \beta_0 &= \bar{y} - \beta_1 \bar{x} \end{aligned}$$
Yukarıda $\beta_1$'in payındaki ifade $x$ ve $y$'nin kovaryansı, paydasındaki ifade de $x$'in varyansıdır. Ortalama, varyans ve kovaryans fonksiyonlarını yazarsak bu iş tertemiz hallolur:
# Değişkenler birer dizi (array) olarak verilsin
# Ortalama
def mean(values):
return sum(values) / len(values)
# Varyans
def variance(values):
m = mean(values)
return sum([(x-m)**2 for x in values])
# Kovaryans (values1 ve values2 dizilerinin uzunluğunu eşit varsayarak)
def covariance(values1, values2):
m1,m2 = mean(values1), mean(values2)
return sum([(values1[i] - m1)*(values2[i] - m2) for i in range(len(values1))])
# Lineer regresyon katsayıları
def linear_reg_coef(values1,values2):
b1 = covariance(values1,values2) / variance(values1)
b0 = mean(values2) - b1 * mean(values1)
return [b0, b1]
# Örnek
x = [1.2, 2.1, 3, 3.9, 5]
y = [2.4, 5.5, 7.9, 10.5, 14.2]
linear_reg_coef(x,y)