python - logistic/sigmoid 函数实现数值精度

标签 python scipy floating-point precision sigmoid

scipy.special.expit中,逻辑函数实现如下:

if x < 0
    a = exp(x) 
    a / (1 + a) 
else 
    1 / (1 + exp(-x))

但是,我已经看到其他语言/框架的实现可以简单地做到

1 / (1 + exp(-x))

我想知道 scipy 版本实际带来了多少好处。

对于非常小的x,结果接近于 0。即使 exp(-x) 溢出到 Inf,它仍然有效。

最佳答案

这实际上只是为了稳定性——输入非常大的值可能会返回意想不到的结果。

如果 expit 的实现方式与 1/(1 + exp(-x)) 相同,则将 -710 的值放入函数将返回 nan,而 -709 将按预期给出接近于零的值。这是因为 exp(710) 太大而不能成为 double 。

代码中的分支只是意味着避免了这种情况。

另见 this question and answer在 Stack Overflow 上。

关于python - logistic/sigmoid 函数实现数值精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37074566/

相关文章:

java - 像 Java 一样格式化 Python float

javascript - 模拟点击python中的javascript链接

python - 在 flask 应用程序上使用 cx_freeze

python - 测地线上的点

python - NumPy 的/科学的 : How to re-construct an ndarray?

python - 什么是 Perl 等同于 Python 的 type() 函数

Python错误: can't install scipy.优化.brentq

algorithm - 有效降低重复运算带来的舍入误差的影响

PHP整数舍入问题

c - sprintf 中的 %f 似乎在 TI 84 CE 在线 IDE 中不起作用