4.3 数据规范化

目录

4.3.1 缩放规范化

4.3.2 标准化

4.3.3 范数规范化


4.3.1 缩放规范化

        具体来讲,是将数据按照比例缩放,使其落入一个较小的特定区间,如[0,1]。在某些比较和评价的指标处理中经常会用到缩放规范化,用于去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或者量级的指标进行比较和加权。

        先从最简单的缩放开始,如果特征之间的数值差异较大,可以从单个特征的最大值max和最小值min入手,将最大值和最小值作为控制缩放的因子。

        下面介绍两种方法-----"最小值最大值缩放(Min-Max scaling)"和"最大绝对值缩放(MaxAbsolute Scaling)"

        "Min-Max scaling"将该样本每个特征下的最大值和最小值之差作为缩放倍数,每个特征下没有任何一个数会超过最值之差,所以作为分母;分子是每个特征下的值与最小值之差。全为0的特征,缩放后值为0。取值范围[0, 1]代码表现如下

# 引用相应的库,numpy用于生成缺失值,引用sklearn.processing库,其中包含绝大部分数据与处理方法
from sklearn import preprocessing
import numpy as np
 
# 原始数据X
X = np.array([[3, -2., 2.], [2., 0., 0.], [-1, 1., 3.]])  # 按行表示,按列计算
# 初始化数据预处理器,本例中为最小最大值缩放
min_max_scaler = preprocessing.MinMaxScaler()
# 数据转换并打印
X_minmax = min_max_scaler.fit_transform(X)
print("缩放规范化结果如下:\n")
print(X_minmax)
# 输出其缩放倍数
print("输出其缩放倍数:\n")
print(min_max_scaler.scale_)
# 输出其最小值
print("输出每一列的最小调整:\n")
print(min_max_scaler.min_)
print("输出每一列的最小值:\n")
print(min_max_scaler.data_min_)
输出结果
缩放规范化结果如下:
 
[[1.         0.         0.66666667]
 [0.75       0.66666667 0.        ]
 [0.         1.         1.        ]]
输出其缩放倍数:
 
[0.25       0.33333333 0.33333333]
输出每一列的最小调整:
 
[0.25       0.66666667 0.        ]
输出每一列的最小值:
 
[-1. -2.  0.]

        "MaxAbsolute Scaling"执行效率更高。它在分子上减少了减法运算,分母上也仅采用特征的最大值的绝对值。取值范围[-1, 1],分布以0为中心,更稀疏、合理。代码如下

# 引用相应的库,numpy用于生成缺失值,引用sklearn.processing库,其中包含绝大部分的数据与处理方法
from sklearn import preprocessing
import numpy as np
#原始数据X
X = np.array([[3, -2., 2.], [2., 0., 0.], [-1, 1., 3.]])  # 按行表示,按列计算
# 初始化数据预处理器,本例中为最大绝对值缩放
max_abs_scaler = preprocessing.MaxAbsScaler()
#数据转换并打印
X_maxabs=max_abs_scaler.fit_transform(X)
print(X_maxabs)
输出结果如下:
[[ 1.         -1.          0.66666667]
 [ 0.66666667  0.          0.        ]
 [-0.33333333  0.5         1.        ]]

        对于希望数据分布到特定的取值范围之间的特殊要求,MaxMin Scaling可以预先设置特定的范围,添加一个x_scale表示设定最大值与最小值之后的缩放变换输出(在第一块代码的基础上)

from sklearn import preprocessing
import numpy as np
 
# 原始数据X
X = np.array([[3, -2., 2.], [2., 0., 0.], [-1, 1., 3.]])  # 按行表示,按列计算
# 初始化数据预处理器,本例中为最小最大值缩放
min_max_scaler = preprocessing.MinMaxScaler()
# 变式 添加x_scale改变缩放变换输出
# 初始化数据预处理器,用MaxMinScaling配置feature——range可转化之后的输出范围
min_max_scaler=preprocessing.MinMaxScaler(feature_range=(-2,6))
# 数据转换并打印
X_minmax=min_max_scaler.fit_transform(X)
print("feature_range=-2,6")
print(X_minmax)
输出结果:
feature_range=-2,6
[[ 6.         -2.          3.33333333]
 [ 4.          3.33333333 -2.        ]
 [-2.          6.          6.        ]]

该方法存在问题,一旦样本某特征的数值超出最大最小值的边界,转化后的特征值存在不稳定的情况(在第一块代码的基础上)

from sklearn import preprocessing
import numpy as np
 
# 原始数据X
X = np.array([[3, -2., 2.], [2., 0., 0.], [-1, 1., 3.]])  # 按行表示,按列计算
# 初始化数据预处理器,本例中为最小最大值缩放
min_max_scaler = preprocessing.MinMaxScaler()
# 引入新数据,数据超出边界,输出特征值不稳定
X_new=np.array([[-3.,-1.,4.]])
X_new_minmax=min_max_scaler.transform(X_new)
print("缩放规范化效果如下:")
print(X_new_minmax)
输出:
缩放规范化效果如下:
[[-0.5         0.33333333  1.33333333]]

