Dies ist eine logistische Sigmoidfunktion:
Ich weiß x. Wie kann ich jetzt F (x) in Python berechnen?
Sagen wir x = 0,458.
F (x) =?
Dies sollte es tun:
import math
def sigmoid(x):
return 1 / (1 + math.exp(-x))
Und jetzt können Sie es testen, indem Sie anrufen:
>>> sigmoid(0.458)
0.61253961344091512
Update : Beachten Sie, dass das oben Gesagte hauptsächlich als direkte Eins-zu-Eins-Übersetzung des angegebenen Ausdrucks in Python-Code gedacht war. Es ist nicht getestet oder bekannt, dass es sich um eine numerisch einwandfreie Implementierung handelt. Wenn Sie wissen, dass Sie eine sehr robuste Implementierung benötigen, gibt es sicher andere, bei denen die Leute tatsächlich über dieses Problem nachgedacht haben.
sigmoid = lambda x: 1 / (1 + math.exp(-x))
math.exp
mitnp.exp
Ihnen nicht NaNs bekommen, obwohl Sie Laufzeit - Warnungen erhalten.math.exp
mit einem numpy-Array kann zu Fehlern führen, zTypeError: only length-1 arrays can be converted to Python scalars
. Um dies zu vermeiden, sollten Sie verwendennumpy.exp
.x = max(-709,x)
vor dem Ausdruck verringert werden ?Es ist auch in scipy verfügbar: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.logistic.html
Dies ist nur ein kostspieliger Wrapper (da Sie damit die logistische Funktion skalieren und übersetzen können) einer anderen Scipy-Funktion:
Wenn Sie über Aufführungen besorgt sind, lesen Sie weiter, andernfalls verwenden Sie einfach
expit
.Einige Benchmarking:
Wie erwartet
logistic.cdf
ist (viel) langsamer alsexpit
.expit
ist immer noch langsamer als die Python-sigmoid
Funktion, wenn sie mit einem einzelnen Wert aufgerufen wird, da es sich um eine universelle Funktion handelt, die in C ( http://docs.scipy.org/doc/numpy/reference/ufuncs.html ) geschrieben ist und daher einen Aufrufaufwand hat. Dieser Overhead ist größer als die Rechengeschwindigkeit,expit
die durch seine kompilierte Natur gegeben ist, wenn er mit einem einzelnen Wert aufgerufen wird. Aber es wird vernachlässigbar, wenn es um große Arrays geht:(Sie werden die winzige Änderung von
math.exp
nach bemerkennp.exp
(die erste unterstützt keine Arrays, ist jedoch viel schneller, wenn Sie nur einen Wert berechnen müssen))Wenn Sie jedoch wirklich Leistung benötigen, ist es üblich, eine vorberechnete Tabelle der Sigmoid-Funktion im RAM zu haben und Präzision und Speicher gegen eine gewisse Geschwindigkeit einzutauschen (zum Beispiel: http://radimrehurek.com/2013/09) / word2vec-in-python-part-two-optimizing / )
Beachten Sie außerdem, dass die
expit
Implementierung seit Version 0.14.0 numerisch stabil ist: https://github.com/scipy/scipy/issues/3385quelle
So würden Sie das logistische Sigmoid numerisch stabil implementieren (wie hier beschrieben ):
Oder vielleicht ist das genauer:
Intern implementiert es die gleiche Bedingung wie oben, verwendet dann aber
log1p
.Im Allgemeinen lautet das multinomiale logistische Sigmoid:
(Könnte
logaddexp.reduce
jedoch genauer sein.)quelle
max_q
undrebased_q
durchtau
? weil ich das versucht habe und keine Wahrscheinlichkeiten bekomme, die sich zu 1 summierenq
) durch Ihre Temperatur. rebased_q kann alles sein: Es ändert nichts an der Antwort. es verbessert die numerische Stabilität.nat_to_exp
Sind Sie sicher , dass dies Softmax entspricht (wie Sie in Ihrer anderen Antwort erwähnt haben)? Durch Kopieren und Einfügen werden Wahrscheinlichkeiten zurückgegeben, die nicht 1 ergebenein anderer Weg
quelle
pow
wird oft in Bezug aufexp
und implementiertlog
, daher ist dieexp
direkte Verwendung mit ziemlicher Sicherheit besser.x
es sehr negativ ist.Ein anderer Weg durch Transformation der
tanh
Funktion:quelle
Ich glaube, viele könnten an freien Parametern interessiert sein, um die Form der Sigmoidfunktion zu verändern. Zweitens möchten Sie für viele Anwendungen eine gespiegelte Sigmoid-Funktion verwenden. Drittens möchten Sie vielleicht eine einfache Normalisierung durchführen, zum Beispiel liegen die Ausgabewerte zwischen 0 und 1.
Versuchen:
Und zum Zeichnen und Vergleichen:
Schließlich:
quelle
Verwenden Sie das numpy-Paket, damit Ihre Sigmoid-Funktion Vektoren analysieren kann.
In Übereinstimmung mit Deeplearning verwende ich den folgenden Code:
quelle
Gute Antwort von @unwind. Es kann jedoch keine extrem negativen Zahlen verarbeiten (OverflowError auslösen).
Meine Verbesserung:
quelle
Tensorflow enthält auch eine
sigmoid
Funktion: https://www.tensorflow.org/versions/r1.2/api_docs/python/tf/sigmoidquelle
Eine numerisch stabile Version der logistischen Sigmoidfunktion.
quelle
Ein Einzeiler ...
quelle
Vektorisierte Methode bei Verwendung von
pandas DataFrame/Series
odernumpy array
:Die besten Antworten sind optimierte Methoden für die Einzelpunktberechnung. Wenn Sie diese Methoden jedoch auf eine Pandas-Reihe oder ein Numpy-Array anwenden möchten, ist dies erforderlich
apply
ist im Grunde eine Schleife im Hintergrund und wird über jede Zeile iteriert und die Methode . Das ist ziemlich ineffizient.Um unseren Code zu beschleunigen, können wir Vektorisierung und Numpy Broadcasting verwenden:
Oder mit einem
pandas Series
:quelle
Sie können es berechnen als:
oder konzeptionell, tiefer und ohne Importe:
oder Sie können numpy für Matrizen verwenden:
quelle
Der obige Code ist die logistische Sigmoid-Funktion in Python. Wenn ich das weiß
x = 0.467
, Die Sigmoidfunktion ,F(x) = 0.385
. Sie können versuchen, einen beliebigen Wert von x zu ersetzen, den Sie im obigen Code kennen, und Sie erhalten einen anderen Wert vonF(x)
.quelle