在 R 的 glmnet 包的文档中,它指出当拟合弹性网络时,glmnet 函数将使用一系列λ值,从所有系数为零的最小我怎样才能找到这样的值?
如何找到最小的λλ使得所有 Lasso / Elastic Net 系数都为零?
套索解求解
请注意,如果目标函数的缩放比例不同,
使用带有 GLMNET 的汽车示例:
fit<-glmnet(as.matrix(mtcars[,-1]),mtcars[,1], intercept=FALSE, standardize=FALSE)
1/32*max(abs(t(as.matrix(mtcars[,-1]))%*%mtcars[,1]))/(head(fit$lambda))[1]
正如预期的那样,这给出了值 1。
请注意,标准化和截距都设置为 FALSE。如果标准化和截距设置为 TRUE,则的值是在缩放回归量上计算的。(在这方面,请查看https://think-lab.github.io/d/205/#5,了解如何执行适当的缩放以获得您想要的结果。):
xy<-scale(mtcars)
fit<-glmnet(as.matrix(mtcars[,-1]),mtcars[,1])
(1/32*max(abs(t(xy[,-1])%*%mtcars[,1]*sqrt(32/31))))/(head(fit$lambda))[1]
这再次给出了值 1 ...
但是,如果拦截 = TRUE 但标准化 = FALSE,我不确定 glmnet 正在计算什么。
我们看到带有标准选项的 glmnet 计算为, 其中
事实证明,对于弹性网络问题(对应 ),其最大值计算为
实际上,例如设置我们有:
aa<-0.3
xy<-scale(mtcars)
fit<-glmnet(as.matrix(mtcars[,-1]),mtcars[,1],a=aa)
1/aa*(1/32*max(abs(t(xy[,-1])%*%mtcars[,1]*sqrt(32/31))))/(head(fit$lambda))[1]
这再次导致输出值。
那是为了计算。但是请注意,弹性网络标准可以重写为标准套索问题。
首先,我认为glmnet
将从大的而不是小的开始。这是文档:注意,如果我们想指定,最好按降序排列。
典型的用法是让程序根据 nlambda 和 lambda.min.ratio 计算自己的 lambda 序列。提供 lambda 值会覆盖此值。警告:小心使用。不要为 lambda 提供单个值(对于 CV 之后的预测,请改用 predict())。而是提供递减的 lambda 值序列。glmnet 依赖于它的暖启动速度,而且它通常更快地适应整个路径而不是计算单个适应。
另外,请参阅我的问题:为什么 `R` `glmnet` 需要以降序运行?
拟合结果包含使用的 lambda 值。这是一个例子。
library(glmnet)
fit=glmnet(as.matrix(mtcars[,-1]),mtcars[,1])
head(fit$lambda)
[1] 5.146981 4.689737 4.273114 3.893502 3.547614 3.232454