199

これはロジスティック シグモイド関数です。

ここに画像の説明を入力

×知ってる。PythonでF(x)を計算するにはどうすればよいですか?

x = 0.458 としましょう。

F(x) = ?

4

16 に答える 16

278

これはそれを行う必要があります:

import math

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

これで、次のように呼び出してテストできます。

>>> sigmoid(0.458)
0.61253961344091512

更新: 上記は主に、指定された式を Python コードに 1 対 1 で直接変換することを意図していたことに注意してください。テストされていないか、数値的に正しい実装であることがわかっていません。非常に堅牢な実装が必要であることがわかっている場合は、実際にこの問題を考えている人が他にもいると思います。

于 2010-10-21T08:37:31.260 に答える
52

数値的に安定した方法でロジスティック シグモイドを実装する方法は次のとおりです (ここで説明)。

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

(ただし、logaddexp.reduceより正確な場合もあります。)

于 2015-04-25T10:11:57.347 に答える
8

シグモイド関数の形状を変更する自由パラメーターに興味がある人は多いと思います。ミラー化されたシグモイド関数を使用する多くのアプリケーションの 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)

シグモイド関数グラフ

于 2016-06-04T11:46:38.233 に答える
7

別の方法

>>> def sigmoid(x):
...     return 1 /(1+(math.e**-x))
...
>>> sigmoid(0.458)
于 2010-10-21T09:02:21.327 に答える
2

@unwindからの良い答え。ただし、極端な負の数を処理することはできません (OverflowError をスローします)。

私の改善:

def sigmoid(x):
    try:
        res = 1 / (1 + math.exp(-x))
    except OverflowError:
        res = 0.0
    return res
于 2015-12-25T09:45:04.997 に答える