标准化与归一化

标准化

标准化(standardization)是将数据减去平均数再除以标准差,公式如图1第3个所示

标准差(standard deviation)又叫均方差,公式是\sigma = \sqrt{\frac{1}{N}\sum_{i=1}^{n}{(x_i - \overline{x})^2}}

图1. 四种Feature scaling(特征缩放)方法

用数据看看效果是什么样的:

import numpy as np
from sklearn import preprocessing
data = np.arange(16).reshape(4,4)
#data:
#array([[ 0,  1,  2,  3],
#       [ 4,  5,  6,  7],
#       [ 8,  9, 10, 11],
#       [12, 13, 14, 15]])

scaler = preprocessing.StandardScaler().fit(data)

print(scaler.mean_)
#array([6., 7., 8., 9.])

print(scaler.scale_)
#array([4.47213595, 4.47213595, 4.47213595, 4.47213595])
data_transformed = scaler.transform(data)
print(data_transformed)
#data_transformed
#array([[-1.34164079, -1.34164079, -1.34164079, -1.34164079],
#       [-0.4472136 , -0.4472136 , -0.4472136 , -0.4472136 ],
#       [ 0.4472136 ,  0.4472136 ,  0.4472136 ,  0.4472136 ],
#       [ 1.34164079,  1.34164079,  1.34164079,  1.34164079]])

从上面的结果来看,是把每一列(每个特征的数据)如第一列0, 4, 8, 12先平移到-6,  -2,  2,  6的位置(以0点为中心),然后再以标准差的比例进行缩放(除以4.47)到-1.34,  -0.45,  0.45, 1.34的位置。其他每一列都是同样的操作。

归一化

归一化(Normalization)是指将数据缩放到一定范围之类,如(0,1)之间或者(-1,1)之间。

对于不同量级的特征,需要对他们独立地进行归一化。

缩放到(0,1)之间可以用图1第1个rescaling公式, 要处理的数据减去所有数据的最小值,再除以最大值和最小值的差,相当于把最小值的点移到了0点,所以缩放的范围会落在(0,1)之间。

看看数据处理的结果:

data = np.array([[-5,3],[4,-2],[0,8]])
#array([[-5,  3],
#       [ 4, -2],
#       [ 0,  8]])
data_minmax = min_max_scaler.fit_transform(data)
print(data_minmax)
#array([[0.        , 0.5       ],
#       [1.        , 0.        ],
#       [0.55555556, 1.        ]]))

同样的数据转换也可以适用于未见的测试数据,将测试数据实现和训练数据一致的缩放和移位。

data_test = np.array([[3, -6]])
#data_test
#array([[ 3, -6]])
data_test_minmax = min_max_scaler.transform(data_test)
#data_test_minmax
#array([[ 0.88888889, -0.4       ]])
print(min_max_scaler.scale_)
#array([0.11111111, 0.1       ])
print(min_max_scaler.min_)
#array([0.55555556, 0.2       ])

通过除以这一列特征所有数据的绝对值的最大值缩放到(-1,1)之间,即x^{'} = \frac{x}{abs(max(x))}

data = np.array([[-5,3],[4,-2],[0,8]])
#data
#array([[-5,  3],
#       [ 4, -2],
#       [ 0,  8]])
max_abs_scaler = preprocessing.MaxAbsScaler()
data_maxabs = max_abs_scaler.fit_transform(data)
#data_maxabs
#array([[-1.   ,  0.375],
#       [ 0.8  , -0.25 ],
#       [ 0.   ,  1.   ]])
print(max_abs_scaler.scale_)
#array([5., 8.])
data_test = np.array([[3, -10]])
data_test_maxabs = max_abs_scaler.transform(data_test)
print(data_test_maxabs)
#array([[ 0.6 , -1.25]])

归一化的原因见图2:

图2

中心化

中心化(Zero-centered)是原始数据减去平均数。

 

如果数据较稳定,不存在极端的极大值或者极小值,用归一化

如果数据存在较多的噪音和异常值,用标准化,可以通过间接中心化避免极值和异常值的影响。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值