概述
归一化,Normalization
把数据进行变换,映射到 [0,1] 之间
主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加 便捷快速。把 有量纲 表达式变成 无量纲 表达式,便于 不同单位 或 量级 的指标能够进行 比较 和 加权。
归一化是一种 简化计算 的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。
扩展
把数据进行变换,映射 [m,n] 之间
案例
假设女生找男朋友的标准有 4个特征:颜值、身高、年薪、房子面积,而且认为 这4个特征 同等重要
目标值 是女生对该男生的 评价:不喜欢、一般、喜欢
颜值(分) | 身高(cm) | 年薪(元) | 房子面积(平方米) | 评价 |
---|---|---|---|---|
7 | 180 | 300000 | 70 | 喜欢 |
3 | 172 | 200000 | 110 | 不喜欢 |
5 | 168 | 250000 | 190 | 一般 |
8 | 185 | 60000 | 0 | 一般 |
4 | 178 | 36000 | 80 | 喜欢 |
6 | 175 | 48000 | 120 | 喜欢 |
注意: 当 特征同等重要 时,才 有可能 需要做归一化处理
在做 分类预测 时,有的分类算法(KNN)要计算特征之间的距离, 计算方式如下:
(列0最大值 - 列0最小值)^2+(列1最大值 - 列1最小值)^2+...+(列n最大值-列n最小值)^2
计算如下:
(7-3)^2+(185-168)^2+(300000-36000)^2+(190-0)^2
问题
- 颜值 数值较小,差异过小,所以 颜值 影响 过小,可以忽略。
- 身高 数值过小,差异过小,所以 身高 影响 过小,可以忽略。
- 年薪 数值过大,差异过大 ,所以 年薪 影响 过大
- 房子面积 数值较小,差异较小,所以 房子面积 影响 较小
在计算时,就 违背 了 特征同等重要
归一化 解决
分别对“颜值”、“身高”、“年薪”、“房子面积” 4个特征 做归一化,转换成 无量纲的数值
注意: 不是 整体 做归一化,是分别对 4个特征 做归一化
如下:
颜值 | 身高 | 年薪 | 房子面积 |
---|---|---|---|
0.8 | 0.70588235 | 1. | 0.36842105 |
0. | 0.23529412 | 0.62121212 | 0.57894737 |
0.4 | 0. | 0.81060606 | 1. |
1. | 1. | 0.09090909 | 0. |
0.2 | 0.58823529 | 0. | 0.42105263 |
0.6 | 0.41176471 | 0.04545455 | 0.63157895 |
以前2行的“颜值”、“年薪”为例
- 转换前,“年薪”量纲更大,显得更重要
- 归一化后,特征转成[0,1]的无量纲数值,同等重要
为什么要归一化?
让数据同等重要
由于数据的 单位不一样,有些数据的范围较大,对结果的影响较大;有些数据的范围较小,对结果的影响较小,不符合数据同等重要
由于有些数据的 值范围较大,对结果的影响较大;有些数据的 值范围较小,对结果的影响较小,不符合数据同等重要
所以,为了让 特征同等重要 ,就需要做 归一化,让每个特征的数据,映射在[0,1]之间,这样对结果的 影响一样大
与激活函数有关
以 sigmoid激活函数为例 ,参见
https://www.malaoshi.top/show_1EF3rzCm0GFL.html
当输入数据过大、过小时,得到的结果差别不大,不能很好的做激活处理
好处
加快了 梯度下降 求最优解的速度
加速梯度下降,减少梯度下降时的 摆动有可能提高 精度
每个特征同等重要
缺点
当有 异常数据 时,计算后对 结果 影响较大,鲁棒性较差,如下图:
应用场景
在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用
比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围
不包括Z-score方法
归一化的类型
本文主要讲解 线性归一化
1. 线性归一化
比较适用在 数值 比较 集中 的情况。
缺陷:如果 max(最大值)和 min(最小值)不稳定,很容易使得归一化 结果不稳定,使得后续使用 效果也不稳定。
2. 非线性归一化
比较适用在 数据 分化 比较大 的情况,有些数值 很大,有些 很小。
通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。
Min-Max归一化(线性归一化)
解释:
- 作用于每一个特征
- max(x) 为 该特征 的 最大值
- min(x) 为 该特征 的 最小值
- 结果在 [0,1] 之间
numpy实现归一化:
import numpy as np
# 将上面的案例进行归一化
l=[
[7,180,300000,70],
[3,172,200000,110],
[5,168,250000,190],
[8,185,60000,0],
[4,178,36000,80],
[6,175,48000,120]
]
arr=np.array(l)
def max_min_normal(x):
mn=np.min(x,axis=0)
mx=np.max(x,axis=0)
return (x-mn)/(mx-mn)
sklearn实现归一化
from sklearn import preprocessing
import numpy as np
l=[
[7,180,300000,70],
[3,172,200000,110],
[5,168,250000,190],
[8,185,60000,0],
[4,178,36000,80],
[6,175,48000,120]
]
arr=np.array(l)
ret = preprocessing.MinMaxScaler().fit_transform(arr)
print("归一化:\n",ret)
缩放数字
将图片的值缩放到0-255之间
有时归一化后,可以自定义结果的区间,还需要再次计算,公式如下:
解释:
x'
是 线性归一化 公式的计算结果- mx、mi是指定区间的最大值、最小值
- 结果
x''
在[mi,mx]之间
在卷积网络中,一般将图片进行归一化,处理后,需要将值缩放回0-255之间,才能显示成图片。
根据上面 【扩展】 得出:
def max_min_normal(x):
mn=np.min(x)
mx=np.max(x)
return (x-mn)/(mx-mn)*255
将值缩放到指定区间
使用下面函数:
import numpy as np
def max_min_normal(x,min,max):
mn=np.min(x)
mx=np.max(x)
res = (x-mn)/(mx-mn)
return res * (max-min)+min
形参解释:
x
表示要计算的数据max
表示指定范围的最大值min
表示指定范围的最小值
测试:
x = [98,97,92,85,81,73,60]
res = max_min_normal(x,85,95)
print("res:",res)
执行结果:
[95. 94.73684211 93.42105263 91.57894737 90.52631579 88.42105263
85. ]
Z-score标准化(0均值归一化)
这种方式是标准化,转换后没有把数据映射到[0,1]之间,但有的地方也将其归为归一化
参见:
https://www.malaoshi.top/show_1EF4YYUNDlOv.html
参考:
https://www.jianshu.com/p/95a8f035c86c
https://blog.csdn.net/qq_36523839/article/details/82919412
https://blog.csdn.net/Datapad/article/details/80174775
https://blog.csdn.net/qq_24831889/article/details/83344638
https://blog.csdn.net/zs15321583801/article/details/79663654