归一化分为两部分:1、对数据进行归一化 2、批归一化
在本博文中记录对数据进行归一化,批归一化在后面博文中介绍
#数据归一化:x = (x-u)/std, 减均值,除方差,数据服从均值是0,方差是1的正态分布。
# x = (x - u) / std
#实现归一化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# x_train: [None, 28, 28] -> [None, 784]
"""训练集之前的类型是np.int,因为要做除法,所以先转成float32"""
"""fit_transform的输入必须是二维矩阵[n_examples, features],
fit_transform会在每个feature上单独计算均值和方差然后做归一化,
我们在这里需要的是全局的均值和方差,所以最后一维是1."""
x_train_scaled = scaler.fit_transform(
x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)
#验证集和测试集的归一化也需要用训练集的均值与标准差。
x_valid_scaled = scaler.transform(
x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)
x_test_scaled = scaler.transform(
x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)
使用的数据集是10分类的28*28的图片数据集,下面在具体介绍一下fit_transform的用法示例:
>>> from sklearn.preprocessing import StandardScaler
>>> data = [[0, 0], [0, 0], [1, 1], [1, 1]]
>>> scaler = StandardScaler()
>>> print(scaler.fit(data))
StandardScaler()
>>> print(scaler.mean_)
[0.5 0.5]
>>> print(scaler.transform(data))
[[-1. -1.]
[-1. -1.]
[ 1. 1.]
[ 1. 1.]]
>>> print(scaler.transform([[2, 2]]))
[[3. 3.]
输入为4x2的矩阵,得到的均值有两个,4是样本数目,2是feature数目,所以这个操作是为每个特征求一个均值和方差,去做归一化。再看看我们的需求,我们的需求是给给定所有的图片,每张图片有28*28个像素点,然后我们需要计算所有图片的所有像素点上的均值和方差,注意,只要一个均值和方差。所以我们把最后以为设成1。同理,如果你想给图片的每个位置分别计算均值和方差,那么输入就应该是[None, 28 * 28]。
note:
问题一:
StandardScaler类中transform和fit_transform方法有什么区别?
答:fit_transform方法是fit和transform的结合,fit_transform(X_train) 意思是找出X_train的均值和方差,并应用在X_train上。
这时对于X_test和X_valid,我们就可以直接使用transform方法。因为此时StandardScaler已经保存了X_train的均值和方差。
问题二:
为什么可以用训练集的均值和方差 来transform 测试集的数据X_test?
机器学习中有很多假设,这里假设了训练集的样本采样足够充分。