# 3.3 数据预处理常用技巧---归一化 ## 归一化与标准化 归一化是缩放**单个样本**以具有**单位范数**的过程。也就是说,上一节中提到的标准化是对数据中的每一列进行计算,而本节中提到的归一化则是对数据中的每一行进行计算。 一般来说,当我们想要计算两个样本之间的相似度之前,可以尝试一下使用归一化来作为计算相似度之前的预处理,因为有可能会使得相似度计算地更加准确。 在实践中,用的最多的是**L1范式归一化**和**L2范式归一化**,下面来详细看看这两种归一化是怎样计算的。 ## L1范式归一化 `L1`范式定义如下: $$ ||x||_1=\sum_{i=1}^n|x_i| $$ 表示数据`x`中每个特征值`xi`的绝对值之和。 因此,`L1`范式归一化就是将样本中每个特征的特征值**除以**`L1`范式。虽然这个功能实现起来简单,但我们也不必重新造轮子。在`sklearn`中已经提供了该功能,即`normalize`函数,用法如下: ```python # 导入normalize函数 from sklearn.preprocessing import normalize # 定义数据,数据中有3条样本,每条样本中有3个特征 data = np.array([[-1,0,1], [1,0,1], [1,2,3]]) # 使用normalize函数进行L1范式归一化 # data即想要归一化的数据, l1即表示想要使用L1范式归一化来进行归一化处理 data = normalize(data,'l1') # 可以分析一下:第一行的L1范数是不是2,在归一化完了之后,第一行第一列的值是不是-0.5 >>>data array([[-0.5 , 0. , 0.5 ], [ 0.5 , 0. , 0.5 ], [ 0.167, 0.333, 0.5 ]]) ``` ## L2范式归一化 `L2`范式定义如下: $$ ||x||_2=\sqrt{\sum_{i=1}^nx_i^2} $$ 表示数据`x`中每个特征值`xi`计算平方和再开跟。 因此,`L2`范式归一化就是将样本中每个特征**除以**特征的`L2`范式。在`sklearn`中已经提供了该功能,即`normalize`函数,用法如下: ```python # 导入normalize函数 from sklearn.preprocessing import normalize # 定义数据,数据中有3条样本,每条样本中有3个特征 data = np.array([[-1,0,1], [1,0,1], [1,2,3]]) # 使用normalize函数进行L2范式归一化 # data即想要归一化的数据, l2即表示想要使用L2范式归一化来进行归一化处理 data = normalize(data,'l2') # 可以分析一下:第一行的L1范数是不是根号2,在归一化完了之后,第一行第一列的值是不是-0.707 >>>data array([[-0.707, 0. , 0.707], [ 0.707, 0. , 0.707], [ 0.267, 0.535, 0.802]]) ```