glmnet如何计算最大lambda值?

时间:2014-08-12 06:43:44

标签: r glmnet lasso

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进行逻辑回归?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

您可以通过在完全正则化模型(例如. 所有惩罚参数都设置为零)。

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

编辑:抱歉,我将非正则化模型与完全惩罚模型混淆了。现在在上面编辑它。

答案 4 :(得分:0)

根据help("glmnet"),最大lambda值是&#34;所有系数为零的最小值&#34;:

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代码计算的。