in scipy.special.expit
wird logistische Funktion wie folgt umgesetzt:Logistik/Sigmoidfunktion Implementierung numerische Genauigkeit
if x < 0
a = exp(x)
a/(1 + a)
else
1/(1 + exp(-x))
Ich habe jedoch in anderen Sprachen/Frameworks gesehen Implementierungen, die einfach tun
1/(1 + exp(-x))
I Ich frage mich, wie viel Gewinn die scipy Version tatsächlich bringt.
Für sehr kleine x
nähert sich das Ergebnis 0. Es funktioniert auch, wenn exp(-x)
zu Inf
überläuft.
Ich bin nicht sicher, ich Ihren Punkt folgen ... Stabilität wird als die Motivation für den Code in [diesem GitHub-Thread] (https://github.com/scipy/scipy/pull/3386) zitiert. –
Was ich zu sagen versuchte, '1/(1 + exp (-710))' gibt 'NaN' nicht zurück, es gibt im IEEE-Standard 0 als '1/Inf = 0' zurück. Und es ist wahr in numpy '1/(1 + np.exp (-710)) == 0' – colinfang
Aber das Problem ist sicherlich für' expit (x) ', wobei' x' ein großer * negativer * Wert ist . Zum Beispiel muss 'expit (-710)' den Exponenten von positivem 710, i, e, berechnen. 'exp (+710)'. Das 'exp' im Quellcode I * think * bezieht sich auf die C-Math-Bibliothek' exp' Ihres Systems (nicht die ufunc 'np.exp'), die einen Fehler verursacht, wenn ein Überlauf erkannt wird, wie es hier der Fall ist. –