Python에서 로지스틱 Sigmoid 함수를 계산하는 방법은 무엇입니까?
로지스틱 Sigmoid 함수는 다음과 같습니다.
나는 x를 안다.Python에서 F(x)를 계산하려면 어떻게 해야 하나요?
x = 0.458이라고 합시다.
F(x) =?
이것으로 충분합니다.
import math
def sigmoid(x):
return 1 / (1 + math.exp(-x))
이제 다음 번호로 테스트해 볼 수 있습니다.
>>> sigmoid(0.458)
0.61253961344091512
업데이트: 위의 내용은 주로 주어진 식을 Python 코드로 직접 일대일로 변환하는 것을 목적으로 한 것입니다.테스트되지 않았거나 수치적으로 타당한 구현으로 알려져 있지 않습니다.매우 견고한 실장이 필요하다는 것을 알고 있다면, 실제로 이 문제에 대해 생각해 본 사람도 있을 것입니다.
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
퍼포먼스에 관심이 있는 경우는, 를 사용해 주세요.
일부 벤치마크:
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
이 함수는 C(http://docs.scipy.org/doc/numpy/reference/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
그러나 퍼포먼스가 정말 필요한 경우에는 RAM에 sigmoid 함수의 표를 미리 계산하여 정밀도와 메모리를 어느 정도의 속도와 교환하는 것이 일반적입니다(예: http://radimrehurek.com/2013/09/word2vec-in-python-part-two-optimizing/ ).
이 때 할 점은 '아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.expit
구현은 버전 0.14.0 이후 수치적으로 안정적입니다.https://github.com/scipy/scipy/issues/3385
로지스틱 Sigmoid를 수치적으로 안정된 방법으로 구현하는 방법은 다음과 같습니다(여기 설명 참조).
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 np.exp(-np.logaddexp(0, -x))
만, 그 는 「」를 사용합니다.log1p
.
일반적으로 다항 로지스틱 Sigmoid는 다음과 같습니다.
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
더 정확할 수 있습니다.)
또 다른 방법으로서tanh
기능:
sigmoid = lambda x: .5 * (math.tanh(.5 * x) + 1)
나는 많은 사람들이 S자형 함수의 모양을 바꾸기 위해 자유로운 파라미터에 관심을 가질 것이라고 생각한다.두 번째로, 많은 어플리케이션에서 미러링된 S자형 기능을 사용하고자 합니다.셋째, 출력 값이 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)
numpy 패키지를 사용하여 sigmoid 함수가 벡터를 해석할 수 있도록 합니다.
Deeplearning에 준거하여 다음 코드를 사용합니다.
import numpy as np
def sigmoid(x):
s = 1/(1+np.exp(-x))
return s
다른 방법
>>> def sigmoid(x):
... return 1 /(1+(math.e**-x))
...
>>> sigmoid(0.458)
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
로지스틱 Sigmoid 함수의 수치적으로 안정적인 버전입니다.
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)
@unwind의 좋은 답변입니다.단, 극단적인 음수(OverflowError)는 처리할 수 없습니다.
개선점:
def sigmoid(x):
try:
res = 1 / (1 + math.exp(-x))
except OverflowError:
res = 0.0
return res
라이너 하나면...
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))
또는 개념적이고 깊고 Import가 없는 경우:
def sigmoid(x):
return 1 / (1 + 2.718281828 ** -x)
또는 행렬에 numpy를 사용할 수 있습니다.
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)
위 코드는 python의 로지스틱 sigmoid 함수입니다.내가 그걸 안다면x = 0.467
, S자형 함수는F(x) = 0.385
위의 코드에서 당신이 알고 있는 x의 값을 대입해 볼 수 있습니다.그러면 다른 값을 얻을 수:F(x)
.
다음은 같은 작업을 수행하는 python 함수입니다.
def sigmoid(x) :
return 1.0/(1+np.exp(-x))
간단히 선언할 수 있습니다.1 / np.exp(x)
puting - before x 를 사용하면 혼란스러울 수 있습니다.
>>> def sigmoid(x):
... return 1 /(1 + 1 / np.exp(x))
...
>>> sigmoid(0.458)
언급URL : https://stackoverflow.com/questions/3985619/how-to-calculate-a-logistic-sigmoid-function-in-python
'programing' 카테고리의 다른 글
선언에 없는 경우 어레이 초기화 구문 (0) | 2022.12.30 |
---|---|
요소를 제거하지 않고 세트에서 요소를 가져오려면 어떻게 해야 합니까?MySQL 용어 "제약"과 "외부 키"의 차이점 (0) | 2022.12.30 |
MariaDB의 높은 메모리 사용량을 수정하는 방법 (0) | 2022.12.30 |
임시 테이블의 크기를 제한하려면 어떻게 해야 하나요? (0) | 2022.12.20 |
@Null 주석 사용법 (0) | 2022.12.20 |