Pythonのsigmoid関数の中間レポート:RuntimeWarning:expでオーバーフローが発生しました

sigmoid 関数で使用されたnumpy.exp とき に発生します RuntimeWarning: overflow encountered in exp 。

理由:パラメータ値inxが非常に大きいため、exp(inx)がオーバーフローする可能性があります。

1つの解決策は、sigmoid関数の実装を最適化することです:https://blog.csdn.net/CY_TEC/article/details/106083366など

def sigmoid(inx):
    if inx>=0:      #对sigmoid函数的优化,避免了出现极大的数据溢出
        return 1.0/(1+exp(-inx))
    else:
        return exp(inx)/(1+exp(inx))

そうすることで、exp(inx)の値が常に1未満になるようにし、極端なオーバーフローを回避できます。

しかし、これはいつも少し変だと感じており、作者もアンダーフローのリスクがあると言っていました。そこで、次のように、numpyのexpをscipy.specialモジュールのexpに置き換える方法を見つけました。

from scipy.special import expit

def sigmoid(z):
    """ 假设函数:logistics的假设函数是sigmoid函数 
        用expit函数来代替np中的exp

    """
    return expit(z)

ロジスティックシグモイド関数とも呼ばれるexpit関数は、expit(x)= 1 /(1 + exp(-x))として定義されます。これは、ロジット関数の逆関数です。

パラメータ:x:
   ndarray ndarray要素はexpit関数を適用します
出力:
   out:ndarrayは
   xと同じ形状のndarrayであり、その要素は対応する要素がexpit関数を入力した結果です。

参照:https//docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.special.expit.html

おすすめ

転載: blog.csdn.net/guyu1003/article/details/108470391