机器学习之数据的偏态分布和数据的标准化

目录

 

一、偏态分布

1、何为数据的偏态分布?

2、构建模型时为什么要尽量将偏态数据转换为正态分布数据?

3、如何检验样本是否服从正态分布? 

4 、如果不是正态分布怎么办?

5、采用库函数skew进行数据偏态分析和数据处理

二、数据的标准化/归一化normalization

2.1、数据的标准化(normalization)和归一化

2.2、归一化和标准化能带来什么

2.3 、归一化后有两个好处

2.4、如何判断模型是否需要归一化

2.5、常见的数据归一化方法

2.7、数据标准化/归一化的编程实现

三、神经网络为什么需要归一化


一、偏态分布

1、何为数据的偏态分布?

频数分布有正态分布和偏态分布之分。正态分布是指多数频数集中在中央位置,两端的频数分布大致对称。

偏态分布是指频数分布不对称,集中位置偏向一侧。若集中位置偏向数值小的一侧,称为正偏态分布;集中位置偏向数值大的一侧,称为负偏态分布。

如果频数分布的高峰向左偏移,长尾向右侧延伸称为正偏态分布,也称右偏态分布;同样的,如果频数分布的高峰向右偏移,长尾向左延伸则成为负偏态分布,也称左偏态分布。

峰左移,右偏,正偏

峰右移,左偏,负偏

skewed_distribution_demo

 

偏态分布只有满足一定的条件(如样本例数够大等)才可以看做近似正态分布。

与正态分布相对而言,偏态分布有两个特点:

  一是左右不对称(即所谓偏态);

  二是当样本增大时,其均数趋向正态分布。

2、构建模型时为什么要尽量将偏态数据转换为正态分布数据?

  数据整体服从正态分布,那样本均值和方差则相互独立。正态分布具有很多好的性质,很多模型假设数据服从正态分布。例如线性回归(linear regression),它假设误差服从正态分布,从而每个样本点出现的概率就可以表示成正态分布的形式,将多个样本点连乘再取对数,就是所有训练集样本出现的条件概率,最大化这个条件概率就是LR要最终求解的问题。这里这个条件概率的最终表达式的形式就是我们熟悉的误差平方和。总之, ML中很多model都假设数据或参数服从正态分布。

3、如何检验样本是否服从正态分布? 

可以使用Q-Q图来进行检验,Q-Q图是一个散点图,点(x, y)表示数据x的某个分位数,y表示和x的分位数相同的分位数(即[Math Processing Error]FX(x)=FY(y)),如果说两个分布的QQ图在一条直线上,则说明每个[Math Processing Error][xi,xi+1],[yi,yi+1]区间所包含的数据在整个数据集中的比例相同,也就是说明如果对x或y进行放缩的话可以让它们。

所以,如果把未知数据和标准正态分布做Q-Q图的话,如果所有点在一条直线上则说明未知数据的分布服从正态分布。

4 、如果不是正态分布怎么办?

 
        数据右偏的话可以对所有数据取对数、取平方根等,它的原理是因为这样的变换的导数是逐渐减小的,也就是说它的增速逐渐减缓,所以就可以把大的数据向左移,使数据接近正态分布。 
如果左偏的话可以取相反数转化为右偏的情况。

5、采用库函数skew进行数据偏态分析和数据处理

偏态系数以平均值与中位数之差对标准差之比率来衡量偏斜的程度,用SK表示偏斜系数。

偏态系数小于0时,平均数在众数之左,是一种左偏的分布,又称为负偏。

偏态系数大于0时,均值在众数之右,是一种右偏的分布,又称为正偏。

 Cs=0称为正态分配,Cs>0称为正偏分配,Cs<0称为负偏分配

 例子:

 

相关参考:

https://www.cnblogs.com/gczr/p/6802998.html

二、数据的标准化/归一化normalization

 

2.1、数据的标准化(normalization)和归一化

 归一化常用的方法是通过对原始数据进行线性变换把数据映射到[0,1]之间,变换函数为:

    其中max为样本数据的最大值,min为样本数据的最小值。这种方法有个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

 标准化常用的方法是z-score标准化,经过处理后的数据均值为0,标准差为1,处理方法是:

