Esta é uma função sigmóide logística:
Eu sei x. Como posso calcular F (x) em Python agora?
Digamos que x = 0,458.
F (x) =?
Isso deve servir:
import math
def sigmoid(x):
return 1 / (1 + math.exp(-x))
E agora você pode testá-lo chamando:
>>> sigmoid(0.458)
0.61253961344091512
Atualização : observe que o acima foi destinado principalmente como uma tradução direta direta da expressão fornecida no código Python. É não testados ou conhecido por ser uma boa execução numericamente. Se você sabe que precisa de uma implementação muito robusta, tenho certeza de que há outras em que as pessoas realmente pensaram nesse problema.
sigmoid = lambda x: 1 / (1 + math.exp(-x))
math.exp
pornp.exp
, não receberá NaNs, embora receba avisos de tempo de execução.math.exp
com matriz numpy pode produzir alguns erros, como:TypeError: only length-1 arrays can be converted to Python scalars
. Para evitá-lo, você deve usarnumpy.exp
.x = max(-709,x)
antes da expressão?Também está disponível em scipy: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.logistic.html
que é apenas um invólucro caro (porque permite escalar e traduzir a função logística) de outra função ciposa:
Se você está preocupado com o desempenho, continue lendo, caso contrário, basta usar
expit
.Alguns testes comparativos:
Como esperado,
logistic.cdf
é (muito) mais lento queexpit
.expit
ainda é mais lento que asigmoid
função python quando chamada com um único valor, porque é uma função universal escrita em C ( http://docs.scipy.org/doc/numpy/reference/ufuncs.html ) e, portanto, possui uma sobrecarga de chamada. Essa sobrecarga é maior que a aceleração computacionalexpit
fornecida pela natureza compilada quando chamada com um único valor. Mas isso se torna insignificante quando se trata de grandes matrizes:(Você notará a pequena alteração de
math.exp
paranp.exp
(a primeira não suporta matrizes, mas é muito mais rápida se você tiver apenas um valor para calcular))Mas quando você realmente precisa de desempenho, uma prática comum é ter uma tabela pré-computada da função sigmoide que contém a RAM e trocar alguma precisão e memória por alguma velocidade (por exemplo: http://radimrehurek.com/2013/09 / word2vec-in-python-parte-dois-otimização / )
Além disso, observe que a
expit
implementação é numericamente estável desde a versão 0.14.0: https://github.com/scipy/scipy/issues/3385fonte
Aqui está como você implementaria o sigmóide logístico de uma maneira numericamente estável (como descrito aqui ):
Ou talvez isso seja mais preciso:
Internamente, implementa a mesma condição acima, mas depois usa
log1p
.Em geral, o sigmóide logístico multinomial é:
(No entanto,
logaddexp.reduce
pode ser mais preciso.)fonte
max_q
erebased_q
portau
? porque eu tentei isso e não tenho probabilidades que somam 1q
) pela sua temperatura. rebased_q pode ser qualquer coisa: não altera a resposta; melhora a estabilidade numérica.nat_to_exp
tem certeza que é equivalente ao softmax (como você mencionou na sua outra resposta)? Copiar e colar dele retorna probabilidades que não somam 1outra maneira
fonte
pow
é frequentemente implementado em termos deexp
elog
, portanto, usarexp
diretamente é quase certamente melhor.x
é muito negativo.Outra maneira, transformando a
tanh
função:fonte
Sinto que muitos podem estar interessados em parâmetros livres para alterar a forma da função sigmóide. Segundo, para muitos aplicativos que você deseja usar uma função sigmóide espelhada. Terceiro, você pode querer fazer uma normalização simples, por exemplo, os valores de saída estão entre 0 e 1.
Experimentar:
E para desenhar e comparar:
Finalmente:
fonte
Use o pacote numpy para permitir que sua função sigmoide analise vetores.
Em conformidade com o Deeplearning, eu uso o seguinte código:
fonte
Boa resposta de @unwind. No entanto, ele não pode lidar com números negativos extremos (lançando OverflowError).
Minha melhoria:
fonte
O Tensorflow também inclui uma
sigmoid
função: https://www.tensorflow.org/versions/r1.2/api_docs/python/tf/sigmoidfonte
Uma versão numericamente estável da função sigmóide logística.
fonte
Um forro ...
fonte
Método vetorizado ao usar
pandas DataFrame/Series
ounumpy array
:As respostas principais são métodos otimizados para o cálculo de ponto único, mas quando você deseja aplicar esses métodos a uma série de pandas ou matriz numpy, é necessário
apply
, que é basicamente o loop em segundo plano e iterará em todas as linhas e aplicará o método. Isso é bastante ineficiente.Para acelerar nosso código, podemos fazer uso de vetorização e transmissão numpy:
Ou com um
pandas Series
:fonte
você pode calculá-lo como:
ou conceitual, mais profundo e sem importações:
ou você pode usar numpy para matrizes:
fonte
O código acima é a função sigmóide logística em python. Se eu sei disso
x = 0.467
, a função sigmóideF(x) = 0.385
,. Você pode tentar substituir qualquer valor de x que você conhece no código acima e obterá um valor diferente deF(x)
.fonte