2017-02-19 31 views
1

Я использую набор данных Boston в качестве своего ввода, и я пытаюсь построить модель для прогнозирования MEDV (медианные значения занимаемого владельцем жилья в 1000 долларов США) с использованием RM (среднее количество комнат на одно жилье)Разница в значениях Theta между градиентным спуском и линейной моделью в R

Я укрепил следующий код от Digitheads blog, а не так сильно, как вы можете видеть.

Мой код выглядит следующим образом:

#library(datasets) 
#data("Boston") 

x <- Boston$rm 
y <- Boston$medv 

# fit a linear model 
res <- lm(y ~ x) 
print(res) 

Call: 
lm(formula = y ~ x) 

Coefficients: 
(Intercept)   x 
    -34.671  9.102 

# plot the data and the model 
plot(x,y, col=rgb(0.2,0.4,0.6,0.4), main='Linear regression') 
abline(res, col='blue') 

enter code here

# squared error cost function 
cost <- function(X, y, theta) { 
    sum((X %*% theta - y)^2)/(2*length(y)) 
} 

# learning rate and iteration limit 
alpha <- 0.01 
num_iters <- 1000 

# keep history 
cost_history <- double(num_iters) 
theta_history <- list(num_iters) 

# initialize coefficients 
theta <- matrix(c(0,0), nrow=2) 

# add a column of 1's for the intercept coefficient 
X <- cbind(1, matrix(x)) 

# gradient descent 
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 
} 

print(theta) 

      [,1] 
[1,] -3.431269 
[2,] 4.191125 

Согласно Digitheads блога, его значение для тета, используя лм (линейная модель) и его значение от градиента матча спуска, в то время как у меня нет. Разве эти цифры не совпадают?

Как вы можете видеть из графика для различных значений тета, мой последний y-перехват не подсчитывает значение печати (тета) несколько строк вверх?

Может кто-нибудь сделать предложение о том, куда я иду не так?

Linear Regression Gradient Descent

+1

Я думаю, что это просто требуется время, чтобы сходиться. Если я повторно запустил вашу модель, но увеличил число итераций до 50 тыс. Или 100 тыс., Я получаю тот же результат, что и оценки ols. – gfgm

+0

@GabrielFGeislerMesevage. Да, увеличивая итерации, я получаю то же значение для GD, что и OLS. Пожалуйста, бросьте комментарий в качестве ответа, и я с радостью буду принимать его в качестве правильного ответа. Большое спасибо. – TheGoat

+0

Спасибо. Добавлен комментарий в качестве ответа. – gfgm

ответ

1

Градиентный спуск занимает некоторое время, чтобы сходиться. Увеличение количества итераций приведет к тому, что модель сходится к значениям OLS. Например:

# learning rate and iteration limit 
alpha <- 0.01 
num_iters <- 100000 # Here I increase the number of iterations in your code to 100k. 
# The gd algorithm now takes a minute or so to run on my admittedly 
# middle-of-the-line laptop. 

# keep history 
cost_history <- double(num_iters) 
theta_history <- list(num_iters) 

# initialize coefficients 
theta <- matrix(c(0,0), nrow=2) 

# add a column of 1's for the intercept coefficient 
X <- cbind(1, matrix(x)) 

# gradient descent (now takes a little longer!) 
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 
} 

print(theta) 
    [,1] 
[1,] -34.670410 
[2,] 9.102076