Esta es una función logística sigmoidea:
Yo se x. ¿Cómo puedo calcular F (x) en Python ahora?
Digamos x = 0.458.
F (x) =?
Esto debería hacerlo:
import math
def sigmoid(x):
return 1 / (1 + math.exp(-x))
Y ahora puedes probarlo llamando:
>>> sigmoid(0.458)
0.61253961344091512
Actualización : Tenga en cuenta que lo anterior fue pensado principalmente como una traducción directa uno a uno de la expresión dada al código Python. No se ha probado ni se sabe que sea una implementación numéricamente sólida. Si sabe que necesita una implementación muy sólida, estoy seguro de que hay otros en los que la gente realmente ha pensado en este problema.
sigmoid = lambda x: 1 / (1 + math.exp(-x))
math.exp
connp.exp
no obtendrá NaNs, aunque recibirá advertencias de tiempo de ejecución.math.exp
con matriz numpy puede producir algunos errores, como:TypeError: only length-1 arrays can be converted to Python scalars
. Para evitarlo debes usarlonumpy.exp
.x = max(-709,x)
antes de la expresión?También está disponible en scipy: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.logistic.html
que es solo un contenedor costoso (porque le permite escalar y traducir la función logística) de otra función scipy:
Si le preocupan las actuaciones, continúe leyendo, de lo contrario, solo use
expit
.Algunos puntos de referencia:
Como se esperaba
logistic.cdf
es (mucho) más lento queexpit
.expit
sigue siendo más lenta que lasigmoid
función python cuando se llama con un solo valor porque es una función universal escrita en C ( http://docs.scipy.org/doc/numpy/reference/ufuncs.html ) y, por lo tanto, tiene una sobrecarga de llamadas. Esta sobrecarga es mayor que la velocidad de cálculo deexpit
dada por su naturaleza compilada cuando se llama con un solo valor. Pero se vuelve insignificante cuando se trata de grandes matrices:(Notará el pequeño cambio de
math.exp
anp.exp
(el primero no admite matrices, pero es mucho más rápido si solo tiene un valor para calcular))Pero cuando realmente necesita rendimiento, una práctica común es tener una tabla precalculada de la función sigmoidea que retiene la RAM y cambiar cierta precisión y memoria por cierta velocidad (por ejemplo: http://radimrehurek.com/2013/09 / word2vec-in-python-part-two-optimizing / )
Además, tenga en cuenta que la
expit
implementación es numéricamente estable desde la versión 0.14.0: https://github.com/scipy/scipy/issues/3385fuente
Así es como implementaría el sigmoide logístico de una manera numéricamente estable (como se describe aquí ):
O tal vez esto es más preciso:
Internamente, implementa la misma condición que la anterior, pero luego usa
log1p
.En general, el sigmoide logístico multinomial es:
(Sin embargo,
logaddexp.reduce
podría ser más preciso).fuente
max_q
yrebased_q
portau
? porque lo intenté y no obtengo probabilidades que sumen 1q
) por su temperatura. rebased_q puede ser cualquier cosa: no cambia la respuesta; Mejora la estabilidad numérica.nat_to_exp
es equivalente a softmax (como mencionaste en tu otra respuesta)? Copiar y pegar devuelve probabilidades que no suman 1de otra manera
fuente
pow
a menudo se implementa en términos deexp
ylog
, por lo que usarloexp
directamente es casi seguro que sea mejor.x
es muy negativo.Otra forma al transformar la
tanh
función:fuente
Creo que muchos podrían estar interesados en parámetros libres para alterar la forma de la función sigmoidea. En segundo lugar, para muchas aplicaciones, desea utilizar una función sigmoidea reflejada. En tercer lugar, es posible que desee hacer una normalización simple, por ejemplo, los valores de salida están entre 0 y 1.
Tratar:
Y para dibujar y comparar:
Finalmente:
fuente
Use el paquete numpy para permitir que su función sigmoide analice los vectores.
De conformidad con Deeplearning, utilizo el siguiente código:
fuente
Buena respuesta de @unwind. Sin embargo, no puede manejar un número negativo extremo (arrojando OverflowError).
Mi mejora:
fuente
Tensorflow también incluye una
sigmoid
función: https://www.tensorflow.org/versions/r1.2/api_docs/python/tf/sigmoidfuente
Una versión numéricamente estable de la función sigmoidea logística.
fuente
Un trazador de líneas ...
fuente
Método vectorizado cuando se usa
pandas DataFrame/Series
onumpy array
:Las principales respuestas son métodos optimizados para el cálculo de un solo punto, pero cuando desea aplicar estos métodos a una serie de pandas o matriz numpy, requiere
apply
, que es básicamente un bucle en el fondo e iterará sobre cada fila y aplicará el método. Esto es bastante ineficiente.Para acelerar nuestro código, podemos hacer uso de la vectorización y la transmisión entumecida:
O con un
pandas Series
:fuente
puedes calcularlo como:
o conceptual, más profundo y sin ninguna importación:
o puedes usar numpy para matrices:
fuente
El código anterior es la función sigmoidea logística en python. Si sé que
x = 0.467
, la función sigmoide,F(x) = 0.385
. Puede intentar sustituir cualquier valor de x que conozca en el código anterior, y obtendrá un valor diferente deF(x)
.fuente