Il s'agit d'une fonction sigmoïde logistique:
Je sais x. Comment puis-je calculer F (x) en Python maintenant?
Disons x = 0,458.
F (x) =?
Cela devrait le faire:
import math
def sigmoid(x):
return 1 / (1 + math.exp(-x))
Et maintenant, vous pouvez le tester en appelant:
>>> sigmoid(0.458)
0.61253961344091512
Mise à jour : Notez que ce qui précède était principalement conçu comme une traduction directe un à un de l'expression donnée en code Python. Il n'est pas testé ou connu pour être une mise en œuvre numériquement solide. Si vous savez que vous avez besoin d'une implémentation très robuste, je suis sûr qu'il y en a d'autres où les gens ont réfléchi à ce problème.
sigmoid = lambda x: 1 / (1 + math.exp(-x))
math.exp
par,np.exp
vous n'obtiendrez pas de NaN, bien que vous obteniez des avertissements d'exécution.math.exp
avec tableau numpy peut donner des erreurs, comme:TypeError: only length-1 arrays can be converted to Python scalars
. Pour éviter cela, vous devez utilisernumpy.exp
.x = max(-709,x)
avant l'expression?Il est également disponible dans scipy: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.logistic.html
qui n'est qu'un wrapper coûteux (car il vous permet de mettre à l'échelle et de traduire la fonction logistique) d'une autre fonction scipy:
Si vous êtes préoccupé par les performances, continuez à lire, sinon utilisez simplement
expit
.Quelques benchmarking:
Comme prévu,
logistic.cdf
c'est (beaucoup) plus lent queexpit
.expit
est toujours plus lente que lasigmoid
fonction python lorsqu'elle est appelée avec une seule valeur car il s'agit d'une fonction universelle écrite en C ( http://docs.scipy.org/doc/numpy/reference/ufuncs.html ) et a donc une surcharge d'appel. Cette surcharge est plus grande que la vitesse de calculexpit
donnée par sa nature compilée lorsqu'elle est appelée avec une seule valeur. Mais cela devient négligeable lorsqu'il s'agit de grands tableaux:(Vous remarquerez le petit changement de
math.exp
ànp.exp
(le premier ne prend pas en charge les tableaux, mais est beaucoup plus rapide si vous n'avez qu'une seule valeur à calculer))Mais lorsque vous avez vraiment besoin de performances, une pratique courante consiste à avoir un tableau précalculé de la fonction sigmoïde qui contient de la RAM, et à échanger une certaine précision et mémoire contre une certaine vitesse (par exemple: http://radimrehurek.com/2013/09 / word2vec-in-python-part-two-optimizing / )
Notez également que l'
expit
implémentation est numériquement stable depuis la version 0.14.0: https://github.com/scipy/scipy/issues/3385la source
Voici comment implémenter le sigmoïde logistique de manière numériquement stable (comme décrit ici ):
Ou peut-être est-ce plus précis:
En interne, il implémente la même condition que ci-dessus, mais utilise ensuite
log1p
.En général, le sigmoïde logistique multinomial est:
(Cependant, cela
logaddexp.reduce
pourrait être plus précis.)la source
max_q
etrebased_q
partau
? parce que j'ai essayé cela et je n'obtiens pas de probabilités quiq
) par votre température. rebased_q peut être n'importe quoi: cela ne change pas la réponse; il améliore la stabilité numérique.nat_to_exp
est équivalent à softmax (comme vous l'avez mentionné dans votre autre réponse)? Copier-coller de celui-ci renvoie des probabilités qui neautrement
la source
pow
est souvent implémenté en termes deexp
etlog
, donc l'utilisationexp
directe est presque certainement meilleure.x
est très négatif.Une autre façon en transformant la
tanh
fonction:la source
Je pense que beaucoup pourraient être intéressés par des paramètres libres pour modifier la forme de la fonction sigmoïde. Deuxièmement, pour de nombreuses applications, vous souhaitez utiliser une fonction sigmoïde en miroir. Troisièmement, vous voudrez peut-être faire une normalisation simple, par exemple, les valeurs de sortie sont comprises entre 0 et 1.
Essayer:
Et pour dessiner et comparer:
Finalement:
la source
Utilisez le package numpy pour permettre à votre fonction sigmoïde d'analyser les vecteurs.
Conformément à Deeplearning, j'utilise le code suivant:
la source
Bonne réponse de @unwind. Il ne peut cependant pas gérer un nombre négatif extrême (lançant OverflowError).
Mon amélioration:
la source
Tensorflow comprend également une
sigmoid
fonction: https://www.tensorflow.org/versions/r1.2/api_docs/python/tf/sigmoidla source
Une version numériquement stable de la fonction sigmoïde logistique.
la source
Une seule doublure ...
la source
Méthode vectorisée lors de l'utilisation de
pandas DataFrame/Series
ounumpy array
:Les principales réponses sont des méthodes optimisées pour le calcul d'un point unique, mais lorsque vous souhaitez appliquer ces méthodes à une série pandas ou à un tableau numpy, cela nécessite
apply
, ce qui est essentiellement une boucle pour en arrière-plan et itérera sur chaque ligne et appliquera la méthode. C'est assez inefficace.Pour accélérer notre code, nous pouvons utiliser la vectorisation et la diffusion numpy:
Ou avec un
pandas Series
:la source
vous pouvez le calculer comme:
ou conceptuel, plus profond et sans aucune importation:
ou vous pouvez utiliser numpy pour les matrices:
la source
Le code ci-dessus est la fonction sigmoïde logistique en python. Si je sais que
x = 0.467
, la fonction sigmoïde,F(x) = 0.385
. Vous pouvez essayer de remplacer n'importe quelle valeur de x que vous connaissez dans le code ci-dessus, et vous obtiendrez une valeur différente deF(x)
.la source