数据归一化
程序员文章站
2024-03-25 09:35:46
...
数据归一化
最值归一化 ( normalization )
均值方差归一化 ( standardization )
最值归一化 ( normalization )
简介
把所有数据映射到 0 - 1 之间.
适用于: 分布有明显边界的情况, 受 outlier 影响.
如: 成绩 就适用最值归一化, 0 - 100 分就是成绩的边界.
如: 工资 就不适用最值归一化, 因为工资没有明确边界, 很多人工资1W, 但有个别特例, 工资为100W, 使用最值归一化就会出现, 很多人为 0.01, 而个别特列则为 1 . 会造成数据映射结果不够好.
数学公式
需要归一化的值
最大边界值
最小边界值值
例子:
max为120, 为10, 计算 75 的最值归一化 :
带入公式 :
实现代码
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, 使用 均值方差归一化 是最好的选择.
如: 成绩 也可以使用 均值方差归一化, 这种方式有无明显边界都可使用.
数学公式
需要归一化的值
归一化的值
均值
方差
平均数计算公式: (n表示这组数据个数,x1、x2、x3……xn表示这组数据具体数值)
方差计算公式:
简写公式:
平均值.
例子:
计算 [ 2, 3, 5 ] 中 3 的均值方差归一化 :
1.计算平均值:
(2 + 3 + 5) / 3 ≈ 3.33
2.计算方差 S :
带入公式:
3.带入均值方差归一化公式:
实现代码
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
'''
上一篇: karto探秘之open_karto 第五章 --- 栅格地图的生成
下一篇: RMI起步