পাইথনে লজিস্টিক সিগময়েড ফাংশন কীভাবে গণনা করব?


145

এটি একটি লজিস্টিক সিগময়েড ফাংশন:

এখানে চিত্র বর্ণনা লিখুন

আমি এক্স জানি। পাইথনে এখন আমি কীভাবে F (x) গণনা করতে পারি?

এক্স = 0.458 বলি।

এফ (এক্স) =?

উত্তর:


218

এটি করা উচিত:

import math

def sigmoid(x):
  return 1 / (1 + math.exp(-x))

এবং এখন আপনি এটি কল করে পরীক্ষা করতে পারেন:

>>> sigmoid(0.458)
0.61253961344091512

আপডেট : নোট করুন যে উপরেরটি মূলত পাইথন কোডে প্রদত্ত এক্সপ্রেশনটির সরাসরি এক থেকে এক অনুবাদ হিসাবে লক্ষ্য করা হয়েছিল। এটি পরীক্ষিত নয় বা এটি একটি সংখ্যাসূচক সাউন্ড বাস্তবায়ন হিসাবে পরিচিত। আপনি যদি জানেন যে আপনার খুব দৃ implementation় বাস্তবায়ন প্রয়োজন তবে আমি নিশ্চিত যে এমন আরও কিছু লোক রয়েছে যেখানে লোকেরা এই সমস্যাটিকে কিছুটা চিন্তাভাবনা করেছে।


7
কেবলমাত্র ছোট জিনিসগুলি চেষ্টা করার জন্য আমার এটির প্রায়শ প্রয়োজন:sigmoid = lambda x: 1 / (1 + math.exp(-x))
মার্টিন থোমা

2
এটি এক্স এর চরম নেতিবাচক মানগুলির জন্য কাজ করে না। আমি এই দুর্ভাগ্যজনক প্রয়োগটি ব্যবহার করছিলাম যতক্ষণ না আমি লক্ষ্য করলাম এটি এনএএন তৈরি করছে।
নিল জি

3
আপনি যদি এটি প্রতিস্থাপন math.expকরেন np.expতবে আপনি NaN পাবেন না, যদিও আপনি রানটাইম সতর্কতা পাবেন।
রিচার্ড রাস্ট

2
ব্যবহার math.expnumpy অ্যারের সঙ্গে কিছু ত্রুটি মত, উত্পাদ করতে পারেন: TypeError: only length-1 arrays can be converted to Python scalars। এটি এড়াতে আপনার ব্যবহার করা উচিত numpy.exp
ভিনিসিয়াস

সংখ্যার অস্থিরতা কি কেবল x = max(-709,x)প্রকাশের আগে যোগ করে প্রশমিত করা যায় ?
ইলিয়াস হাসেল

201

এটি স্কিপিতেও পাওয়া যায়: 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


4
আপনার সিগময়েড ফাংশনে
ইনট

আমি নিশ্চিত না যে আপনি কী বোঝাতে চেয়েছিলেন তা আমি বুঝতে পেরেছি (উদাহরণগুলিতে ভাসমানগুলি ব্যবহৃত হয়) তবে কোনও ক্ষেত্রেই খুব কমই একটি আন্তঃসংখ্যক সিগময়েড গণনা করে।
থিও

2
কেডি 88 বলতে যা বোঝাতে চেয়েছিল তা হল যে আপনি আপনার ফাংশন (1) এ যে সংখ্যক লিটারেল ব্যবহার করেছেন তা পূর্ণসংখ্যা হিসাবে পার্স করা হয়েছে, এবং রানটাইম এ ফ্লোটে যেতে হবে। আপনি ভাসমান পয়েন্ট আক্ষরিক (1.0) ব্যবহার করে আরও ভাল পারফরম্যান্স পাবেন।
krs013

আপনি সর্বদা ফাংশনটিকে ভেক্টরাইজ করতে পারেন যাতে এটি অ্যারে সমর্থন করে।
আগকাল

আপনি একটি ব্যয়বহুল মোড়ক সম্পর্কে কথা বলতে চান? % টাইমিট -আর 1 এক্সপাইট (0.458)% টাইমিট -r 1 1 / (1 + এনপি.এক্সপি (0.458))
অ্যান্ড্রু লউ

42

আপনি এখানে সংখ্যার স্থিতিশীল উপায়ে লজিস্টিক সিগময়েড কীভাবে কার্যকর করবেন তা এখানে ( এখানে বর্ণিত হিসাবে ):

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)))

(তবে, logaddexp.reduceআরও সঠিক হতে পারে।)


মাল্টিনোমিয়াল লজিস্টিক সিগময়েড (সফটম্যাক্স) উল্লেখ করে যদি আমিও একটি চাইতাম শক্তিবৃদ্ধি শেখার জন্য তাপমাত্রা পরামিতি , এটা ডিভাইড যথেষ্ট নেই max_qএবং rebased_qদ্বারা tau? কারণ আমি চেষ্টা করেছি এবং আমি সম্ভাব্যতাগুলি পাই না 1
সিপ্রিয়ান টোমাইগা

@ সিপ্রিয়ানটোমিয়াগা আপনি যদি কোনও তাপমাত্রা রাখতে চান তবে আপনার প্রমাণ দিয়ে ( q) আপনার তাপমাত্রা দিয়ে ভাগ করুন । rebased_q যে কোনও হতে পারে: এটি উত্তর পরিবর্তন করে না; এটি সংখ্যার স্থায়িত্ব উন্নত করে।
নিল জি

