数据归一化
最值归一化 ( normalization )
均值方差归一化 ( standardization )
最值归一化 ( normalization )
简介
把所有数据映射到 0 - 1 之间.
适用于: 分布有明显边界的情况, 受 outlier 影响.
如: 成绩 就适用最值归一化, 0 - 100 分就是成绩的边界.
如: 工资 就不适用最值归一化, 因为工资没有明确边界, 很多人工资1W, 但有个别特例, 工资为100W, 使用最值归一化就会出现, 很多人为 0.01, 而个别特列则为 1 . 会造成数据映射结果不够好.
数学公式
x x 需要归一化的值
最大边界值
xmin x m i n 最小边界值值
例子:
max为120, 为10, 计算 75 的最值归一化 :
带入公式 :
xscale=75−10120−10 x s c a l e = 75 − 10 120 − 10
xscale=65110 x s c a l e = 65 110
xscale≈0.591 x s c a l e ≈ 0.591
实现代码
import numpy as np
#定义边界值.
min = 0
max = 10
#随机初始化 最小值为min 最大值为max 的 三行两列矩阵.
X = np.random.randint(min, max, (3, 2))
#手动初始化三行两列矩阵.
X = np.array([[2, 3],
[4, 5],
[6, 7]])
#声明和X同型举证, 用于存放结果.
Y = np.zeros([3, 2], dtype=float)
#将 int 矩阵转换为 float 的矩阵
X = np.array(X, dtype=float)
#将第一列做归一化处理
Y[:, 0] = (X[:, 0] - min) / (max - min)
#将第二列做归一化处理.
Y[:, 1] = (X[:, 1] - min) / (max - min)
print("结果:" + str(Y))
print("均值: %f"%np.mean(Y[:, 0]))
print("方差: %f"%np.std(Y[:, 0]))
'''
结果: [
[0.2 0.3]
[0.4 0.5]
[0.6 0.7]
]
#两列数据的 min:0, max:10
均值: 0.400000
方差: 0.163299
'''
#使用当列元素 最小值作为 min, 最大值作为 max, 第一列, min=2, max=6
Y[:, 0] = (X[:, 0] - np.min(X[:, 0])) / (np.max(X[:, 0]) - np.min(X[:, 0]))
#使用当列元素 最小值作为 min, 最大值作为 max, 第一列, min=3, max=7
Y[:, 1] = (X[:, 1] - np.min(X[:, 1])) / (np.max(X[:, 1]) - np.min(X[:, 1]))
print("结果:" + str(Y))
print("均值: %f"%np.mean(Y[:, 0]))
print("方差: %f"%np.std(Y[:, 0]))
'''
结果: [
[0. 0. ]
[0.5 0.5]
[1. 1. ]
]
#第一列的 min:2, max:6
#第二列的 min:3, max:7
#所以两列结果一直.
均值: 0.500000
方差: 0.408248
'''
均值方差归一化 ( standardization )
简介
把所有数据归一到均值为0, 平方差为1的分布中,
适用于: 数据分布没有明显边界, 有可能存在极端数据值.
如: 工资 就适用均值方差归一化, 因为工资没有明确边界, 很多人工资1W, 但有个别特例, 工资为100W, 使用 均值方差归一化 是最好的选择.
如: 成绩 也可以使用 均值方差归一化, 这种方式有无明显边界都可使用.
数学公式
x x 需要归一化的值
归一化的值
xmean x m e a n 均值
s s 方差
平均数计算公式: (n表示这组数据个数,x1、x2、x3……xn表示这组数据具体数值)
方差计算公式:
s=(x1−M)2+(x2−M)2+(x3−M)2...(xn−M)2n−−−−−−−−−−−−−−−−−−−−−−−−−√
s
=
(
x
1
−
M
)
2
+
(
x
2
−
M
)
2
+
(
x
3
−
M
)
2
.
.
.
(
x
n
−
M
)
2
n
简写公式:
s=∑ni=1(xi−M)2n−−−−−−−−−√
s
=
∑
i
=
1
n
(
x
i
−
M
)
2
n
M
M
平均值.
例子:
计算 [ 2, 3, 5 ] 中 3 的均值方差归一化 :
1.计算平均值:
(2 + 3 + 5) / 3 ≈ 3.33
2.计算方差 S :
带入公式:
s≈(−1.33)2+(−0.33)2+(1.67)23−−−−−−−−−−−−−−−−√ s ≈ ( − 1.33 ) 2 + ( − 0.33 ) 2 + ( 1.67 ) 2 3
s≈1.76+0.10+2.783−−−−−−−−−−√ s ≈ 1.76 + 0.10 + 2.78 3
s≈4.643−−−√ s ≈ 4.64 3
s≈1.54−−−−√ s ≈ 1.54
s≈1.24 s ≈ 1.24
3.带入均值方差归一化公式:
xscale=x−xmeans
x
s
c
a
l
e
=
x
−
x
m
e
a
n
s
xscale≈3−3.331.24 x s c a l e ≈ 3 − 3.33 1.24
xscale≈−0.331.24 x s c a l e ≈ − 0.33 1.24
xscale≈−0.266 x s c a l e ≈ − 0.266
实现代码
import numpy as np
#随机初始化 最小值为min 最大值为max 的 三行两列矩阵.
#X = np.random.randint(min, max, (3, 2))
#手动初始化三行两列矩阵.
X = np.array([[2, 1],
[3, 4],
[5, 7]])
#声明和X同型举证, 用于存放结果.
Y = np.zeros([3, 2], dtype=float)
#将 int 矩阵转换为 float 的矩阵
X = np.array(X, dtype=float)
#将第一列做归一化处理
Y[:, 0] = (X[:, 0] - np.mean(X[:, 0])) / np.std(X[:, 0])
Y[:, 1] = (X[:, 1] - np.mean(X[:, 1])) / np.std(X[:, 1])
print("结果:" + str(Y))
print("第一列平均值: %f"%np.mean(Y[:, 0]))
print("第一列方差值: %f"%np.std(Y[:, 0]))
'''
结果:[
[-1.06904497 -1.22474487]
[-0.26726124 0. ] #该行第一个数 -0.26726124 就是例子中 3 的均值方差归一化
[ 1.33630621 1.22474487]
]
第一列平均值: -0.000000
第一列方差值: 1.000000
'''