美文网首页
Normlization和Sigmoid、Softmax对数据分

Normlization和Sigmoid、Softmax对数据分

作者: 升不上三段的大鱼 | 来源:发表于2023-05-31 14:26 被阅读0次

假如有一个数据服从高斯分布,均值是m,方差是n,对这个分布进行归一化,让它均值为0方差为1,然后使用一个sigmoid,现在这个分布是什么样的呢?

sigmoid函数是一个非线性的有界函数,它将一个实数输入映射到0和1之间的一个输出:


sigmoid

对归一化后的数据应用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()
结果

如果使用 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()

softmax和sigmoid的区别在于,softmax函数可以保证某个维度上的数据之和为1,而sigmoid函数不可以。因此,softmax函数适用于多分类问题,而sigmoid函数适用于二分类或多标签分类问题。

pytorch里似乎不用担心sigmoid输入归一化的问题(看不到具体实现,不懂)。

参考:
其他的Normalization 方法:https://blog.csdn.net/SHU15121856/article/details/89707105

相关文章

网友评论

      本文标题:Normlization和Sigmoid、Softmax对数据分

      本文链接:https://www.haomeiwen.com/subject/sxjyedtx.html