আপনি কি nat_to_expসফটম্যাক্সের সমতুল্য (আপনি নিজের অন্যান্য উত্তরে যেমন উল্লেখ করেছেন)? এর অনুলিপি-পেস্ট সম্ভাব্যতাগুলি দেয় যা 1 এর সমান হয় না
সিপ্রিয়ান টোমাইগা

@ সিপ্রিয়ানটোমিয়াগা সংক্ষিপ্ত উত্তরটি হ'ল আমি ইনপুট এবং আউটপুটটির চূড়ান্ত উপাদানটি বাদ দিচ্ছি, সুতরাং যদি আপনি এটির বাকি অংশের যোগফলকে এক বিয়োগ হিসাবে চান তবে আপনাকে এটি গণনা করতে হবে। আরও পরিসংখ্যানগত ব্যাখ্যা হ'ল শ্রেণিবদ্ধ বিতরণে এন -1 প্রাকৃতিক প্যারামিটার বা এন -1 প্রত্যাশা প্যারামিটার রয়েছে।
নিল জি

বোধ করে, ধরনের। এ সম্পর্কে বিশদ বিবরণ যত্নআমার প্রশ্নটি বিস্তারিতভাবে ?
সিপরিয়ান টোমাইয়াজি

7

অন্য উপায়

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

1
এটি এবং আনওয়াইন্ডের কার্যকারিতার মধ্যে পার্থক্য কী? ম্যাথ.ই ** - x ম্যাথ.এক্সপি (-x) এর চেয়ে ভাল?
রিচার্ড নপ

আউটপুট ফলাফলের ক্ষেত্রে কোনও পার্থক্য নেই। আপনি যদি গতির দিক দিয়ে পার্থক্যটি জানতে চান তবে সময় নির্ধারণের সময় কার্যকর করতে পারেন execution তবে এটি আসলে গুরুত্বপূর্ণ নয়।
ghostdog74

9
powপ্রায়শই শর্তাবলী কার্যকর করা হয় expএবং logতাই expসরাসরি ব্যবহার প্রায় অবশ্যই ভাল better
জাপ্রিইস

2
xখুব নেতিবাচক হলে এটি ওভারফ্লোতে ভোগে ।
নীল জি

7

tanhফাংশনটি রূপান্তরিত করে আরেকটি উপায় :

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

@ নিলজি গাণিতিকভাবে, সিগময়েড (এক্স) == (1 + তানহ (এক্স / 2)) / 2। সুতরাং এটি একটি বৈধ সমাধান, যদিও সংখ্যাগত স্থিতিশীল পদ্ধতিগুলি সর্বোত্তম superior
স্কটস্ক্লো

6

আমি মনে করি সিগময়েড ফাংশনের আকার পরিবর্তন করতে অনেকে বিনামূল্যে প্যারামিটারে আগ্রহী হতে পারে। অনেকগুলি অ্যাপ্লিকেশনগুলির জন্য দ্বিতীয় যা আপনি মিরর করা সিগময়েড ফাংশনটি ব্যবহার করতে চান। তৃতীয় আপনি একটি সাধারণ স্বাভাবিককরণ করতে চাইতে পারেন উদাহরণস্বরূপ আউটপুট মানগুলি 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)

সিগময়েড ফাংশন গ্রাফ


6

আপনার সিগময়েড ফাংশনটিকে ভেক্টরগুলিকে পার্স করার অনুমতি দেওয়ার জন্য অদ্ভুত প্যাকেজটি ব্যবহার করুন।

ডিপ্লিয়ারিংয়ের সাথে সঙ্গতি রেখে আমি নিম্নলিখিত কোডগুলি ব্যবহার করি:

import numpy as np
def sigmoid(x):
    s = 1/(1+np.exp(-x))
    return s

2

@ ইউনুইন্ডের কাছ থেকে ভাল উত্তর। তবে এটি চরম নেতিবাচক সংখ্যা (ওভারফ্রোয়েরর ফেলে দেওয়া) পরিচালনা করতে পারে না।

আমার উন্নতি:

def sigmoid(x):
    try:
        res = 1 / (1 + math.exp(-x))
    except OverflowError:
        res = 0.0
    return res

এটি আরও ভাল তবে আপনি এখনও নেতিবাচক মান সহ সংখ্যাগত পারকশন ইস্যুতে ভুগছেন।
নিল জি


2

লজিস্টিক সিগময়েড ফাংশনের একটি সংখ্যাগত স্থিতিশীল সংস্করণ।

    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)

1
x যদি ইতিবাচক হয় তবে আমরা কেবল 1 / (1 + np.exp (-x)) ব্যবহার করছি তবে x নেতিবাচক হলে আমরা np.exp (x) / (1 + np.exp (x)) এর পরিবর্তে ফাংশনটি ব্যবহার করছি 1 / (1 + np.exp (-x)) ব্যবহার করে কারণ x যখন নেতিবাচক হবে -x ইতিবাচক হবে তাই এনপি.এক্সপি (-x) -x এর বড় মানের কারণে বিস্ফোরিত হতে পারে।
যশ খারে

2

একটি ওয়ান লাইনার ...

In[1]: import numpy as np

In[2]: sigmoid=lambda x: 1 / (1 + np.exp(-x))

In[3]: sigmoid(3)
Out[3]: 0.9525741268224334

1

ব্যবহারের সময় ভেক্টরাইজড পদ্ধতি 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))

1

আপনি এটি হিসাবে গণনা করতে পারেন:

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))

0
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)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.