Ini adalah fungsi sigmoid logistik:
Saya tahu x. Bagaimana saya bisa menghitung F (x) dengan Python sekarang?
Katakanlah x = 0,458.
F (x) =?
Ini harus dilakukan:
import math
def sigmoid(x):
return 1 / (1 + math.exp(-x))
Dan sekarang Anda dapat mengujinya dengan menelepon:
>>> sigmoid(0.458)
0.61253961344091512
Pembaruan : Perhatikan bahwa di atas terutama dimaksudkan sebagai terjemahan langsung satu-ke-satu dari ekspresi yang diberikan ke dalam kode Python. Ini tidak diuji atau dikenal sebagai implementasi yang baik secara numerik. Jika Anda tahu Anda membutuhkan implementasi yang sangat kuat, saya yakin ada orang lain di mana orang benar-benar memikirkan masalah ini.
sigmoid = lambda x: 1 / (1 + math.exp(-x))
math.exp
dengannp.exp
Anda tidak akan mendapatkan NaN, meskipun Anda akan mendapatkan peringatan runtime.math.exp
dengan berbagai numpy dapat menghasilkan beberapa kesalahan, seperti:TypeError: only length-1 arrays can be converted to Python scalars
. Untuk menghindarinya sebaiknya Anda gunakannumpy.exp
.x = max(-709,x)
sebelum ekspresi?Ini juga tersedia di scipy: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.logistic.html
yang hanya merupakan pembungkus yang mahal (karena ini memungkinkan Anda untuk mengukur dan menerjemahkan fungsi logistik) dari fungsi scipy lainnya:
Jika Anda khawatir tentang pertunjukan, teruskan membaca, jika tidak gunakan saja
expit
.Beberapa pembandingan:
Seperti yang diharapkan
logistic.cdf
(lebih) lebih lambat dariexpit
.expit
masih lebih lambat daripadasigmoid
fungsi python ketika dipanggil dengan nilai tunggal karena itu adalah fungsi universal yang ditulis dalam C ( http://docs.scipy.org/doc/numpy/reference/ufuncs.html ) dan dengan demikian memiliki panggilan overhead. Overhead ini lebih besar dari percepatan perhitungan yangexpit
diberikan oleh sifat kompilasi ketika dipanggil dengan nilai tunggal. Tetapi menjadi diabaikan ketika datang ke array besar:(Anda akan melihat perubahan kecil dari
math.exp
menjadinp.exp
(yang pertama tidak mendukung array, tetapi jauh lebih cepat jika Anda hanya memiliki satu nilai untuk dihitung))Tetapi ketika Anda benar-benar membutuhkan kinerja, praktik umum adalah memiliki tabel yang sudah dikomputasi dari fungsi sigmoid yang menampung RAM, dan menukar beberapa presisi dan memori untuk beberapa kecepatan (misalnya: http://radimrehurek.com/2013/09 / word2vec-in-python-bagian-dua-mengoptimalkan / )
Juga, perhatikan bahwa
expit
implementasinya stabil secara numerik sejak versi 0.14.0: https://github.com/scipy/scipy/issues/3385sumber
Inilah cara Anda menerapkan sigmoid logistik dengan cara yang stabil secara numerik (seperti dijelaskan di sini ):
Atau mungkin ini lebih akurat:
Secara internal, ini mengimplementasikan kondisi yang sama seperti di atas, tetapi kemudian menggunakan
log1p
.Secara umum, sigmoid logistik multinomial adalah:
(Namun,
logaddexp.reduce
bisa lebih akurat.)sumber
max_q
danrebased_q
olehtau
? karena saya mencobanya dan saya tidak mendapatkan probabilitas yang berjumlah 1q
) dengan suhu Anda. rebased_q bisa berupa apa saja: tidak mengubah jawaban; itu meningkatkan stabilitas numerik.nat_to_exp
setara dengan softmax (seperti yang Anda sebutkan dalam jawaban Anda yang lain)? Salin-tempel dari itu mengembalikan probabilitas yang tidak berjumlah 1cara lain
sumber
pow
sering diimplementasikan dalam halexp
danlog
, jadi menggunakanexp
secara langsung hampir pasti lebih baik.x
sangat negatif.Cara lain dengan mengubah
tanh
fungsi:sumber
Saya merasa banyak yang mungkin tertarik pada parameter gratis untuk mengubah bentuk fungsi sigmoid. Kedua untuk banyak aplikasi Anda ingin menggunakan fungsi sigmoid cermin. Ketiga, Anda mungkin ingin melakukan normalisasi sederhana misalnya nilai output antara 0 dan 1.
Mencoba:
Dan untuk menggambar dan membandingkan:
Akhirnya:
sumber
Gunakan paket numpy untuk memungkinkan fungsi sigmoid Anda mengurai vektor.
Sesuai dengan Deeplearning, saya menggunakan kode berikut:
sumber
Jawaban bagus dari @unwind. Namun itu tidak dapat menangani angka negatif ekstrim (melempar OverflowError).
Peningkatan saya:
sumber
Tensorflow juga mencakup
sigmoid
fungsi: https://www.tensorflow.org/versions/r1.2/api_docs/python/tf/sigmoidsumber
Versi stabil fungsi logistic sigmoid.
sumber
Satu liner ...
sumber
Metode vektor saat menggunakan
pandas DataFrame/Series
ataunumpy array
:Jawaban teratas adalah metode yang dioptimalkan untuk perhitungan titik tunggal, tetapi ketika Anda ingin menerapkan metode ini ke seri panda atau array numpy, itu membutuhkan
apply
, yang pada dasarnya adalah untuk loop di latar belakang dan akan beralih ke setiap baris dan menerapkan metode. Ini cukup tidak efisien.Untuk mempercepat kode kita, kita dapat menggunakan vektorisasi dan siaran numpy:
Atau dengan
pandas Series
:sumber
Anda dapat menghitungnya sebagai:
atau konseptual, lebih dalam dan tanpa impor:
atau Anda dapat menggunakan numpy untuk matriks:
sumber
Kode di atas adalah fungsi sigmoid logistik di python. Jika saya tahu itu
x = 0.467
, Fungsi sigmoidF(x) = 0.385
,. Anda dapat mencoba mengganti nilai x yang Anda tahu dalam kode di atas, dan Anda akan mendapatkan nilai yang berbedaF(x)
.sumber