r - 逻辑回归的有效估计
问题描述
为了更好地理解内部工作原理和进一步实验的简单途径,我正在尝试在 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
or glmnet
,因为我想要控制logistic_optimizer
表达式。
解决方案
我建议检查一下功能optim {stats}
。有关 LASSO 的实现,请参见这篇文章:
对于 GLM 实现:
此外,它部分是用 Mortran(Fortran 的扩展)编写的,因此修改自定义函数optim
的函数并不容易,除非您是 Fortran 向导。optim
推荐阅读
- android - ExecutionCriteria:任务包不可用
- c - 当我使用 fscanf 时核心转储
- javascript - jQuery toggleClass 旋转 180° 不起作用
- javascript - 修改数据后Vue.js输入值不更新
- javascript - React 什么时候开始支持 jsx 中的 'class' 属性
- javascript - Nodejs/puppeteer - 导航超时错误
- vhdl - 切片 STD_LOGIC_VECTOR 并重新组合?
- java - 加入后按枚举类型休眠过滤
- javascript - HTML 在两个选择列表之间发送值
- angular - 问题:错误类型错误:无法读取 null Angular 的属性“推送”