4.3.2 标准化

        标准化(Standardization),又称标准差规范化或者Z标准化(Z-Score Normalization),对样本的每个特征分别进行计算使其满足正太分布-------均值为0。

        数据集的标准化是许多在sklearn中实现的机器学习估计器的共同要求;如果单个特征没有呈现标准的正态分布----均值为0和标准差为1的分布,那么他们的表现可能很糟糕。在实际应用中,人们经常忽略分布的形状,知识将数据转换为中心,减去每个特征的平均值,然后将非常数特征除以他们的标准差。例如,在学习算法的目标函数中使用许多元素(如支持向量积的RBF核或者线性模型的L1和L2调整器)都假定所有特征中心在0附近,且方差相同,如果一个特征的方差比其他特征大一个数量级,他可能支持目标函数,使估计器无法像预期的那样正确地学习其他特征;代码如下

# 原始数据X
X = np.array([[3, -2., 2.], [2., 0., 0.], [1, 2., 3.]])  # 按行表示,按列计算
# 初始化数据预处理器,本例中为最小最大值缩放
standard_scaler = preprocessing.StandardScaler()
# 数据转换并打印
X_standard = standard_scaler.fit_transform(X)
print(X_standard)
# 输出其均值
print(u'输出标准化变换之后的均值:\n')
print(X_standard.mean(axis=0))
# 输出其标准差
print(u'输出标准化变换之后的标准差:\n')
print(X_standard.std(axis=0))
# 输出结果如下
[[ 0.98058068 -1.33630621  0.26726124]
 [ 0.39223227  0.26726124 -1.33630621]
 [-1.37281295  1.06904497  1.06904497]]
输出标准化变换之后的均值:

[ 7.40148683e-17  0.00000000e+00 -7.40148683e-17]
输出标准化变换之后的标准差:

[1. 1. 1.]

标准化转换后均值0,标准差1,满足标准正态分布
所有预处理方法都提供函数接口,函数调用代码实现如下:

# 标准化缩放函数化实现
X_standard=preprocessing.scale(X)
print(X_standard)
标准化变换后结果如下
[[ 1.22474487 -1.22474487  0.26726124]
 [ 0.          0.         -1.33630621]
 [-1.22474487  1.22474487  1.06904497]]

4.3.3 范数规范化

什么是范数?

总结:范数有四种,L0,L1,L2和无穷范数。

        范数(Norm)是具有“长度”概念的函数。在线性代数、泛函分析及相关数学领域,范数是一个函数,其为向量空间内所有空间内所有向量赋予非零的正长度或者大小。距离的定义是一个较为宽泛的概念,只要满足非负、自反、三角不等式就可以称为距离。范数是一种强化了的距离概念,他在定义上比距离多一条数乘的运算法则。

        函数与几何图形往往具有对应的关系,特别是在三维以下的空间内,函数是几何图像的数学概括,而几何图像时函数的高度形象化,如一个函数对应几何空间中若干点组成的图形

        但当函数与几何超出三维空间时就很难直观地呈现出来,于是存在映射,映射表达的就是一个集合通过某种关系转为另一种集合。

        为了更好的在数学上表示这种映射关系(这里特指线性关系),引入矩阵。这里的矩阵用于表达上述空间映射的线性关系。通过向量表示上述映射中提到的集合,而人们通常所说的“基”就是整个集合的最一般关系。可以这样理解:一个集合(向量),通过一种映射关系(矩阵)得到另一个集合(另外一个向量)。

        向量的范数,就是表示整个原有集合的大小;矩阵的范数,就是表达这个变化过程的一个度量。

        范数----L0:实际用于度量向量中非零元素的个数。

        范数----L1:其来源是曼哈顿的出租车斯基在曼哈顿街道中由一点到另一点需要走过的距离,用于表示向量中元素的绝对值之和,可以度量两个向量间的差异,如绝对误差和(Sum of Absolute Difference, SAD)

        范数----L2:用于表示向量的距离,即所谓的欧氏距离(Euclidean Distance, ED),同样,L2也可以度量两个向量间的差距,如平方差和(Sum of Square Difference)

        到此为止,上述范数的意义还比较容易理解,但是范数不止于L2,到最极端的情况下还有范数L∞。

范数规范化代码如下

# 原始数据X
X = np.array([[3, -2., 2.], [2., 0., 0.], [1, 2., 3.]])  # 按行表示,按列计算
# 范数规范化的函数化实现,其中规范化函数norm为L2,还有其他形式,诸如L1和max(无穷范数)
X_norm = preprocessing.normalize(X, norm='l2')
print('范数L2规范化变换之后的输出:\n')
print(X_norm)

# 范数规范化的类实现,其中规范化系数norm为L1
normlizer = preprocessing.Normalizer(norm='l1').fit(X)
print('范数L1规范化变换之后的输出:\n')
print(normlizer.transform(X))

 

# 输出结果如下
范数L2规范化变换之后的输出:

[[ 0.72760688 -0.48507125  0.48507125]
 [ 1.          0.          0.        ]
 [ 0.26726124  0.53452248  0.80178373]]
范数L1规范化变换之后的输出:

[[ 0.42857143 -0.28571429  0.28571429]
 [ 1.          0.          0.        ]
 [ 0.16666667  0.33333333  0.5       ]]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值