나는 최고의 변수 사용했다 R. I에서 능선 회귀를 사용하여 회귀 모델의 솔루션을 찾기 위해 일부 데이터를 적용 lm.ridge
하고 glmnet
(언제 alpha=0
),하지만 결과는 특히 매우 다르다 lambda=0
. 두 모수 추정값이 동일한 값을 가지고 있다고 가정합니다. 그래서, 여기서 무엇이 문제입니까? 친애하는
나는 최고의 변수 사용했다 R. I에서 능선 회귀를 사용하여 회귀 모델의 솔루션을 찾기 위해 일부 데이터를 적용 lm.ridge
하고 glmnet
(언제 alpha=0
),하지만 결과는 특히 매우 다르다 lambda=0
. 두 모수 추정값이 동일한 값을 가지고 있다고 가정합니다. 그래서, 여기서 무엇이 문제입니까? 친애하는
답변:
glmnet은 y 변수를 표준화하고 제곱 오차의 합 대신 평균 제곱 오차를 사용합니다. 따라서 출력과 일치하도록 적절히 조정해야합니다.
library(ElemStatLearn)
library(glmnet)
library(MASS)
dof2lambda <- function(d, dof) {
obj <- function(lam, dof) (dof - sum(d ^ 2 / (d ^ 2 + lam))) ^ 2
sapply(dof, function(x) optimize(obj, c(0, 1e4), x)$minimum)
}
lambda2dof <- function(d, lam) {
obj <- function(dof, lam) (dof - sum(d ^ 2 / (d ^ 2 + lam))) ^ 2
sapply(lam, function(x) optimize(obj, c(0, length(d)), x)$minimum)
}
dat <- prostate
train <- subset(dat, train, select = -train)
test <- subset(dat, !train, select = -train)
train.x <- as.matrix(scale(subset(train, select = -lpsa)))
train.y <- as.matrix(scale(train$lpsa))
d <- svd(train.x)$d
dof <- seq(1, 8, 0.1)
lam <- dof2lambda(d, dof)
ridge1 <- lm.ridge(train.y ~ train.x, lambda = lam)
ridge2 <- glmnet(train.x, train.y, alpha = 0, lambda = lam / nrow(train.x))
matplot(dof, t(ridge1$coef), type = 'l')
matplot(lambda2dof(d, ridge2$lambda * nrow(train.x)), t(ridge2$beta), type = 'l')