我正在使用 R 在 R 中拟合线性模型glmnet
。原始(非正则化)模型是使用拟合的,lm
并且没有常数项(即它的形式为lm(y~0+x1+x2,data)
)。
glmnet
采用预测变量矩阵和响应向量。我一直在阅读glmnet
文档,但找不到关于常数项的内容。
那么,有没有办法要求glmnet
通过原点强制线性拟合?
我正在使用 R 在 R 中拟合线性模型glmnet
。原始(非正则化)模型是使用拟合的,lm
并且没有常数项(即它的形式为lm(y~0+x1+x2,data)
)。
glmnet
采用预测变量矩阵和响应向量。我一直在阅读glmnet
文档,但找不到关于常数项的内容。
那么,有没有办法要求glmnet
通过原点强制线性拟合?
是的, glmnet模型中包含截距,但它没有被正则化(参见通过坐标下降的广义线性模型的正则化路径,第 13 页)。通过仔细查看代码当然可以获得有关实现的更多细节(对于高斯族,它是由elnet()
调用的函数glmnet()
),但它是在 Fortran 中的。
您可以尝试使用惩罚包,它允许通过传递unpenalized = ~0
给来删除拦截penalized()
。
> x <- matrix(rnorm(100*20),100,20)
> y <- rnorm(100)
> fit1 <- penalized(y, penalized=x, unpenalized=~0,
standardize=TRUE)
> fit2 <- lm(y ~ 0+x)
> plot((coef(fit1) + coef(fit2))/2, coef(fit2)-coef(fit1))
要获得 Lasso 正则化,您可以尝试类似
> fit1b <- penalized(y, penalized=x, unpenalized=~0,
standardize=TRUE, lambda1=1, steps=20)
> show(fit1b)
> plotpath(fit1b)
如下图所示,使用两种方法计算的回归参数之间几乎没有差异(左),您可以非常轻松地绘制 Lasso 路径解(右)。