矩阵归一化、标准化、中心化/零均值化

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)
  1. 归一化 (Normalization)把数据变成(0,1)或者(1,1)之间的小数。经过变换,化为无量纲的表达式,成为纯量。
  2. 标准化 (Standardization)标准化后会使每个特征中的数值平均变为0(将每个特征的值都减掉原始资料中该特征的平均)、标准差变为1
  3. 中心化/零均值化 (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')
#axis1对行标准化,可以看出下面输出的每一行之和为1
ormed_matrix


array([[0.        , 0.33333333, 0.66666667],
       [0.25      , 0.33333333, 0.41666667],
       [0.28571429, 0.33333333, 0.38095238]])
    原文作者:介壳
    原文地址: https://blog.csdn.net/qq_40515250/article/details/117412813
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