其中,其中μ是样本的均值, σ是样本的标准差。该种归一化方式要求原始数据的分布可以近似为高斯分布,否标准化的效果会变得很糟糕。它们可以通过现有样本进行估计。在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

2.2、归一化和标准化能带来什么

归一化的依据非常简单,不同变量往往量纲不同,归一化可以消除量纲对最终结果的影响,使不同变量具有可比性。比如两个人体重差10KG,身高差0.02M,在衡量两个人的差别时体重的差距会把身高的差距完全掩盖,归一化之后就不会有这样的问题。

标准化的原理比较复杂,它表示的是原始值与均值之间差多少个标准差,是一个相对值,所以也有去除量纲的功效。同时,它还带来两个附加的好处:均值为0,标准差为1。

均值为0有什么好处呢?它可以使数据以0为中心左右分布(这不是废话嘛),而数据以0为中心左右分布会带来很多便利。比如在去中心化的数据上做SVD分解等价于在原始数据上做PCA;机器学习中很多函数如SigmoidTanhSoftmax等都以0为中心左右分布(不一定对称)。

以上为两种比较普通但是常用的归一化技术,那这两种归一化的应用场景是怎么样的呢?什么时候第一种方法比较好、什么时候第二种方法比较好呢?下面做一个简要的分析概括:

1、在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。

2、在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。

3.一种是最值归一化,比如把最大值归一化成1,最小值归一化成-1;或把最大值归一化成1,最小值归一化成0。适用于本来就分布在有限范围内的数据。        

 4.另一种是均值方差归一化,一般是把均值归一化成0,方差归一化成1。适用于分布没有明显边界的情况。

2.3 、归一化后有两个好处

1. 提升模型的收敛速度

如下图,x1的取值为0-2000,而x2的取值为1-5,假如只有这两个特征,对其进行优化时,会得到一个窄长的椭圆形,导致在梯度下降时,梯度的方向为垂直等高线的方向而走之字形路线,这样会使迭代很慢,相比之下,右图的迭代就会很快(理解:也就是步长走多走少方向总是对的,不会走偏)


2.提升模型的精度

归一化的另一好处是提高精度,这在涉及到一些距离计算的算法时效果显著,比如算法要计算欧氏距离,上图中x2的取值范围比较小,涉及到距离计算时其对结果的影响远比x1带来的小,所以这就会造成精度的损失。所以归一化很有必要,他可以让各个特征对结果做出的贡献相同。

    在多指标评价体系中,由于各评价指标的性质不同,通常具有不同的量纲和数量级。当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。因此,为了保证结果的可靠性,需要对原始指标数据进行标准化处理。

    在数据分析之前,我们通常需要先将数据标准化(normalization),利用标准化后的数据进行数据分析。数据标准化也就是统计数据的指数化。数据标准化处理主要包括数据同趋化处理和无量纲化处理两个方面。数据同趋化处理主要解决不同性质数据问题,对不同性质指标直接加总不能正确反映不同作用力的综合结果,须先考虑改变逆指标数据性质,使所有指标对测评方案的作用力同趋化,再加总才能得出正确结果。数据无量纲化处理主要解决数据的可比性。经过上述标准化处理,原始数据均转换为无量纲化指标测评值,即各指标值都处于同一个数量级别上,可以进行综合测评分析。

从经验上说,归一化是让不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。

3. 深度学习中数据归一化可以防止模型梯度爆炸。

2.4、如何判断模型是否需要归一化

        有些模型在各个维度进行不均匀伸缩后,最优解与原来不等价,例如SVM(距离分界面远的也拉近了,支持向量变多)。对于这样的模型,除非本来各维数据的分布范围就比较接近,否则必须进行标准化,以免模型参数被分布范围较大或较小的数据dominate。
        有些模型在各个维度进行不均匀伸缩后,最优解与原来等价,例如logistic regression(因为θ的大小本来就是学习出不同的feature的重要性)。对于这样的模型,是否标准化理论上不会改变最优解。但是,由于实际求解往往使用迭代算法,如果目标函数的形状太“扁”,迭代算法可能收敛得很慢甚至不收敛。所以对于具有伸缩不变性的模型,最好也进行数据标准化。

