-
Notifications
You must be signed in to change notification settings - Fork 12
/
metin_asamali_azalis.Rmd
115 lines (80 loc) · 2.92 KB
/
metin_asamali_azalis.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# Aşamalı alçalış
Bu belge kapsamında aşamalı alçalış kullanarak nasıl doğrusal modelleme gerçekleştirilebileceği irdelenecektir. Bu belgede genel olarak [Alex Beacher](https://www.alexbaecher.com/post/gradient-descent/) tarafından yazılmış blog yazısını temel alacaktır.
## Aşamalı alçalış
Bir öncek belgede basit kareler toplamı ismindek metodu kullanarak doğrusal modelleme yaptık. Ancak bu ders kapsamında biz istatistiksel öğrenmenin temellerini incelemek istiyoruz. Bu açıdan baktığımızda bu soruyu basit bir örnek üzerinden irdelemek güzel olacaktır.
## Veri
Bu çalışma kapsamınd veri simüle edeceğiz:
```{r}
set.seed(123)
x <- runif(1000, -5, 5)
y <- x + rnorm(1000) + 3
plot(y~x)
```
## Yöntem
İlk olarak maliyet fonksiyonumuzu yazalım. Burada ortalama karelerin toplamı hatasını kulladık:
```{r}
cost <- function(X, y, theta) {
sum( (X %*% theta - y)^2 ) / (2*length(y))
}
```
Şimdi ikinci önemli kısma geçelim:
+ öğrenme hızı (learning rate)
+ deneme sayısı (iteration limit)
```{r}
alpha <- 0.01
num_iters <- 1000
```
Şimdi ise maliyet fonksiyonumuzdan elde ettiğimiz çıktıyı ve katsayıları depolayacağımız listeleri hazırlayalım:
```{r}
cost_history <- double(num_iters)
theta_history <- list(num_iters)
theta <- matrix(c(0,0), nrow=2)
# add a column of 1's for the intercept coefficient
X <- cbind(1, matrix(x))
```
Burada `theta` olarak belirlediğimiz veri aslında bizim başlangıç katsayılarımız. Aslıbda $\beta_{0}$ ve $\beta_{1}$ katsayılarımız bunlar.
Peki bu katasyılar bize nasıl bir doğru çiziyor? Bakalım hemen. Burada gördüğümüz kırmızı çizgi aslında bizim başlangıç kastasıylarımız ifade eden denklem. Biz bu noktadan başlayarak bu veri en iyi açıklayan doğruyu tahmin etmeye çalışacağız.
```{r}
plot(y~x)
abline(coef=theta, col = "red")
```
Şimdi ise aşamalı alçalışı uygulayalım:
```{r}
for (i in 1:num_iters) {
error <- (X %*% theta - y)
delta <- t(X) %*% error / length(y)
theta <- theta - alpha * delta
cost_history[i] <- cost(X, y, theta)
theta_history[[i]] <- theta
}
```
Maliyet çıktısına bakalım (head ile)
```{r}
head(cost_history)
```
Katsayılara bakalım:
```{r}
head(theta_history)
```
Peki şimdi grafiği oluşturalım:
```{r}
iters <- c((1:31)^2, 1000)
cols <- rev(terrain.colors(num_iters))
library(gifski)
png("frame%03d.png")
par(ask = FALSE)
for (i in iters) {
plot(x,y, col="grey80", main='Linear regression using Gradient Descent')
text(x = -3, y = 10, paste("slope = ", round(theta_history[[i]][2], 3), sep = " "), adj = 0)
text(x = -3, y = 8, paste("intercept = ", round(theta_history[[i]][1], 3), sep = " "), adj = 0)
abline(coef=theta_history[[i]], col=cols[i], lwd = 2)
}
dev.off()
## png
## 2
png_files <- sprintf("frame%03d.png", 1:32)
gif_file <- gifski(png_files, delay = 0.1)
unlink(png_files)
utils::browseURL(gif_file)
```
![](animation.gif)