R中梯度下降与线性模型之间Theta值的差异

时间:2017-02-19 00:19:46

标签: r machine-learning linear-regression gradient-descent

我正在使用波士顿数据集作为我的输入,我正在尝试使用RM(每个住宅的平均房间数)建立一个模型来预测MEDV(自住房屋的中位数为1000美元)

我已将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博客,他使用lm(线性模型)的theta值和他从渐变下降的值匹配,而我没有。这些数字不一定匹配吗?

从图中可以看到theta的各种值,我的最终y截距与几行的打印(theta)值不相符?

有人可以就我出错的地方提出建议吗?

Linear Regression Gradient Descent

1 个答案:

答案 0 :(得分: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