これはロジスティック シグモイド関数です。
×知ってる。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 コードに 1 対 1 で直接変換することを意図していたことに注意してください。テストされていないか、数値的に正しい実装であることがわかっていません。非常に堅牢な実装が必要であることがわかっている場合は、実際にこの問題を考えている人が他にもいると思います。
数値的に安定した方法でロジスティック シグモイドを実装する方法は次のとおりです (ここで説明)。
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
ます。
一般に、多項ロジスティック シグモイドは次のとおりです。
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)))
シグモイド関数の形状を変更する自由パラメーターに興味がある人は多いと思います。ミラー化されたシグモイド関数を使用する多くのアプリケーションの 2 番目です。3 番目に、たとえば出力値が 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):
... return 1 /(1+(math.e**-x))
...
>>> sigmoid(0.458)
@unwindからの良い答え。ただし、極端な負の数を処理することはできません (OverflowError をスローします)。
私の改善:
def sigmoid(x):
try:
res = 1 / (1 + math.exp(-x))
except OverflowError:
res = 0.0
return res