我正在尝试根据等式在 R 中实现岭回归:β= (AT A+λI)^−1 ATy
我相信我已经正确地实现了代码,但是我得到的 beta 值与标准 glmnet 实现不匹配。我相信这是由于 gmlnet 在幕后进行了一些规范化。我为 y 和 A 编写了自己的归一化函数,但仍然没有得到所需的输出。 glmnet 的幕后还有其他我不知道的事情吗?如果是这样,是否可以在我的实现中禁用它或复制它?
#import packages
library(glmnet)
library(Matrix)
#Function for normalizing A
normalize <- function(x) {
return ((x - min(x, na.rm = TRUE)) / (max(x, na.rm = TRUE) - min(x, na.rm = TRUE)))}
#set up values
A = rbind(c(1,2),c(4,3),c(9,4),c(-2,-5))
A.norm = as.matrix(apply(A,2,normalize))
y = c(2,7,6,-3)
y.magnatude = sqrt(sum(y^2))
y.norm = y / y.magnatude
lamda = 50
#compute beta
mybeta = solve(t(A.norm) %*% A.norm + lamda * diag(2), t(A.norm) %*% y.norm)
#using glmnet
fit = glmnet(A.norm,y.norm, alpha=0,lambda=lamda/4,intercept = F, standardize = F)
beta = as.matrix(fit$beta)
#Print result
cat("my beta: " , mybeta, "\n")
cat("glmnet beta: " , beta, "\n")
产生输出:
my beta: 0.01952199 0.02593064
glmnet beta: 0.01010245 0.01342469"