এটি একটি লজিস্টিক সিগময়েড ফাংশন:
আমি এক্স জানি। পাইথনে এখন আমি কীভাবে F (x) গণনা করতে পারি?
এক্স = 0.458 বলি।
এফ (এক্স) =?
এটি একটি লজিস্টিক সিগময়েড ফাংশন:
আমি এক্স জানি। পাইথনে এখন আমি কীভাবে F (x) গণনা করতে পারি?
এক্স = 0.458 বলি।
এফ (এক্স) =?
উত্তর:
এটি করা উচিত:
import math
def sigmoid(x):
return 1 / (1 + math.exp(-x))
এবং এখন আপনি এটি কল করে পরীক্ষা করতে পারেন:
>>> sigmoid(0.458)
0.61253961344091512
আপডেট : নোট করুন যে উপরেরটি মূলত পাইথন কোডে প্রদত্ত এক্সপ্রেশনটির সরাসরি এক থেকে এক অনুবাদ হিসাবে লক্ষ্য করা হয়েছিল। এটি পরীক্ষিত নয় বা এটি একটি সংখ্যাসূচক সাউন্ড বাস্তবায়ন হিসাবে পরিচিত। আপনি যদি জানেন যে আপনার খুব দৃ implementation় বাস্তবায়ন প্রয়োজন তবে আমি নিশ্চিত যে এমন আরও কিছু লোক রয়েছে যেখানে লোকেরা এই সমস্যাটিকে কিছুটা চিন্তাভাবনা করেছে।
math.exp
করেন np.exp
তবে আপনি NaN পাবেন না, যদিও আপনি রানটাইম সতর্কতা পাবেন।
math.exp
numpy অ্যারের সঙ্গে কিছু ত্রুটি মত, উত্পাদ করতে পারেন: TypeError: only length-1 arrays can be converted to Python scalars
। এটি এড়াতে আপনার ব্যবহার করা উচিত numpy.exp
।
x = max(-709,x)
প্রকাশের আগে যোগ করে প্রশমিত করা যায় ?
এটি স্কিপিতেও পাওয়া যায়: 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
যা অন্য একটি স্কিপি ফাংশনের কেবল ব্যয়বহুল মোড়কের (কারণ এটি আপনাকে লজিস্টিক ফাংশনটি স্কেল এবং অনুবাদ করতে দেয়):
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
। সিঙ্গেল মানের সাথে ডাকা হলে expit
পাইথন sigmoid
ফাংশনের চেয়ে ধীর হয় কারণ এটি সি ( http://docs.scipy.org/doc/numpy/references/ufuncs.html ) এ লিখিত একটি সার্বজনীন ফাংশন এবং এর ফলে একটি কল ওভারহেড থাকে। এই ওভারহেডটি 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
তবে যখন আপনার সত্যিকারের পারফরম্যান্স দরকার তখন একটি সাধারণ অনুশীলন হ'ল সিগময়েড ফাংশনটির একটি পূর্বনির্ধারিত টেবিল থাকে যা র্যামে থাকে এবং কিছু গতির জন্য কিছু যথার্থতা এবং মেমরি বাণিজ্য করে (উদাহরণস্বরূপ: http://radimrehurek.com/2013/09 / ওয়ার্ড টু-ইন-পাইথন-পার্ট টু টু-অপটিমাইজিং / )
এছাড়াও, নোট করুন যে expit
প্রয়োগটি 0.14.0 সংস্করণ থেকে সংখ্যাগতভাবে স্থিতিশীল: https://github.com/scipy/scipy/issues/3385
আপনি এখানে সংখ্যার স্থিতিশীল উপায়ে লজিস্টিক সিগময়েড কীভাবে কার্যকর করবেন তা এখানে ( এখানে বর্ণিত হিসাবে ):
def sigmoid(x):
"Numerically-stable sigmoid function."
if x >= 0:
z = exp(-x)
return 1 / (1 + z)
else:
z = exp(x)
return z / (1 + z)
অথবা সম্ভবত এটি আরও সঠিক:
import numpy as np
def sigmoid(x):
return math.exp(-np.logaddexp(0, -x))
অভ্যন্তরীণভাবে, এটি উপরের মতো একই শর্তটি প্রয়োগ করে, তবে তারপরে ব্যবহার করে log1p
।
সাধারণভাবে, বহুজাতিক লজিস্টিক সিগময়েড হ'ল:
def nat_to_exp(q):
max_q = max(0.0, np.max(q))
rebased_q = q - max_q
return np.exp(rebased_q - np.logaddexp(-max_q, np.logaddexp.reduce(rebased_q)))
max_q
এবং rebased_q
দ্বারা tau
? কারণ আমি চেষ্টা করেছি এবং আমি সম্ভাব্যতাগুলি পাই না 1
q
) আপনার তাপমাত্রা দিয়ে ভাগ করুন । rebased_q যে কোনও হতে পারে: এটি উত্তর পরিবর্তন করে না; এটি সংখ্যার স্থায়িত্ব উন্নত করে।
nat_to_exp
সফটম্যাক্সের সমতুল্য (আপনি নিজের অন্যান্য উত্তরে যেমন উল্লেখ করেছেন)? এর অনুলিপি-পেস্ট সম্ভাব্যতাগুলি দেয় যা 1 এর সমান হয় না
অন্য উপায়
>>> def sigmoid(x):
... return 1 /(1+(math.e**-x))
...
>>> sigmoid(0.458)
pow
প্রায়শই শর্তাবলী কার্যকর করা হয় exp
এবং log
তাই exp
সরাসরি ব্যবহার প্রায় অবশ্যই ভাল better
x
খুব নেতিবাচক হলে এটি ওভারফ্লোতে ভোগে ।
tanh
ফাংশনটি রূপান্তরিত করে আরেকটি উপায় :
sigmoid = lambda x: .5 * (math.tanh(.5 * x) + 1)
আমি মনে করি সিগময়েড ফাংশনের আকার পরিবর্তন করতে অনেকে বিনামূল্যে প্যারামিটারে আগ্রহী হতে পারে। অনেকগুলি অ্যাপ্লিকেশনগুলির জন্য দ্বিতীয় যা আপনি মিরর করা সিগময়েড ফাংশনটি ব্যবহার করতে চান। তৃতীয় আপনি একটি সাধারণ স্বাভাবিককরণ করতে চাইতে পারেন উদাহরণস্বরূপ আউটপুট মানগুলি 0 এবং 1 এর মধ্যে থাকে।
চেষ্টা করুন:
def normalized_sigmoid_fkt(a, b, x):
'''
Returns array of a horizontal mirrored normalized sigmoid function
output between 0 and 1
Function parameters a = center; b = width
'''
s= 1/(1+np.exp(b*(x-a)))
return 1*(s-min(s))/(max(s)-min(s)) # normalize function to 0-1
এবং আঁকতে এবং তুলনা করতে:
def draw_function_on_2x2_grid(x):
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
plt.subplots_adjust(wspace=.5)
plt.subplots_adjust(hspace=.5)
ax1.plot(x, normalized_sigmoid_fkt( .5, 18, x))
ax1.set_title('1')
ax2.plot(x, normalized_sigmoid_fkt(0.518, 10.549, x))
ax2.set_title('2')
ax3.plot(x, normalized_sigmoid_fkt( .7, 11, x))
ax3.set_title('3')
ax4.plot(x, normalized_sigmoid_fkt( .2, 14, x))
ax4.set_title('4')
plt.suptitle('Different normalized (sigmoid) function',size=10 )
return fig
অবশেষে:
x = np.linspace(0,1,100)
Travel_function = draw_function_on_2x2_grid(x)
@ ইউনুইন্ডের কাছ থেকে ভাল উত্তর। তবে এটি চরম নেতিবাচক সংখ্যা (ওভারফ্রোয়েরর ফেলে দেওয়া) পরিচালনা করতে পারে না।
আমার উন্নতি:
def sigmoid(x):
try:
res = 1 / (1 + math.exp(-x))
except OverflowError:
res = 0.0
return res
টেনসরফ্লোতে একটি ফাংশনও অন্তর্ভুক্ত রয়েছে 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
লজিস্টিক সিগময়েড ফাংশনের একটি সংখ্যাগত স্থিতিশীল সংস্করণ।
def sigmoid(x):
pos_mask = (x >= 0)
neg_mask = (x < 0)
z = np.zeros_like(x,dtype=float)
z[pos_mask] = np.exp(-x[pos_mask])
z[neg_mask] = np.exp(x[neg_mask])
top = np.ones_like(x,dtype=float)
top[neg_mask] = z[neg_mask]
return top / (1 + z)
একটি ওয়ান লাইনার ...
In[1]: import numpy as np
In[2]: sigmoid=lambda x: 1 / (1 + np.exp(-x))
In[3]: sigmoid(3)
Out[3]: 0.9525741268224334
pandas DataFrame/Series
বা numpy array
:শীর্ষের উত্তরগুলি একক পয়েন্ট গণনার জন্য অনুকূলিতকরণ পদ্ধতি, তবে আপনি যখন এই পদ্ধতিগুলি পান্ডাস সিরিজ বা নম্পি অ্যারে প্রয়োগ করতে চান, তখন এটি প্রয়োজন apply
যা মূলত পটভূমির লুপের জন্য এবং প্রতিটি সারিতে পুনরাবৃত্তি করে এবং পদ্ধতিটি প্রয়োগ করে। এটি বেশ অদক্ষ।
আমাদের কোডটির গতি বাড়ানোর জন্য, আমরা ভেক্টরাইজেশন এবং নম্পটি সম্প্রচারের ব্যবহার করতে পারি:
x = np.arange(-5,5)
np.divide(1, 1+np.exp(-x))
0 0.006693
1 0.017986
2 0.047426
3 0.119203
4 0.268941
5 0.500000
6 0.731059
7 0.880797
8 0.952574
9 0.982014
dtype: float64
বা একটি সহ pandas Series
:
x = pd.Series(np.arange(-5,5))
np.divide(1, 1+np.exp(-x))
আপনি এটি হিসাবে গণনা করতে পারেন:
import math
def sigmoid(x):
return 1 / (1 + math.exp(-x))
বা ধারণাগত, গভীর এবং কোনও আমদানি ছাড়াই:
def sigmoid(x):
return 1 / (1 + 2.718281828 ** -x)
অথবা আপনি ম্যাট্রিকের জন্য নম্পতি ব্যবহার করতে পারেন:
import numpy as np #make sure numpy is already installed
def sigmoid(x):
return 1 / (1 + np.exp(-x))
import numpy as np
def sigmoid(x):
s = 1 / (1 + np.exp(-x))
return s
result = sigmoid(0.467)
print(result)
উপরের কোডটি পাইথনে লজিস্টিক সিগময়েড ফাংশন। যদি আমি তা জানি x = 0.467
, সিগময়েড ফাংশন F(x) = 0.385
,। উপরের কোডে আপনার জানা x এর যে কোনও মানকে প্রতিস্থাপনের চেষ্টা করতে পারেন এবং এর আলাদা মান পাবেন F(x)
।
sigmoid = lambda x: 1 / (1 + math.exp(-x))