数据规范化

数据规范化、标准化、归一化

转载:原文链接

  • 在数据分析之前,我们都需要让数据满足一定的规律,达到规范性的要求,便于进行挖掘。

  • 如果不进行变换的话,要不就是维数过多增加了计算成本,要不就是数据过于集中,很难找到数据之间的特征。

  • 在数据变换中,重点是如何将数值进行规范化,有三种常用的规范方法,分别是Min-Max规范化、Z-Score规范化、小数定标规范化。

  • 针对数据库:规范化把关系满足的规范要求分为几级,满足要求最低的是第一范式(1NF),再来是第二范式、第三范式、BC范式和4NF、5NF等等,范数的等级越高,满足的约束集条件越严格。

  • 针对数据:

    1.数据的规范化包括归一化标准化正则化,是一个统称(也有人把标准化作为统称)。

    2.数据规范化是数据挖掘中的数据变换的一种方式,数据变换将数据变换或统一成适合于数据挖掘的形式,将被挖掘对象的属性数据按比例缩放,使其落入一个小的特定区间内,如[-1, 1]或[0, 1]。

    3.对属性值进行规范化常用于涉及神经网络和距离度量的分类算法和聚类算法当中。比如使用神经网络后向传播算法进行分类挖掘时,对训练元组中度量每个属性的输入值进行规范化有利于加快学习阶段的速度。对于基于距离度量相异度的方法,数据归一化能够让所有的属性具有相同的权值

1.归一化(normalization):

把数值放缩到0到1的小区间中(归到数字信号处理范畴之内),一般方法是最小最大规范的方:Min-max规范化

将原始数据投射到指定的空间[min,max]。可用公式表示为:

  • 新数值 = (原数值-极小值)/ (极大值 - 极小值) 。

  • x=xminmaxminx^*=\frac {x-min} {max-min}

SciKit-Learn中的MinMaxScaler可以完成这个功能。

上面min-max normalization是线性归一化,还有非线性归一化,通过一些数学函数,将原始值进行映射。该方法包括log、指数、反正切等。需要根据数据分布的情况,决定非线性函数的曲线。

log函数: x=lg(x)lg(max)x=\frac {lg(x)} {lg(max)};反正切函数:x=atan(x)2pix=\frac {atan(x)*2} {pi}

应用:

1.无量纲化
例如房子数量和收入,从业务层知道这两者的重要性一样,所以把它们全部归一化,这是从业务层面上作的处理。

2.避免数值问题
不同的数据在不同列数据的数量级相差过大的话,计算起来大数的变化会掩盖掉小数的变化。

3.一些模型求解的需要
例如梯度下降法,如果不归一化,当学习率较大时,求解过程会呈之字形下降。学习率较小,则会产生直角形路线,不管怎么样,都不会是好路线(路线解释看西面归一化和标准化的对比)。解释神经网络梯度下降的文章。

4.时间序列
进行log分析时,会将原本绝对化的时间序列归一化到某个基准时刻,形成相对时间序列,方便排查。

5.收敛速度
加快求解过程中参数的收敛速度。

特点:

  • 对不同特征维度进行伸缩变换

  • 改变原始数据的分布,使得各个特征维度对目标函数的影响权重归于一致(使得扁平分布的数据伸缩变换成类圆形)

  • 对目标函数的影响体现在数值上

  • 把有量纲表达式变为无量纲表达式

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

好处:

  1. 提高迭代求解的收敛速度
  2. 提高迭代求解的精度

缺点:

  1. 最大值与最小值非常容易受异常点影响
  2. 鲁棒性较差,只适合传统精确小数据场景

2.标准化(standardization)

将原始数据转换为正态分布的形式,使结果易于比较。可用公式表示为:

  • 新数值 = (原数值 - 均值)/ 标准差

  • xx^*=(x-μ)/ρ

在SciKit-Learn中的preprocessing.scale()可以直接将给定数据进行Z-Score规范化。

数据标准化是将数据按比例缩放,使其落入到一个小的区间内,标准化后的数据可正可负,但是一般绝对值不会 太大,一般是z-score标准化方法:减去期望后除以标准差。

特点:

对不同特征维度的伸缩变换的目的是使其不同度量之间的特征具有可比性,同时不改变原始数据的分布。

好处:

  • 不改变原始数据的分布,保持各个特征维度对目标函数的影响权重

  • 对目标函数的影响体现在几何分布上

  • 在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景

3.小数定标规范化:

通过移动小数点的位置来进行规范化。小数点移动的位数取决于该属性数据取值的最大绝对值。

例如:属性A的取值范围是-800到70,那么就可以将数据的小数点整体向左移三位即[-0.8,0.07]

利用numpy对数据进行小数定标规范化的方法如下:

1
2
a = np.ceil(np.log10(np.max(abs(x))))
scaled_x =x/(10**a)

np.linalg.norm(求范数)

1
x_norm=np.linalg.norm(x, ord=None, axis=None, keepdims=False)

1. x: 表示矩阵(也可以是一维)

2. ord:范数类型

向量的范数

参数 说明 计算方法
默认 二范数:L2 x12+x22+...+xn2\sqrt {x^2_1+x^2_2+...+x^2_n}
ord=2 二范数:L2 同上
ord=1 一范数:L1 x1x_1|+|x2x_2|+…+|xnx_n
ord=np.inf 无穷范数:L max(|x1x_1|)

矩阵的范数

ord=1:列和的最大值

ord=2:|λE-ATA|=0,求特征值,然后求最大特征值得算术平方根(matlab在线版,计算ans=ATA,[x,y]=eig(ans),sqrt(y),x是特征向量,y是特征值)

ord=∞:行和的最大值

ord=None:默认情况下,是求整体的矩阵元素平方和,再开根号。(没仔细看,以为默认情况下就是矩阵的二范数,修正一下,默认情况下是求整个矩阵元素平方和再开根号)

3. axis:处理类型

axis=1表示按行向量处理,求多个行向量的范数

axis=0表示按列向量处理,求多个列向量的范数

axis=None表示矩阵范数。

4. keepding:是否保持矩阵的二维特性

True表示保持矩阵的二维特性,False相反

5. 总结

  • 矩阵的三种范数求法(应该是4种了,在默认情况下,又多出了一种情况)

  • 向量的三种范数求法