首页 > 解决方案 > 逻辑回归的有效估计

问题描述

为了更好地理解内部工作原理和进一步实验的简单途径,我正在尝试在 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)

但这增加了相当多的开销性能。另一方面,基本实现glmglmnet设法相当快地得到解决方案。怎么会这样?避免计算的可能方法是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))
                     )

很高兴知道是否有更有效的方法来手动解决这个问题,而无需减少到已知的库,例如glmor glmnet,因为我想要控制logistic_optimizer表达式。

标签: roptimizationlogistic-regressionlinear-programming

解决方案


我建议检查一下功能optim {stats}。有关 LASSO 的实现,请参见这篇文章:

如何使用优化函数在 R 中实现套索

对于 GLM 实现:

在 R 中应用成本函数

此外,它部分是用 Mortran(Fortran 的扩展)编写的,因此修改自定义函数optim的函数并不容易,除非您是 Fortran 向导。optim


推荐阅读