2.5、常见的数据归一化方法

最常用的是 min-max标准化 和 z-score 标准化。

1.min-max标准化(Min-max normalization)/0-1标准化(0-1 normalization)/线性函数归一化/离差标准化

是对原始数据的线性变换,使结果落到[0,1]区间,转换函数如下:

其中max为样本数据的最大值,min为样本数据的最小值。

def Normalization(x):
    return [(float(i)-min(x))/float(max(x)-min(x)) for i in x]

如果想要将数据映射到[-1,1],则将公式换成:

x* = x* * 2 -1

或者进行一个近似

x* = (x - x_mean)/(x_max - x_min), x_mean表示数据的均值。

def Normalization2(x):
    return [(float(i)-np.mean(x))/(max(x)-min(x)) for i in x]

这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。

2.z-score 标准化(zero-mean normalization)

最常见的标准化方法就是Z标准化,也是SPSS中最为常用的标准化方法,spss默认的标准化方法就是z-score标准化。

也叫标准差标准化,这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。

经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:

x* = (x - μ ) / σ

其中μ为所有样本数据的均值,σ为所有样本数据的标准差。

z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。该种归一化方式要求原始数据的分布可以近似为高斯分布,否则归一化的效果会变得很糟糕。

标准化的公式很简单,步骤如下

  1.求出各变量(指标)的算术平均值(数学期望)xi和标准差si ;
  2.进行标准化处理:
  zij=(xij-xi)/si
  其中:zij为标准化后的变量值;xij为实际变量值。
  3.将逆指标前的正负号对调。
  标准化后的变量值围绕0上下波动,大于0说明高于平均水平,小于0说明低于平均水平。

def z_score(x, axis):
    x = np.array(x).astype(float)
    xr = np.rollaxis(x, axis=axis)
    xr -= np.mean(x, axis=axis)
    xr /= np.std(x, axis=axis)
    # print(x)
    return x

为什么z-score 标准化后的数据标准差为1?

x-μ只改变均值,标准差不变,所以均值变为0

(x-μ)/σ只会使标准差除以σ倍,所以标准差变为1

这两种最常用方法使用场景:

1、在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。

2、在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。
原因是使用第一种方法(线性变换后),其协方差产生了倍数值的缩放,因此这种方式无法消除量纲对方差、协方差的影响,对PCA分析影响巨大;同时,由于量纲的存在,使用不同的量纲、距离的计算结果会不同。而在第二种归一化方式中,新的数据由于对方差进行了归一化,这时候每个维度的量纲其实已经等价了,每个维度都服从均值为0、方差1的正态分布,在计算距离的时候,每个维度都是去量纲化的,避免了不同量纲的选取对距离计算产生的巨大影响。
[再谈机器学习中的归一化方法(Normalization Method) ]

3.log函数转换

通过以10为底的log函数转换的方法同样可以实现归一下,具体方法如下:

看了下网上很多介绍都是x*=log10(x),其实是有问题的,这个结果并非一定落到[0,1]区间上,应该还要除以log10(max),max为样本数据最大值,并且所有的数据都要大于等于1。

4.atan函数转换

用反正切函数也可以实现数据的归一化。

使用这个方法需要注意的是如果想映射的区间为[0,1],则数据都应该大于等于0,小于0的数据将被映射到[-1,0]区间上,而并非所有数据标准化的结果都映射到[0,1]区间上。

5.Decimal scaling小数定标标准化

这种方法通过移动数据的小数点位置来进行标准化。小数点移动多少位取决于属性A的取值中的最大绝对值。

将属性A的原始值x使用decimal scaling标准化到x'的计算方法是:
x'=x/(10^j)
其中,j是满足条件的最小整数。
例如 假定A的值由-986到917,A的最大绝对值为986,为使用小数定标标准化,我们用每个值除以1000(即,j=3),这样,-986被规范化为-0.986。
注意,标准化会对原始数据做出改变,因此需要保存所使用的标准化方法的参数,以便对后续的数据进行统一的标准化。

