如何使 Sigmoid 函数作用于张量

How to make a Sigmoid function work on tensors

我正在尝试构建一个逻辑回归模型,并且我使用 python 从头开始​​实现了一个 sigmoid 函数。它适用于常规整数和浮点数,但不适用于张量中的单个值。

def sigmoid(z):
    return 1/(1 + np.exp(-z))

X

array([[2.9e+01, 5.6e+04],
       [6.4e+01, 8.9e+04],
       [3.3e+01, 1.7e+04],
       [4.5e+01, 9.4e+04],
       [2.4e+01, 2.6e+04],
       [5.5e+01, 2.4e+04],
       [3.5e+01, 5.2e+04],
       [5.7e+01, 6.5e+04],
       [4.5e+01, 3.2e+04],
       [5.2e+01, 7.5e+04],
       [6.2e+01, 3.1e+04]])

sigmoid(X)

array([[1., 1.],
       [1., 1.],
       [1., 1.],
       [1., 1.],
       [1., 1.],
       [1., 1.],
       [1., 1.],
       [1., 1.],
       [1., 1.],
       [1., 1.],
       [1., 1.]])

我做错了什么?

问题在于您的数组中的数字太大,因此 np.exp(large negative number) 非常 非常 小。例如,您的最小数字是 24,np.exp(-24) 是 3.775134544279098e-11。所以 1 / (1 + 非常小的数) ≈ 1。对于你最大的数 9400,结果是 0.0。

如果您将列表除以 100 左右,那么您会开始看到合理的结果:

1/(1 + np.exp(-a/100))  # a is your array

# output:
array([[0.57199613, 1.        ],
       [0.65475346, 1.        ],
       [0.58175938, 1.        ],
       [0.61063923, 1.        ],
       [0.55971365, 1.        ],
       [0.63413559, 1.        ],
       [0.58661758, 1.        ],
       [0.63876318, 1.        ],
       [0.61063923, 1.        ],
       [0.62714777, 1.        ],
       [0.65021855, 1.        ]])

因此请考虑将数字从 0 缩放到 1 或从 0 缩放到 3,这样 sigmoid 函数的结果就有用

例如 sigmoid(a/[100, 100_000]) 给出:

array([[0.57199613, 0.63645254],
       [0.65475346, 0.70889017],
       [0.58175938, 0.54239794],
       [0.61063923, 0.71909966],
       [0.55971365, 0.56463629],
       [0.63413559, 0.55971365],
       [0.58661758, 0.62714777],
       [0.63876318, 0.65701046],
       [0.61063923, 0.57932425],
       [0.62714777, 0.6791787 ],
       [0.65021855, 0.57688526]])

使用像 sklearn 中那样的定标器:

x = sklearn.preprocessing.StandardScaler().fit(a).transform(a)  # don't do it like this
sigmoid(x)

# output:
array([[0.22005356, 0.5481681 ],
       [0.80397984, 0.81288489],
       [0.27698944, 0.21177685],
       [0.48957277, 0.8405247 ],
       [0.16141442, 0.27560685],
       [0.6732804 , 0.26044295],
       [0.30863906, 0.50966239],
       [0.70599565, 0.63208245],
       [0.48957277, 0.32422274],
       [0.62096054, 0.71660935],
       [0.77875086, 0.31581168]])