【Deep Learning】数据预处理(z-score标准化)

z-score 标准化

    z-score 标准化(zero-mean normalization):将数据按期属性(按列进行)减去其均值,并除以其标准差。得到的结果是,对于每个属性/每列来说所有数据都聚集在0附近,方差为1,其公式:
                    在这里插入图片描述
其中 x ˉ \bar{x} xˉ 为 原 始 数 据 的 均 值 \color{#FF0000}{为原始数据的均值} , σ 为 原 始 数 据 的 标 准 差 \color{#FF0000}{为原始数据的标准差} ,是当前用得最多的数据标准化方式。标准差分数可以回答这样一个问题:"给定数据距离其均值多少个标准差"的问题,在均值之上的数据会得到一个正的标准化分数,反之会得到一个负的标准化分数。经过处理的数据符合标准正态分布。
    附标准差公式
                在这里插入图片描述

代码实现

import numpy as np
from sklearn import preprocessing
X = np.array([[1., -1., 2.],  #创建一个原始数据:3x3
              [2., 0., 0.],
              [0., 1., -1.]])
scaler = preprocessing.StandardScaler().fit(X)
print(scaler.mean_)  # 计算每一列的均值
print(scaler.var_)  # 计算每一列的方差
newX = scaler.transform(X)  # 将特征值减去均值,除以标准差。
print(newX)

其中:scaler = preprocessing.StandardScaler().fit(X)
    scaler对象中保存了训练集中的参数(均值、方差),它直接使用其对象转换测试集数据。

  • 这里,打印scaler对象中保存的均值,如下图。其中[1. 0. 0.33333333]是每一列的均值,1是原数据中第一列1,2,0三个数的均值,0是第二列-1,0,1三个数的均值,0.333333是第三列2,0,-1三个数的均值。
                        在这里插入图片描述

  • 再打印scaler对象中保存的方差,如下图。其中[0.66666667 0.66666667 1.55555556]
    是每一列的方差。其实这里的三个方差被约等于化了,原始的方差为[2/3,2/3,14/9]
                        在这里插入图片描述

  • 利用上两步求出的均值和标准差就可以进行最后的操作:
    newX = scaler.transform(X)
    特征值(原始值)减去均值,除以标准差 ,最后我们再打印newX:
                        在这里插入图片描述
    不相信代码计算出来的结果???好,那我手动计算一下!
    在这里插入图片描述
    最后一行的计算出的结果和代码一致!从上面图片结果可以看到,生成的新的数据每列数据均值都聚集在0附近,方差为1。

z-score 标准化意义

    z分数能够真实的反应一个分数距离平均数的相对标准距离。如果我们把每一个分数都转换成z分数,那么每一个z分数会以标准差为单位表示一个具体分数到平均数的距离或离差。将成正态分布的数据中的原始分数转换为z分数,我们就可以通过查阅z分数在正态曲线下面积的表格来得知平均数与z分数之间的面积,进而得知原始分数在数据集合中的百分等级。一个数列的各z分数的平方和等于该数列数据的个数,并且z分数的标准差和方差都为1.平均数为0.
     听 不 懂 ? 再 简 单 点 说 吧 ! \color{#FF0000}{听不懂?再简单点说吧!} Z-Score的主要目的就是将不同量级的数据统一转化为同一个量级,统一用计算出的Z-Score值衡量,以保证数据之间的可比性。z-score值只是一个临界值,它是标准化的结果,本身没有意义,只能用于比较。注意,一般来说z-score不是归一化,而是标准化,归一化只是标准化的一种。
     听 完 以 后 还 是 感 觉 懵 懵 哒 ? \color{#FF0000}{听完以后还是感觉懵懵哒?} 再具体来说吧!在使用深度学习方法,如CNN对图像做分类时,会经常对图像做标准化预处理操作。
    首先我们来看这样一张图:
在这里插入图片描述

    大家看上面两只猪,对于人来说,它就是两只一样的猪,只是图片的灰度或者曝光度不一样罢了,于是我们都给它们都标注为社会人,咋一看,好像没毛病。但是,虽然我们人眼看没毛病,可是机器看的方式和我们不一样,他们看的是对应图片的像素值。由于曝光的,灰度等各种原因,他们像素值其实不一样,那么经过卷积层后,他们的特征很可能不一样。于是神经网络就尴尬了,特征都不一样,为啥标签都一样呢?这样,迷惑的神经网络就不知道怎么对权值进行训练了。

    所以,在对图像进行标准化之前:

  1. 对于人来说,同一样的事物,一样的标签。
  2. 但是对于机器来说,像素值大小不同,可能是两张完全不同的图片,最后经过卷积层,又可能是不同的特征,但却是同样的标签,进而影响神经网络的权值更新。

    标准化以后:

两张图片的像素值就被映射成符合正太分布,均值为0,标准差为1的数值分布:

  1. 这就相当于把不同的图片映射到同一个坐标系,具有相同的尺度;
  2. 因此上述情况就由像素值大小不同的问题转为具有相似的特征分布的问题;
  3. 一定程度上消除了因为过度曝光,质量不佳或者噪声各种原因对模型权重值更新的影像。

还有一种情况:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
标准化以后:

图像中的RGB分量就被映射成符合正太分布,均值为0,标准差为1的数值分布:

  1. 相当于把不同的分量映射到同一个坐标系。具有相同的尺度;
  2. 上述情况就由过大像素值分量主导权值更新的问题转为RGB分量都具有相同的数值分布的问题;
  3. 一定程度上消除了梯度更新的收敛慢,无序等问题 。

在这里插入图片描述
当然,上面仅举了两个例子,还有很多情况需要进行标准化才能解决,标准化常用的是Z-Score, 记住,这是要减去自己数据的均值和除以自己的标准差(不是方差)!

参考链接:
https://blog.csdn.net/Orange_Spotty_Cat/article/details/80312154
https://www.cnblogs.com/sddai/p/8495365.html
https://blog.csdn.net/GoodShot/article/details/80373372
代码参考链接:
https://www.cnblogs.com/chaosimple/p/4153167.html
部分内容摘自知乎链接:
https://zhuanlan.zhihu.com/p/35597976

  • 21
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值