我正在尝试学习一些基本的机器学习和一些基本的 R。我根据以下公式对 R
我的代码如下所示:
fitRidge <- function(X, y, lambda) {
# Add intercept column to X:
X <- cbind(1, X)
# Calculate penalty matrix:
lambda.diag <- lambda * diag(dim(X)[2])
# Apply formula for Ridge Regression:
return(solve(t(X) %*% X + lambda.diag) %*% t(X) %*% y)
}
请注意,我还没有尝试找到最佳的,我只是为给定的。然而,似乎有些不对劲。当我输入时,我得到了预期的 OLS 结果。我通过在同一数据集上应用 lm.ridge(lambda = 0) 来检查这一点,它给了我相同的系数。但是,当我输入任何其他惩罚时,例如或,我的系数和 lm.ridge 给出的系数大相径庭。我尝试查看 lm.ridge 的实现,但我无法弄清楚它的作用(因此它的作用不同)。
谁能解释为什么我的结果和 lm.ridge 的结果有区别?我在我的代码中做错了吗?我试过玩,scale()但在那里找不到答案。
编辑:
要查看会发生什么,请运行以下命令:
library(car)
X.prestige <- as.matrix.data.frame(Prestige[,c(1,2,3,5)])
y.prestige <- Prestige[,4]
fitRidge(X.prestige, y.prestige, 0)
coef(lm.ridge(formula = prestige~education+income+women+census, data = Prestige, lambda = 0))
fitRidge(X.prestige, y.prestige, 2)
coef(lm.ridge(formula = prestige~education+income+women+census, data = Prestige, lambda = 2))
编辑2:
好的,所以根据下面的回答,我对这个问题有了更清晰的理解。我还仔细阅读了 Hastie、Tibshirani 和 Friedman 在 TESL 中关于 RR 的部分,我发现截距通常被简单地估计为响应的平均值。似乎 RR online 上的许多资源都过于模糊。我实际上怀疑许多作家自己从未实施过 RR,并且可能没有意识到一些重要的事情,因为他们中的许多人遗漏了 3 个重要事实:
- 截距在正常情况下不会受到惩罚,上面的公式只适用于其他系数。
- RR 在标度下不是等变的,即即使对于相同的数据,不同的标度也会给出不同的结果。
- 从 1 开始,实际如何估计截距。
我尝试相应地改变我的功能:
fitRidge <- function(X, Y, lambda) {
# Standardize X and Y
X <- scale(X)
Y <- scale(Y)
# Generate penalty matrix
penalties <- lambda * diag(ncol(X))
# Estimate intercept
inter <- mean(Y)
# Solve ridge system
coeff <- solve(t(X) %*% X + penalties, t(X) %*% Y)
# Create standardized weight vector
wz <- c(inter, coeff )
return(wz)
}
我仍然没有得到与 lm.ridge 等效的结果,但这可能只是将公式转换回原始比例的问题。但是,我似乎无法弄清楚如何做到这一点。我认为它只需要乘以响应的标准偏差并添加平均值,就像标准分数一样,但要么我的函数仍然错误,要么重新调整比我意识到的更复杂。
有什么建议吗?