在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/