import numpy as np
X = np.random.randint(0,5,[4,4]).astype(float)
print(X)
X-=np.mean(X,axis=0)
X/=np.std(X,axis=0)
print(X)
- 归一化 (Normalization)把数据变成(0,1)或者(1,1)之间的小数。经过变换,化为无量纲的表达式,成为纯量。
- 标准化 (Standardization)标准化后会使每个特征中的数值平均变为0(将每个特征的值都减掉原始资料中该特征的平均)、标准差变为1
- 中心化/零均值化 (Zero-centered)平均值为0,对标准差无要求
归一化和标准化的区别:
归一化是将样本的特征值转换到同一量纲下把数据映射到[0,1]或者[-1, 1]区间内,仅由变量的极值决定,因区间放缩法是归一化的一种。
标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,转换为标准正态分布,和整体样本分布相关,每个样本点都能对标准化产生影响。
它们的相同点在于都能取消由于量纲不同引起的误差;都是一种线性变换,都是对向量X按照比例压缩再进行平移。
标准化:标准化是原始分数减去平均数然后除以标准差,中心化是原始分数减去平均数。 所以一般流程为先中心化再标准化。
**无量纲:**通过某种方法能去掉实际过程中的单位,简化计算。
https://www.jianshu.com/p/95a8f035c86c
**为什么要归一化/标准化?**在使用梯度下降的方法求解最优化问题时, 归一化/标准化后可以加快梯度下降的求解速度,即提升模型的收敛速度。一些分类器需要计算样本之间的距离(如欧氏距离)。太大的数会引发数值问题。
归一化种类:(1)Min-Max Normalization(2)平均归一化(3)非线性归一化
**标准化:**Z-score规范化(标准差标准化 / 零均值标准化)
什么时候用归一化?什么时候用标准化?建议优先使用标准化
(1)如果对输出结果范围有要求,用归一化。
(2)如果数据较为稳定,不存在极端的最大最小值,用归一化。
(3)如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。
5 哪些模型必须归一化/标准化?
(1)SVM(2)KNN(3)神经网络
代码:
def normalization(data):
_range = np.max(data) - np.min(data)
return (data - np.min(data)) / _range
def standardization(data):
mu = np.mean(data, axis=0)
sigma = np.std(data, axis=0)
return (data - mu) / sigma
如果归一化后的范围是[-1, 1]的话,可以将normalization()函数改为:
def normalization(data):
_range = np.max(abs(data))
return data / _range
使用numpy对多维数组沿着行或列进行标准化的方法
标准化数据的公式: (数据值 – 平均数) / 标准差
import numpy as np
employment = np.array([
55.70000076, 51.40000153, 50.5 , 75.69999695,
58.40000153, 40.09999847, 61.5 , 57.09999847,
60.90000153, 66.59999847, 60.40000153, 68.09999847,
66.90000153, 53.40000153, 48.59999847, 56.79999924,
71.59999847, 58.40000153, 70.40000153, 41.20000076
])
mean = employment.mean() #计算平均数
deviation = employment.std() #计算标准差
# 标准化数据的公式: (数据值 - 平均数) / 标准差
standardized_employment = (employment - mean) / deviation
print (standardized_employment)
结果:
[-0.31965231 -0.780123 -0.87650077 1.82207181
-0.03051941 -1.99019768 0.30144772 -0.16973184
0.23719615 0.84758731 0.18365304 1.00821665
0.87971351 -0.56595055 -1.07996476 -0.20185762
1.38301845 -0.03051941 1.2545153 -1.87240259]
import numpy
matrix = numpy.arange(0,27,3).reshape(3,3).astype(numpy.float64)
row_sums = ormed_matrix.sum(axis=1)
#axis=1代表对每一行进行标准化,为0则是对列
new_matrix = ormed_matrix / row_sums[:, numpy.newaxis]
new_matrix
array([[0. , 0.33333333, 0.66666667],
[0.25 , 0.33333333, 0.41666667],
[0.28571429, 0.33333333, 0.38095238]])
from sklearn.preprocessing import normalize
import numpy
matrix = numpy.arange(0,27,3).reshape(3,3).astype(numpy.float64)
ormed_matrix = normalize(matrix, axis=1, norm='l1')
#axis为1对行标准化,可以看出下面输出的每一行之和为1
ormed_matrix
array([[0. , 0.33333333, 0.66666667],
[0.25 , 0.33333333, 0.41666667],
[0.28571429, 0.33333333, 0.38095238]])