glmnet如何计算最大lambda值?

问题描述 投票:7回答:4

glmnet包使用从最大LASSO缩放的一系列lambda调整参数lambda_max,其中没有选择预测变量。我想知道glmnet如何计算这个lambda_max值。例如,在一个简单的数据集中:

set.seed(1)
library("glmnet")
x <- matrix(rnorm(100*20),100,20)
y <- rnorm(100)
fitGLM <- glmnet(x,y)
max(fitGLM$lambda)
# 0.1975946

包装插图(http://www.jstatsoft.org/v33/i01/paper)在2.5节中描述它计算此值如下:

sx <- as.matrix(scale(x))
sy <- as.vector(scale(y))
max(abs(colSums(sx*sy)))/100
# 0.1865232

这显然是接近但不是相同的价值。那么,是什么导致了这种差异?在一个相关的问题中,我如何计算lambda_max进行逻辑回归?

r glmnet lasso
4个回答
8
投票

要获得相同的结果,您需要使用n而不是n-1分母的标准偏差来标准化变量。

mysd <- function(y) sqrt(sum((y-mean(y))^2)/length(y))
sx <- scale(x,scale=apply(x, 2, mysd))
sx <- as.matrix(sx, ncol=20, nrow=100)
sy <- as.vector(scale(y, scale=mysd(y)))
max(abs(colSums(sx*sy)))/100
## [1] 0.1758808
fitGLM <- glmnet(sx,sy)
max(fitGLM$lambda)
## [1] 0.1758808

3
投票

似乎lambda_max的逻辑回归类似地计算,权重基于类比例:

set.seed(1)
library("glmnet")
x <- matrix(rnorm(100*20),100,20)
y <- rnorm(100)

mysd <- function(y) sqrt(sum((y-mean(y))^2)/length(y))
sx <- scale(x, scale=apply(x, 2, mysd))
sx <- as.matrix(sx, ncol=20, nrow=100)

y_bin <- factor(ifelse(y<0, -1, 1))
prop.table(table(y_bin)) 
# y_bin
#   -1    1 
# 0.62 0.38 
fitGLM_log <- glmnet(sx, y_bin, family = "binomial")
max(fitGLM_log$lambda)
# [1] 0.1214006
max(abs(colSums(sx*ifelse(y<0, -.38, .62))))/100
# [1] 0.1214006

1
投票

关于你的第二个问题,请看弗里德曼等人的论文"Regularization paths for generalized linear models via coordinate descent"。特别地,参见等式(10),其在平衡时是相等的。只需检查所有参数的分子$ S(\ cdot,\ cdot)$在什么条件下为零。


0
投票

根据help("glmnet"),最大lambda值是“所有系数为零的最小值”:

sum(fitGLM$beta[, which.max(fitGLM$lambda)])
#[1] 0
sum(glmnet(x,y, lambda=max(fitGLM$lambda)*0.999)$beta)
#[1] -0.0001809804

快速浏览一下,该值似乎是由elnet调用的Fortran代码计算出来的。

© www.soinside.com 2019 - 2024. All rights reserved.