python كيف تحسب وظيفة sigmoid اللوجستية في بيثون؟
يتوفر أيضًا في scipy: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.logistic.html
In [1]: from scipy.stats import logistic
In [2]: logistic.cdf(0.458)
Out[2]: 0.61253961344091512
وهو عبارة عن غلاف مكلف فقط (لأنه يسمح لك بقياس وترجمة الوظيفة اللوجيستية) لدالة scipy أخرى:
In [3]: from scipy.special import expit
In [4]: expit(0.458)
Out[4]: 0.61253961344091512
إذا كنت تشعر بالقلق إزاء مواصلة قراءة الأداء ، وإلا استخدام مجرد expit
.
بعض القياس:
In [5]: def sigmoid(x):
....: return 1 / (1 + math.exp(-x))
....:
In [6]: %timeit -r 1 sigmoid(0.458)
1000000 loops, best of 1: 371 ns per loop
In [7]: %timeit -r 1 logistic.cdf(0.458)
10000 loops, best of 1: 72.2 µs per loop
In [8]: %timeit -r 1 expit(0.458)
100000 loops, best of 1: 2.98 µs per loop
كما هو متوقع logistic.cdf
(أبطأ) من أبطأ من. لا يزال expit
أبطأ من وظيفة sigmoid
python sigmoid
عندما يتم استدعاؤه بقيمة واحدة لأنه وظيفة عالمية مكتوبة في C ( http://docs.scipy.org/doc/numpy/reference/ufuncs.html ) ، وبالتالي يكون هناك اتصال تكاليف غير مباشرة. تعتبر هذه expit
أكبر من سرعة عملية حساب expit
عن طبيعتها المجمعة عند استدعائها بقيمة واحدة. ولكن يصبح لا يكاد يذكر عندما يتعلق الأمر المصفوفات الكبيرة:
In [9]: import numpy as np
In [10]: x = np.random.random(1000000)
In [11]: def sigmoid_array(x):
....: return 1 / (1 + np.exp(-x))
....:
(ستلاحظ التغيير الضئيل من math.exp
إلى np.exp
(لا يدعم أول واحد المصفوفات ، ولكن أسرع بكثير إذا كان لديك قيمة واحدة للحساب))
In [12]: %timeit -r 1 -n 100 sigmoid_array(x)
100 loops, best of 1: 34.3 ms per loop
In [13]: %timeit -r 1 -n 100 expit(x)
100 loops, best of 1: 31 ms per loop
ولكن عندما تحتاج حقًا إلى الأداء ، فإن الممارسة الشائعة هي أن يكون لديك جدول مُسبَق مسبقًا لوظيفة sigmoid التي تعمل في ذاكرة الوصول العشوائي ، وتتاجر ببعض الدقة والذاكرة لبعض السرعة (على سبيل المثال: http://radimrehurek.com/2013/09/word2vec-in-python-part-two-optimizing/ )
لاحظ أيضًا أن تنفيذ expit
ثابت عدديًا منذ الإصدار 0.14.0: https://github.com/scipy/scipy/issues/3385
هذه هي وظيفة السيجمائية اللوجستية:
وأنا أعلم العاشر. كيف يمكنني حساب F (x) في Python الآن؟
لنفترض أن x = 0.458.
F (س) =؟
طريق اخر
>>> def sigmoid(x):
... return 1 /(1+(math.e**-x))
...
>>> sigmoid(0.458)
طريقة أخرى عن طريق تحويل وظيفة tanh
:
sigmoid = lambda x: .5 * (math.tanh(.5 * x) + 1)
يشمل Tensorflow أيضا وظيفة sigmoid
: https://www.tensorflow.org/versions/r1.2/api_docs/python/tf/sigmoid
import tensorflow as tf
sess = tf.InteractiveSession()
x = 0.458
y = tf.sigmoid(x)
u = y.eval()
print(u)
# 0.6125396