根据 Friedman, Hastie & Tibshirani (2010) 的策略是选择一个最小值 lambda_min = epsilon * lambda_max,并在对数尺度上构造一个从 lambda_max 到 lambda_min 递减的 K 值序列。典型值为 epsilon = 0.001 和 K = 100。'
以下示例生成数据,计算 lambda 路径并将其与 glmnet 的路径进行比较:
## Load library and generate some data to illustrate:
library("glmnet")
set.seed(1)
n <- 100
x <- matrix(rnorm(n*20), n, 20)
y <- rnorm(n)
## Standardize variables: (need to use n instead of (n-1) as denominator)
mysd <- function(z) sqrt(sum((z-mean(z))^2)/length(z))
sx <- scale(x, scale = apply(x, 2, mysd))
sx <- as.matrix(sx, ncol = 20, nrow = 100)
## Calculate lambda path (first get lambda_max):
lambda_max <- max(abs(colSums(sx*y)))/n
epsilon <- .0001
K <- 100
lambdapath <- round(exp(seq(log(lambda_max), log(lambda_max*epsilon),
length.out = K)), digits = 10)
lambdapath
## Compare with glmnet's lambda path:
fitGLM <- glmnet(sx, y)
fitGLM$lambda
请注意,glmnet 不会计算所有 100 个(默认)lambda 值的解决方案,它会提前停止。不知道停止的规则是什么。
另见How does glmnet compute the maximal lambda value
Friedman, J.、Hastie, T. 和 Tibshirani, R. (2010)。通过坐标下降的广义线性模型的正则化路径。 统计软件杂志,33(1),1.