假如有一个数据服从高斯分布,均值是m,方差是n,对这个分布进行归一化,让它均值为0方差为1,然后使用一个sigmoid,现在这个分布是什么样的呢?
sigmoid函数是一个非线性的有界函数,它将一个实数输入映射到0和1之间的一个输出:
![](https://img.haomeiwen.com/i16576979/563ba82b4e34a67c.png)
对归一化后的数据应用sigmoid函数时,相当于对标准正态分布进行了一个非线性变换。分布中间部分被拉宽,边缘部分被拉高。
如果不进行归一化直接使用sigmoid,会让分布聚集在1附近(对于下面这个例子)。
import numpy as np
import matplotlib.pyplot as plt
# 设置随机数种子
np.random.seed(1)
# 生成服从高斯分布的数据,均值为m,方差为n
m = 2 # 均值
n = 3 # 方差
data = np.random.normal(m, n, 1000) # 生成1000个数据
# 对数据进行归一化,让它均值为0方差为1
data_norm = (data - m) / n
# 定义sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 对归一化后的数据应用sigmoid函数
data_norm_sigmoid = sigmoid(data_norm)
data_sigmoid = sigmoid(data)
num_bins = 100
# 绘制原始数据和变换后的数据的直方图
plt.figure(figsize=(15, 10))
plt.subplot(2,2, 1)
plt.hist(data, bins=num_bins)
plt.title('Original data')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.subplot(2,2, 2)
plt.hist(data_norm, bins=num_bins)
plt.title('Normed data')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.subplot(2, 2, 4)
plt.hist(data_norm_sigmoid, bins=num_bins)
plt.title('Normed Transformed data')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.subplot(2, 2, 3)
plt.hist(data_sigmoid, bins=num_bins)
plt.title('Transformed data')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()
![](https://img.haomeiwen.com/i16576979/cf400eafd4b97939.png)
如果使用 minmax归一化:
minv = np.min(data_norm)
maxv = np.max(data_norm)
data_minmax = (data_norm-minv)/(maxv-minv)
# 定义softmax函数
def softmax(x):
# 计算每个元素的指数
exp_x = np.exp(x)
# 计算所有元素指数的和
sum_exp_x = np.sum(exp_x)
# 计算每个元素的概率
prob_x = exp_x / sum_exp_x
# 返回概率向量
return prob_x
data_minmax_sigmoid = sigmoid(data_minmax)
data_minmax_soft = softmax(data_minmax) # 和为1
plt.figure()
plt.figure(figsize=(15, 5))
plt.subplot(1,3, 1)
plt.hist(data_minmax, bins=num_bins)
plt.title('MinMax normed data')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.subplot(1,3, 2)
plt.hist(data_minmax_sigmoid, bins=num_bins)
plt.title('Normed Sigmoid data')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.subplot(1,3,3)
plt.hist(data_minmax_soft, bins=num_bins)
plt.title('Normed Softmax data')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()
![](https://img.haomeiwen.com/i16576979/eaf4d7915c112b43.png)
softmax和sigmoid的区别在于,softmax函数可以保证某个维度上的数据之和为1,而sigmoid函数不可以。因此,softmax函数适用于多分类问题,而sigmoid函数适用于二分类或多标签分类问题。
pytorch里似乎不用担心sigmoid输入归一化的问题(看不到具体实现,不懂)。
参考:
其他的Normalization 方法:https://blog.csdn.net/SHU15121856/article/details/89707105
网友评论