14

では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ます。

4

3 に答える 3

10

これは本当に安定性のためです。非常に大きな値を入力すると、予期しない結果が返される可能性があります。

expitがそのまま実装された場合1 / (1 + exp(-x))、 の値を-710関数に入れると が返されますがnan-709予想どおりゼロに近い値が返されます。これは、exp(710)が double であるには大きすぎるためです。

コード内の分岐は、このシナリオが回避されることを意味します。

Stack Overflow のこの質問と回答も参照してください。

于 2016-05-06T14:50:54.223 に答える
4

使用する方が効率的だと思われます:

if x < -709
  sigmoid = 0.0
else
  sigmoid = 1.0 / (1.0 + exp(-x))

やり過ぎと思われる 10^-309 精度の数値 (以下を参照) が必要でない限り!

>>> 1 / (1 + math.exp(709.78))
5.5777796105262746e-309
于 2016-07-20T09:34:45.997 に答える