此文参考https://blog.csdn.net/u010947534/article/details/86632819
定义上的区别
归一化:将数据的值压缩到0到1之间,公式如下
标准化:将数据所防伪均值是0,方差为1的状态,公式如下:
归一化、标准化的好处:
在机器学习算法的目标函数(例如SVM的RBF内核或线性模型的l1和l2正则化),许多学习算法中目标函数的基础都是假设所有的特征都是零均值并且具有同一阶数上的方差。如果某个特征的方差比其他特征大几个数量级,那么它就会在学习算法中占据主导位置,导致学习器并不能像我们说期望的那样,从其他特征中学习。
举一个简单的例子,在KNN中,我们需要计算待分类点与所有实例点的距离。假设每个实例点(instance)由n个features构成。如果我们选用的距离度量为欧式距离,如果数据预先没有经过归一化,那么那些绝对值大的features在欧式距离计算的时候起了决定性作用。
从经验上说,归一化是让不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。
归一化和标准化的对比分析:
首先明确,在机器学习中,标准化是更常用的手段,归一化的应用场景是有限的。我总结原因有两点:
- 1、标准化更好保持了样本间距。当样本中有异常点时,归一化有可能将正常的样本“挤”到一起去。比如三个样本,某个特征的值为1,2,10000,假设10000这个值是异常值,用归一化的方法后,正常的1,2就会被“挤”到一起去。如果不幸的是1和2的分类标签还是相反的,那么,当我们用梯度下降来做分类模型训练时,模型会需要更长的时间收敛,因为将样本分开需要更大的努力!而标准化在这方面就做得很好,至少它不会将样本“挤到一起”。
- 2、标准化更符合统计学假设
对一个数值特征来说,很大可能它是服从正态分布的。标准化其实是基于这个隐含假设,只不过是略施小技,将这个正态分布调整为均值为0,方差为1的标准正态分布而已。
我们可以先画三个图来试验一下
先画标准正态分布形成的图
import numpy as np
from sklearn.preprocessing import StandardScaler,MinMaxScaler
import matplotlib.pyplot as plttest_arr = numpy.random.randn(10000) * 100 + 500
std_sca = StandardScaler()
mmx_sca = MinMaxScaler()test_std = std_sca.fit_transform(test_arr.reshape(-1,1))
test_mmx = mmx_sca.fit_transform(test_arr.reshape(-1,1))fig,axes = plt.subplots(1,3,figsize=(20,5))plt.suptitle('Original Array ===> After Standard Transform ===> After MinMax TransForm',fontsize=20)
for idx, array in enumerate([test_arr,test_std,test_mx]):axes[idx].hist(array,bins=10)
接下来看看偏态数据形成的图
test_arr = np.concatenate((test_arr,np.linspace(5000,100000,num=30)),axis=0)
std_sca = StandardScaler()
mmx_sca = MinMaxScaler()test_std = std_sca.fit_transform(test_arr.reshape(-1,1))
test_mmx = mmx_sca.fit_transform(test_arr.reshape(-1,1))fig,axes = plt.subplots(1,3,figsize=(20,5))
plt.suptitle('Original Array ===> After Standard Transform ===> After MinMax TransForm',fontsize=20)
for idx, array in enumerate([test_arr,test_std,test_mx]):axes[idx].hist(array[:10010],bins=50)
可以看到标准化没有改变原始数据的极值例子,而归一化则将所有数据都压缩到了01区间内,改变了数据的分布。