如何正确处理统计函数中的 Infs?

机器算法验证 r 功能 数字
2022-03-23 13:36:43

假设我有这样的功能:

f <- function(x){
  exp(x) / (1 + exp(x))
}

它应该适用于 x 的任何实际值,但实际上当 x 为 710 或更大时它返回 NaN。我想知道处理这个问题的正确方法是什么。我意识到让它返回 1 很容易,但从统计学家的角度来看,这可能不是一个好的行为。有人有什么意见或建议吗?

2个回答

在这种情况下,NaN返回(不是数字),因为双精度算术中的指数计算溢出。

一个在 MacLaurin 级数中展开为的代数等价表达式是0

exp(x)1+exp(x)=11+exp(x)=1exp(x)+exp(2x).

因为这是一个交替序列,所以删除任何一项的错误不会大于下一项的大小。因此,当时,误差不大于对于真实值。这比任何统计计算所需的精确得多,因此在这种情况下x>710exp(710)1030821024 1

有趣的是,当指数下溢R时不会产生因此,您可以根据 的符号选择更可靠的计算版本,如NaNx

f <- function(x) ifelse(x < 0, exp(x) / (1 + exp(x)), 1 / (1 + exp(-x)))

这个问题几乎出现在所有的计算平台上(我还没有看到一个例外),它们在处理上溢和下溢的方式上会有所不同。指数因制造这类问题而臭名昭著,但它们并不孤单。因此,仅仅有一个解决方案是不够的R:一个好的统计学家了解计算机算术的原理,并且知道如何使用这些原理来检测和解决她计算环境的特性。

其他人已经讨论了计算问题,所以我将把它留给他们。由于我假设您正在使用 R,我想我会指出引导包带有它自己的逆 logit 函数供您使用,它在计算上非常稳定:

require(boot) inv.logit(710)

似乎根据需要评估为 1。