为什么要做数据归一化?
加快梯度下降的收敛速度
提高计算精度
如果不进行归一化,不同的特征数值范围差异很大。如果直接使用这些原始特征进行分析,那些数值较高的特征会起主要作用。
比如在 KNN 中,距离计算会取决于某些数值特别大的特征。
在 LR 中,最后输出的每个特征的重要度(权重大小)也是不准确的,因为这些特征的数值范围不统一。
常用的数据规范化方法及其适用场景
线性归一化
结果值映射到[0, 1]之间
结果值映射到[-1, 1]之间
适用场景
- 在不涉及距离度量、协方差计算、数据不符合正太分布的时候适用
缺点
当有新数据加入的时候,可能会导致 max, min 发生改变,需要重新定义。
适用线性变换之后,协方差产生了倍数值的缩放,因此这种方式无法消除量纲对方差、协方差的影响,对PCA分析影响巨大。
不能用于存在量纲的距离计算中
最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
标准差标准化(z-score)
- 根据均值、标准差进行数据标准化,处理之后的数据服从0均值,标准差为1的分布
减均值,除以标准差:
适用场景
标准化的前提是假设样本服从正态分布
在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。
新的数据由于对方差进行了归一化,这时候每个维度的量纲其实已经等价了,每个维度都服从均值为0、方差1的正态分布,在计算距离的时候,每个维度都是去量纲化的,避免了不同量纲的选取对距离计算产生的巨大影响。
Q1:为什么方差归一之后,每个维度的量纲就等价了? A1:比如两个人的体重差是 10kg, 身高差是 0.1m,如果单从数值上面来说,体重差特别大,身高差特别小。这是因为这两个量纲根本就没有什么可比性,比如我要是把身高差改成厘米那就是 10cm 了。方差归一化之后能够把身高和体重的分布变成相同的分布,这样子只需要比较数值差就能够判断出不同特征的差距大小。
Q2:在 PCA 的计算中,并没有除以标准差这个操作? A2:
在 PCA 的计算步骤中,第一步是进行中心化,并没有除以标准化的操作;
在 sklearn 中并没有除以标准差的操作
```python self.mean = np.mean(X, axis=0) X -= self.mean
U, S, V = linalg.svd(X, full_matrices=False)
flip eigenvectors’ sign to enforce deterministic output
U, V = svd_flip(U, V) ```
- 但是,我们这里所做的标准化指的并不是 PCA 计算的步骤,而是在 PCA 之前就要做的数据处理。也就是说,我们在 PCA 的零均值化步骤之前,就已经进行了标准化。这样能够避免不同量纲对结果的影响。
Q3:PCA为什么要进行零均值化? A3:主成分分析PCA算法:为什么要对数据矩阵进行均值化?
中心化并不属于预处理,而是 PCA 本身流程的一部分。
PCA 的目标是最大可分性(最大化方差),所以中心化是必须的
缺点
- 此方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。该种标准化方式要求原始数据的分布可以近似为高斯分布,否则效果会变得很糟糕。
log 函数转换
通过以10为底的log函数转换的方法同样可以实现归一下,具体方法如下:
看了下网上很多介绍都是
,其实是有问题的,这个结果并非一定落到[0,1]区间上,应该还要除以log10(max),max为样本数据最大值,并且所有的数据都要大于等于1。
atan 函数转换
用反正切函数也可以实现数据的归一化:
使用这个方法需要注意的是如果想映射的区间为[0,1],则数据都应该大于等于0,小于0的数据将被映射到[-1,0]区间上,而并非所有数据标准化的结果都映射到[0,1]区间上。
Decimal scaling小数定标标准化
通过移动数据的小数点位置来进行标准化。小数点移动多少位取决于属性A的取值中的最大绝对值。
例如 假定A的值由-986到917,A的最大绝对值为986,为使用小数定标标准化,我们用每个值除以1000(即,j=3),这样,-986被规范化为-0.986。