数据归一化

数据归一化对于提升模型效果至关重要,它能确保不同特征间具有可比性并加速梯度下降。max-min归一化将数据映射到[0,1]区间,适合有限范围数据;z-score标准化使数据符合标准正态分布,适用于无明显边界且不受异常值影响的情况。在距离度量和PCA等分析中,z-score标准化更为合适。" 98523269,8702131,Libra R-CNN: 解决目标检测三大不平衡问题,"['目标检测算法', '深度学习', '计算机视觉', '图像处理', '损失函数']
摘要由CSDN通过智能技术生成

数据归一化

很多时候,如果不对数据进行归一化,会导致梯度下降复杂或是xgboost中的损失函数只能选择线性,导致模型效果不佳。下面我结合各类我看到的资料总结一下几种方式的归一化,并有python的实现。

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

如下有个形象的图解:

如果不归一化,各维特征的跨度差距很大,目标函数就会是“扁”的:

这里写图片描述

(图中椭圆表示目标函数的等高线,两个坐标轴代表两个特征)
这样,在进行梯度下降的时候,梯度的方向就会偏离最小值的方向,走很多弯路。

如果归一化了,那么目标函数就“圆”了:

这里写图片描述

在知乎里,有人这么回答:

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

作者:王赟 Maigo
链接:https://www.zhihu.com/question/30038463/answer/50491149
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

max-min(Min-Max Normalization)

也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 - 1]之间。转换函数如下:

tips : 适用于本来就分布在有限范围内的数据。

x=xxminxmaxxmin

x_min表示样本数据的最小值,x_max表示样本数据的最大值。

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


# 测试:
x=[1,2,1,4,3,2,5,6,2,7]
b=Normalization(x)

output:

[0.0, 0.16666666666666666, 0.0, 0.5, 0.3333333333333333, 0.16666666666666666, 0.6666666666666666, 0.8333333333333334, 0.16666666666666666, 1.0]

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

x=xxmeanxmaxxmin

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

# 测试
x=[1,2,1,4,3,2,5,6,2,7]
b=Normalization2(x)

output:

[-0.3833333333333333, -0.21666666666666665, -0.3833333333333333, 0.1166666666666667, -0.049999999999999968, -0.21666666666666665, 0.28333333333333338, 0.45000000000000001, -0.21666666666666665, 0.6166666666666667]

z-score 标准化方法

tips : 适用于分布没有明显边界的情况,受outlier影响也较小。

这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:

x=xμσ

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

import numpy as np
def z_score(x): 
    x_mean=np.mean(x) 
    s2=sum([(i-np.mean(x))*(i-np.mean(x)) for i in x])/len(x) 
    return [(i-x_mean)/s2 for i in x]

# 测试:
x=[1,2,1,4,3,2,5,6,2,7]
print z_score(x)

output:

[-0.57356608478802995, -0.32418952618453861, -0.57356608478802995, 0.17456359102244395, -0.074812967581047343, -0.32418952618453861, 0.42394014962593524, 0.67331670822942646, -0.32418952618453861, 0.92269326683291775]

总结

上面有两种方法,那么到底什么情况使用哪一个呢?

  1. 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。
  2. 在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。

为什么在距离度量计算相似性、PCA中使用第二种方法(Z-score standardization)会更好呢?我们进行了以下的推导分析:

使用第二种方法进行计算,我们先不做方差归一化,只做0均值化,变换后数据为

x=xx¯y=yy¯

新数据的协方差为:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值