欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习 数据预处理之归一化

程序员文章站 2022-06-02 17:07:18
...

1、什么是归一化

为了用占比表示特征,每个样本的特征值除以该样本的特征值绝对值之和(对行《样本》操作),使得每个样本的特征值绝对值之和为1 (这里的一般可以在某个东西的增长率或者占比的时候使用)

例如:
             python        java      C         PHP
2017            30          50      40         20
2018            20          30      20         10 

                               用1范数归一化后
                python               java           C           PHP
2017            30 /140         50/140      40/140      20/140
2018            20/80          30 /80        20/80         10 /80

2、作用

使得预处理的数据被限定在一定的范围内(比如【0,1】或者[-1,1]),从而消除奇异样本数据导致的不良影响(奇异样本就是指相对于其他输入样本特别大或特别小的样本矢量(即特征向量)) 加快了梯度下降求最优解的速度 归一化有可能提高精度(如KNN)
详细参考讲解:https://blog.csdn.net/zenghaitao0128/article/details/78361038

3、原理示例代码

import numpy as np
import sklearn.preprocessing as sp

sample = np.array([
    [30, 50, 40, -20],
    [20, 30, 20, -10]
],dtype="float")
s = sample.copy()
# l1范数来归一化数据
for row in s:
    row_abs_sum = abs(row).sum()
    row /= row_abs_sum
print(s)
for row in sample:
    row_sqrt_sum = pow(pow(row, 2).sum(), 0.5)
    row /=row_sqrt_sum
print(sample)

4、库包调用代码

import numpy as np
import sklearn.preprocessing as sp

sample = np.array([
    [30, 50, 40, -20],
    [20, 30, 20, -10]
],dtype="float")
s = sample.copy()
new_s = sp.normalize(s, norm='l1') #选用l1范数 即绝对值
new_sample = sp.normalize(sample, norm='l2')   #选用l2范数 即平方和开根号
print(new_s)
print(new_sample)