Yapay öğrenme’nin belki de ilk dersi Doğrusal Bağlanım (Lineer Regression)’dır. Andrew Ng’nin Coursera’daki dersinden esinlenerek basit bir çalışma yapacağız. Öncelikle timsahların ağırlığı ile burun uzunluğu arasındaki ilişkiyi tutan bir veriyi inceleyeceğiz. Ağırlık ve uzunluk arasındaki ilişkiyi, doğrusal bir denklem ile açıklayacağız. Bu işe doğrusal bağlanım ya da ingilizce adıyla lineer regression diyoruz. Çalışmamız iki aşamadan oluşuyor.

Verimizi Oluşturalım

Aşağıdaki veriyi r-bloggers’dan aldım.

uzunluk = c(3.87, 3.61, 4.33, 3.43, 3.81, 3.83, 3.46, 3.76,3.50, 3.58, 4.19, 3.78, 3.71, 3.73, 3.78)
agirlik = c(4.87, 3.93, 6.46, 3.33, 4.38, 4.70, 3.50, 4.50,3.58, 3.64, 5.90, 4.43, 4.38, 4.42, 4.25)
timsah = data.frame(uzunluk,agirlik)

Veriyi Çizdirelim

plot(agirlik ~ uzunluk, data = timsah,
  xlab = "Burun Uzunluğu",
  ylab = "Ağırlık",
  main = "Central Florida'daki Timsahlar"
)
grid(5, 5, lwd = 2)

Veriyi çizdiğimizde, burun uzunluğu ve ağırlık arasında doğrusal bir ilişkiyi saptıyabiliyoruz değil mi? Görünüşe göre, burun uzunluğu arttıkça, ağırlık da artıyor.

R Hazır İşlevleri ile Doğrusal Bağlanım

R ile bağlanım oldukça kolay. Bunun içinde aşağıdaki gibi lm() fonksiyonu kulanılır. summary() ile model parametrelerini elde edebiliriz.

Kolay.Baglanim = lm(agirlik ~ uzunluk, data = timsah)
summary(Kolay.Baglanim)

Call:
lm(formula = agirlik ~ uzunluk, data = timsah)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.24348 -0.03186  0.03740  0.07727  0.12669 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -8.4761     0.5007  -16.93 3.08e-10 ***
uzunluk       3.4311     0.1330   25.80 1.49e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1229 on 13 degrees of freedom
Multiple R-squared:  0.9808,    Adjusted R-squared:  0.9794 
F-statistic: 665.8 on 1 and 13 DF,  p-value: 1.495e-12

Burada lm(agirlik ~ uzunluk, data = timsah) komutunu kullanıyoruz. ~ işareti bağımlı ve bağımsız değişkenleri birbirinden ayırmak için kullanılır. Yukarıda pekçok bilgi var ama şu aşamada biz aşağıdaki bilgilerle ilgileniyoruz.

theta0 = Kolay.Baglanim$coefficients['(Intercept)']
theta1 = Kolay.Baglanim$coefficients['uzunluk']
print(c(theta0, theta1))
(Intercept)     uzunluk 
  -8.476067    3.431098 

Paramtrelerimiz şu şekilde,

Peşinde olduğumuz matematiksel denklem ise, \[y = \theta_0 + \theta_1 x \]

Değerleri yerine yazarsak

\[ agirlik = -8.4761 + 3.4311 * uzunluk\]

Bu doğrusal ilişkiyi verimizle birlikte çizdirelim.

plot(agirlik ~ uzunluk, data = timsah,
  xlab = "Burun Uzunluğu",
  ylab = "Ağırlık",
  main = "Central Florida'daki Timsahlar"
)
x = seq(2,6,0.5)
lines(x, (theta0 + theta1 * x), col = "red")
grid(5, 5, lwd = 2)

Ufak Bir Tahmin Yapalım mı?

Artık elimizde, veriyi açıklayan doğrusal denklemin parametreleri olduğuna göre, tahminde bulunabiliriz. Uzunluk 4’e eşitse Ağırlık ne olacaktır?

x.nokta = 4
tahmin = as.numeric(theta0 + theta1 * x.nokta)
print(tahmin)
[1] 5.248326
plot(agirlik ~ uzunluk, data = timsah,
  xlab = "Burun Uzunluğu",
  ylab = "Ağırlık",
  main = "Central Florida'daki Timsahlar"
)
x = seq(2,6,0.5)
lines(x, (theta0 + theta1 * x), col = "red")
# Tahminimizi büyük bir pembe nokta olarak çizelim
points(x.nokta, tahmin, col= 'pink', lwd= 23)
# Noktadan x ve y eksenlerine dik pembe çizgiler indirelim
segments(x.nokta, 0, x.nokta, tahmin, col= 'pink', lty = "dashed")
segments(0, tahmin, x.nokta, tahmin, col= 'pink', lty = "dashed")
grid(5, 5, lwd = 2)