To jest logistyczna funkcja sigmoidalna:
Wiem x. Jak mogę teraz obliczyć F (x) w Pythonie?
Powiedzmy, że x = 0,458.
F (x) =?
To powinno wystarczyć:
import math
def sigmoid(x):
return 1 / (1 + math.exp(-x))
A teraz możesz to przetestować dzwoniąc pod numer:
>>> sigmoid(0.458)
0.61253961344091512
Aktualizacja : Zwróć uwagę, że powyższe było głównie przeznaczone jako bezpośrednie tłumaczenie danego wyrażenia na kod Pythona. Nie została przetestowana ani nie jest znana jako poprawna numerycznie implementacja. Jeśli wiesz, że potrzebujesz bardzo solidnej implementacji, jestem pewien, że są inne osoby, w których ludzie zastanawiali się nad tym problemem.
sigmoid = lambda x: 1 / (1 + math.exp(-x))
math.exp
znp.exp
was nie dostanie Nans, chociaż dostaniesz ostrzeżenia uruchomieniowe.math.exp
z numpy tablicy mogą dawać błędy, takie jak:TypeError: only length-1 arrays can be converted to Python scalars
. Aby tego uniknąć, powinieneś użyćnumpy.exp
.x = max(-709,x)
przed wyrażeniem?Jest również dostępny w scipy: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.logistic.html
który jest tylko kosztownym opakowaniem (ponieważ pozwala skalować i tłumaczyć funkcję logistyczną) innej funkcji scipy:
Jeśli obawiasz się występów, kontynuuj czytanie, w przeciwnym razie po prostu użyj
expit
.Niektóre testy porównawcze:
Zgodnie z oczekiwaniami
logistic.cdf
jest (znacznie) wolniejszy niżexpit
.expit
jest nadal wolniejszy niżsigmoid
funkcja Pythona, gdy jest wywoływana z pojedynczą wartością, ponieważ jest to uniwersalna funkcja napisana w języku C ( http://docs.scipy.org/doc/numpy/reference/ufuncs.html ) i dlatego ma narzut wywołania. Ten narzut jest większy niż przyspieszenie obliczeńexpit
z jego skompilowanej natury, gdy jest wywoływane z jedną wartością. Ale staje się pomijalny, jeśli chodzi o duże tablice:(Zauważysz niewielką zmianę od
math.exp
donp.exp
(pierwsza nie obsługuje tablic, ale jest znacznie szybsza, jeśli masz tylko jedną wartość do obliczenia))Ale kiedy naprawdę potrzebujesz wydajności, powszechną praktyką jest posiadanie wstępnie obliczonej tabeli funkcji sigmoidalnej, która jest przechowywana w pamięci RAM i zamiana precyzji i pamięci na pewną prędkość (na przykład: http://radimrehurek.com/2013/09 / word2vec-in-python-part-two-optimizing / )
Zwróć również uwagę, że
expit
implementacja jest stabilna numerycznie od wersji 0.14.0: https://github.com/scipy/scipy/issues/3385źródło
Oto jak zaimplementowałbyś logistyczną sigmoidę w stabilny numerycznie sposób (jak opisano tutaj ):
A może jest to dokładniejsze:
Wewnętrznie implementuje ten sam warunek co powyżej, ale potem używa
log1p
.Ogólnie rzecz biorąc, wielomianowa sigmoida logistyczna to:
(Jednak
logaddexp.reduce
mogłoby być dokładniejsze).źródło
max_q
irebased_q
przeztau
? ponieważ próbowałem tego i nie dostaję prawdopodobieństwa, że sumaq
) przez swoją temperaturę. rebased_q może być wszystkim: nie zmienia odpowiedzi; poprawia stabilność numeryczną.nat_to_exp
jest odpowiednikiem softmax (jak wspomniałeś w swojej drugiej odpowiedzi)? Kopiuj-wklej zwraca prawdopodobieństwa, które nie sumują się do 1Inny sposób
źródło
pow
jest często implementowany w kategoriachexp
ilog
, więc używanieexp
bezpośrednio jest prawie na pewno lepsze.x
jest bardzo ujemne.Inny sposób poprzez przekształcenie
tanh
funkcji:źródło
Wydaje mi się, że wielu mogłoby być zainteresowanych swobodnymi parametrami zmieniającymi kształt funkcji sigmoidalnej. Po drugie dla wielu aplikacji, w których chcesz użyć funkcji lustrzanej sigmoidy. Po trzecie, możesz chcieć wykonać prostą normalizację, na przykład wartości wyjściowe mieszczą się w zakresie od 0 do 1.
Próbować:
I narysować i porównać:
Wreszcie:
źródło
Użyj pakietu numpy, aby pozwolić funkcji sigmoid na parsowanie wektorów.
Zgodnie z Deeplearningiem używam następującego kodu:
źródło
Dobra odpowiedź od @unwind. Nie radzi sobie jednak z ekstremalną liczbą ujemną (rzucając OverflowError).
Moja poprawa:
źródło
Tensorflow zawiera również
sigmoid
funkcję: https://www.tensorflow.org/versions/r1.2/api_docs/python/tf/sigmoidźródło
Numerycznie stabilna wersja logistycznej funkcji sigmoidalnej.
źródło
Jedna wkładka ...
źródło
Metoda wektoryzacji przy użyciu
pandas DataFrame/Series
lubnumpy array
:Najlepsze odpowiedzi to zoptymalizowane metody obliczania pojedynczego punktu, ale jeśli chcesz zastosować te metody do serii pand lub tablicy numpy, wymaga to
apply
, co w zasadzie dotyczy pętli w tle i będzie iterować po każdym wierszu i zastosować metodę. Jest to dość nieefektywne.Aby przyspieszyć nasz kod, możemy wykorzystać wektoryzację i emisję numpy:
Lub z
pandas Series
:źródło
możesz to obliczyć jako:
lub koncepcyjne, głębsze i bez importu:
lub możesz użyć numpy dla macierzy:
źródło
Powyższy kod jest logistyczną funkcją sigmoidalną w Pythonie. Jeśli wiem, że
x = 0.467
funkcja esicy,F(x) = 0.385
. Możesz spróbować podstawić dowolną wartość x, którą znasz w powyższym kodzie, a otrzymasz inną wartośćF(x)
.źródło