为了更好地了解内部工作原理和简单的进行进一步实验的方法,我正在尝试在R上实现(正规化)逻辑回归。
众所周知,实现它的一种方法是解决以下问题:
$$ \ arg \ min _ {\ beta} \ sum(-y_i(x_i'beta)+ log(1 + e ^ {x_i'beta)})+ \ lambda \ | \ beta \ | $$
但是,对于$ x_i'\ beta $的较大值,exp
会爆炸,返回一个Inf
值。我发现的一种解决方案是使用Rmpfr::mpfr
并增加一些精度,即
x <- mpfr(x, precBits = 106)
但是,这增加了相当大的开销性能。另一方面,glm
或glmnet
的基本实现设法相当快地获得解决方案。怎么了避免计算exp(x %*% beta)
的可能方法是什么?还是仅通过简化为其他实现方式(例如,在C或Fortran中)来实现?
注意:
我正在尝试使用Rsolnp::solnp
增强型拉格朗日优化器来完成此操作,并对参数有一定的限制。对于简单的回归问题,由于可以添加梯度,因此在性能上似乎不错,但是对于逻辑回归而言,可能不会太大吗?
Rsolnp:::solnp(pars = beta0, fun = logistic_optimizer,
eqfun = constraint,
ineqfun = positive_constraint,
ineqLB = rep(0, length(beta0)),
ineqUB =rep(Inf, length(beta0)),
LB = rep(0, length(beta0)),
UB = rep(Inf, length(beta0))
)
很高兴知道是否有更有效的方法来手动解决此问题,而不必减少到已知的库,例如glm
或glmnet
,因为我希望控制logistic_optimizer
表达。
答案 0 :(得分:0)
我建议检出功能optim {stats}
。有关LASSO实施,请参见此帖子:
How can I implement lasso in R using optim function
以及对于GLM实施:
此外,optim
部分用Mortran(Fortran的扩展名)编写,因此除非您是Fortran向导,否则修改自定义功能的optim
函数并不是那么容易。 / p>