6.Logistic/Softmax变换

[Sigmod/Softmax变换 ]

7.模糊量化模式

新数据=1/2+1/2sin[派3.1415/(极大值-极小值)*(X-(极大值-极小值)/2) ] X为原数据

2.7、数据标准化/归一化的编程实现

python库实现和调用

[Scikit-learn:数据预处理Preprocessing data ]

相关参考:

 http://blog.csdn.net/pipisorry/article/details/52247379

http://blog.csdn.net/pipisorry/article/details/52247379

https://blog.csdn.net/maqunfi/article/details/82252480

三、神经网络为什么需要归一化

1.数值问题。

       无容置疑,归一化的确可以避免一些不必要的数值问题。输入变量的数量级未致于会引起数值问题吧,但其实要引起也并不是那么困难。因为tansig的非线性区间大约在[-1.7,1.7]。意味着要使神经元有效,tansig( w1*x1 + w2*x2 +b) 里的 w1*x1 +w2*x2 +b 数量级应该在 1 (1.7所在的数量级)左右。这时输入较大,就意味着权值必须较小,一个较大,一个较小,两者相乘,就引起数值问题了。

       假如你的输入是421,你也许认为,这并不是一个太大的数,但因为有效权值大概会在1/421左右,例如0.00243,那么,在matlab里输入  421*0.00243 == 0.421*2.43                                                

可以看到两者不相等了,说明已经引起数值问题了。

2.求解需要

       我们建立了神经网络模型后,只要找到的解足够好,我们的网络就能够正确的预测了。在训练前我们将数据归一化,说明数据归是为了更方便的求解。

那么,究竟给求解带来了什么方便呢?

         这个问题不能一概而论,不同的算法,在归一化中得到的好处各不相同。假若有一个很牛B的求解算法,那完全用不着归一化,不过目前大部算法,都比较需要归一化,特别是常用的梯度下降法(或梯度下降的衍生方法),归一化和不归一化,对梯度下降法的影响非常大。不同的算法,对归一化的依赖程序不同,例如列文伯格-马跨特算法(matlab工具箱的trainlm法)对归一化的依赖就没有梯度下降法(matlab里的traingd)那么强烈。

         既然不同的算法对归一化有不同的理由,篇幅有限,本文就仅以梯度下降法举例。

        重温一下梯度法,梯度法一般初始化一个初始解,然后求梯度,再用新解=旧解-梯度*学习率 的方式来迭代更新解。直到满足终止迭代条件,退出循环。

先看归一化对初始化的好处:

(1)初始化

        过初始化的同学会发现,输入数据的范围会影响我们初始化的效果。例如,某个神经元的值为tansig(w1*x1+w2*x2+b),由于tansig函数只有在[-1.7,1.7]的范围才有较好的非线性,所以w1*x1+w2*x2+b的取值范围就要与 [-1.7,1.7]有交集(实际上需要更细腻的条件),这个神经元才能利用到非线性部分。

        我们希望初始化的时候,就把每个神经元初始化成有效的状态,所以,需要知道w1*x1+w2*x2+b的取值范围,也就需要知道输入输出数据的范围。

        输入数据的范围对初始化的影响是无法避免的,一般讨论初始化方法时,我们都假设它的范围就是[0,1]或者[-1,1],这样讨论起来会方便很多。就这样,若果数据已经归一化的话,能给初始化模块带来更简便,清晰的处理思路。

       注:matlab工具箱在初始化权值阈值的时候,会考虑数据的范围,所以,即使你的数据没归一化,也不会影响matlab工具箱的初始化

(2)梯度

        以输入-隐层-输出这样的三层BP为例,我们知道对于输入-隐层权值的梯度有2e*w*(1-a^2)*x的形式(e是誤差,w是隐层到输出层的权重,a是隐层神经元的值,x是输入),若果输出层的数量级很大,会引起e的数量级很大,同理,w为了将隐层(数量级为1)映身到输出层,w也会很大,再加上x也很大的话,从梯度公式可以看出,三者相乘,梯度就非常大了。这时会给梯度的更新带来数值问题。

