R glmnet如何计算最大lambda值?

R glmnet如何计算最大lambda值?,r,glmnet,lasso-regression,R,Glmnet,Lasso Regression,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 set

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
set.seed(1)
图书馆(“glmnet”)
x根据
help(“glmnet”)
最大lambda值是“所有系数均为零的最小值”:


快速一看,该值似乎是由
elnet

调用的Fortran代码计算出来的。为了得到相同的结果,您需要使用
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

mysd关于第二个问题,请参阅Friedman等人的论文。特别是,见等式(10),它在平衡时相等。只需检查在什么条件下,分子$S(\cdot,\cdot)$对于所有参数都为零。

逻辑回归的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
set.seed(1)
图书馆(“glmnet”)

抱歉,已经有一段时间了,但可能还是有帮助的:

通过在完全正则化模型的优化参数值(例如,所有惩罚参数设置为零)处找到目标函数梯度(即可能性得分函数)的最高绝对值,可以计算L1正则化任何问题的最大lambda值

但遗憾的是,我无法帮助解决价值观上的差异。虽然我可以说,我尝试使用比计算的最大lambda稍高一点的最大lambda值,比如说5%,这样所有选定参数受约束的模型肯定会成为估计模型数量的一部分。也许这就是glmnet正在做的事情


编辑:对不起,我把非正规模型和完全惩罚模型混淆了。现在在上面编辑。

谢谢,我知道最大lambda是系数为零的最小值。我还尝试在GitHub上浏览fortran代码,不幸的是fortran对我来说太陌生了,我根本无法理解它……问题的第二部分在这里得到了回答吗?这似乎只回答了lambda路径的计算,因为x和y是预先缩放的。在给定x和y的情况下,如何计算lambda路径?
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
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