glmnet如何计算最大lambda值?

Sac*_*amp 8 r lasso-regression glmnet

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
Run Code Online (Sandbox Code Playgroud)

包装插图(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
Run Code Online (Sandbox Code Playgroud)

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

小智 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
Run Code Online (Sandbox Code Playgroud)


Mar*_*ema 5

似乎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
Run Code Online (Sandbox Code Playgroud)