[python] كيف تحسب وظيفة sigmoid اللوجستية في بيثون؟



3 Answers

يتوفر أيضًا في 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

Question

هذه هي وظيفة السيجمائية اللوجستية:

وأنا أعلم العاشر. كيف يمكنني حساب F (x) في Python الآن؟

لنفترض أن x = 0.458.

F (س) =؟




طريقة أخرى عن طريق تحويل وظيفة tanh :

sigmoid = lambda x: .5 * (math.tanh(.5 * x) + 1)



طريق اخر

>>> def sigmoid(x):
...     return 1 /(1+(math.e**-x))
...
>>> sigmoid(0.458)






Related



Tags

python python