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

数据归一化

程序员文章站 2024-03-25 09:35:46
...

数据归一化

最值归一化 ( normalization )
均值方差归一化 ( standardization )

最值归一化 ( normalization )

简介

把所有数据映射到 0 - 1 之间.
适用于: 分布有明显边界的情况, 受 outlier 影响.
    如: 成绩 就适用最值归一化, 0 - 100 分就是成绩的边界.
    如: 工资 就不适用最值归一化, 因为工资没有明确边界, 很多人工资1W, 但有个别特例, 工资为100W, 使用最值归一化就会出现, 很多人为 0.01, 而个别特列则为 1 . 会造成数据映射结果不够好.



数学公式

xscale=xxminxmaxxmin

x 需要归一化的值
xmax 最大边界值
xmin 最小边界值值



例子:
max为120, 为10, 计算 75 的最值归一化 :
带入公式 :

xscale=751012010

xscale=65110

xscale0.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, 使用 均值方差归一化 是最好的选择.
    如: 成绩 也可以使用 均值方差归一化, 这种方式有无明显边界都可使用.



数学公式

xscale=xxmeans

x 需要归一化的值
xscale 归一化的值
xmean 均值
s 方差

平均数计算公式: M=x1+x2+x3...xnn(n表示这组数据个数,x1、x2、x3……xn表示这组数据具体数值)

方差计算公式:
s=(x1M)2+(x2M)2+(x3M)2...(xnM)2n
简写公式:
s=i=1n(xiM)2n


M 平均值.

例子:
计算 [ 2, 3, 5 ] 中 3 的均值方差归一化 :

1.计算平均值:
(2 + 3 + 5) / 3 ≈ 3.33

2.计算方差 S :
带入公式:
s(23.33)2+(33.33)2+(53.33)23

s(1.33)2+(0.33)2+(1.67)23

s1.76+0.10+2.783

s4.643

s1.54

s1.24

3.带入均值方差归一化公式:
xscale=xxmeans

xscale33.331.24

xscale0.331.24

xscale0.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
'''