(3)学习率

         由(2)中,知道梯度非常大,学习率就必须非常小,因此,学习率(学习率初始值)的选择需要参考输入的范围,不如直接将数据归一化,这样学习率就不必再根据数据范围作调整。

         隐层到输出层的权值梯度可以写成 2e*a,而输入层到隐层的权值梯度为 2e *w*(1-a^2)*x ,受 x 和 w 的影响,各个梯度的数量级不相同,因此,它们需要的学习率数量级也就不相同。对w1适合的学习率,可能相对于w2来说会太小,若果使用适合w1的学习率,会导致在w2方向上步进非常慢,会消耗非常多的时间,而使用适合w2的学习率,对w1来说又太大,搜索不到适合w1的解。

          如果使用固定学习率,而数据没归一化,则后果可想而知。

         不过,若果像matlab工具箱一样,使用自适应学习率,学习率的问题会稍稍得到一些缓和。

(4)搜索轨迹

         前面已说过,输入范围不同,对应的 w 的有效范围就不同。假设 w1 的范围在 [-10,10],而w2的范围在[-100,100],梯度每次都前进1单位,那么在w1方向上每次相当于前进了 1/20,而在w2上只相当于 1/200!某种意义上来说,在w2上前进的步长更小一些,而w1在搜索过程中会比w2“走”得更快。这样会导致,在搜索过程中更偏向于w1的方向。    

      抛开哪种路线更有效于找到最佳解的问题不谈,两点之间直线距离最短,这种直角路线明显会更耗时间,所以不归一化,时间会明显增加。

      从上面的分析总结,除去数值问题的影响,最主要的影响就是,每一维的偏导数计算出来数量级会不一致。下面我们来个试验。

3.小实验

     假设我们有两个输入变量,x1范围是[-1,1],但x2是[-100,100],输出范围是[-1,1]。x2在输入数据上没有做归一化,怎么修改训练过程,才能让训练结果如同数据归一化了一样呢。

     通过上面的讨论,我们知道x2增大了,会使w2的梯度也很大,因此我们在计算w2梯度时,需要把它的梯度除以100.才能得到它的梯度数量级与w1的一致。然后在更新w步长的时候,w1的有效取值范围(1/1)是w2的有效取值范围(1/100)的100倍,因此w2走的时候,应该以1/100的步去走。所以w2的学习率也需要除以100。

     这样,若果不考虑数值问题,会和数据作了归一化的结果是一样的。这里就不展示实验的代码了,因为需要涉及整个BP代码。有兴趣研究的同学在自己的编写的代码上动下刀。

     这是一个案例分析,说明不考虑数值问题的话,只是影响了这两个地方。假设,x2的输入范围是[100,300],那肯定不是除以100就可以了,需要更复杂一些的变换,这里不再深入纠结。

    为什么要归一化,对于使用梯度下降法训练的三层BP神经网络总结出的就是这些原因了。对于其他的神经网络模型,会有其它的原因,这里就不再作分析。

下面是网友关于为什么要归一化的一些回答(欢迎补充):

1.避免数值问题。

2.使网络快速的收敛。

3.样本数据的评价标准不一样,需要对其量纲化,统一评价标准

4.bp中常采用sigmoid函数作为转移函数,归一化能够防止净输入绝对值过大引起的神经元输出饱和现象 。

5.保证输出数据中数值小的不被吞食 。

其他问题的探讨:

神经元饱和问题:与权值阈值相乘后,才是sigmoid的输入值,初始化得好的话,并不会饱和输出。若果使用“把权值和阈值随机初始化为[-1,1]之间的值”这种初始化方法,那不归一化就会引起神经元输出饱和现象。

大数吞小数:若果我们找到适合的权值,是不会吞掉的,例如x1=10000,x2=1, 而w1=0.0001,w2=1,那么w1*x1是不会吞掉w2*x1的。

参考:

www.nnetinfo.com 

[线性回归与特征归一化(feature scaling)]

  • 15
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值