弹性网使用什么惩罚功能?

时间:2016-10-19 09:42:32

标签: r glmnet

我试图让penalized包和glmnet生成相同的输出。我管理过它,但不是我想象的那样。

据我了解文档,惩罚实施了带有惩罚labmda1 | beta |的天真套索+ lambda2 | beta | ^ 2。 glmnet的帮助文件和插图将惩罚为lambda(alpha | beta | +(1 - alpha)| beta | ^ 2/2)。请注意,最后一项除以2。

游戏显示我需要通过样本大小在一个实现中缩放惩罚参数,以在其他实现中获得相同的结果

library(glmnet)
library(penalized)

# Simulate some data
x <- rmvnorm(1000, mean=rep(0, 50))
y <- 1 / (1 + exp(x[, 1] + x[, 2] + x[, 3] + x[, 4]))
y <- rbinom(1000, prob=y, size=1)

# Set penalty paramters
alpha <- 0.5
lambda <- 0.1
lambda1 <- lambda * alpha * 1000
lambda2 <- lambda * (1 - alpha) / 2 * 1000

gnet <- glmnet(x, y, family="binomial", lambda=lambda, alpha=alpha, standardize=TRUE)
gco <- coef(gnet)
gco[abs(gco[, 1]) > 0, ] # non-zero coefficients

pmod <- penalized(y, x, lambda1=lambda1, lambda2=lambda2, standardize=TRUE)
coef(pmod)

结果相似,但不够接近。但是,如果我摆脱1/2的因素,我会得到匹配的答案。

lambda2 <- lambda * (1 - alpha) * 1000

gnet <- glmnet(x, y, family="binomial", lambda=lambda, alpha=alpha, standardize=TRUE)
gco <- coef(gnet)
gco[abs(gco[, 1]) > 0, ] # non-zero coefficients

pmod <- penalized(y, x, lambda1=lambda1, lambda2=lambda2, standardize=TRUE)
coef(pmod)

发生了什么?

0 个答案:

没有答案