【机器学习】最小最大值归一化,标准化,PCA白化,ZCA白化

归一化

归一化(Normalization)方法泛指把数据特征转换为相同尺度(即取值范围)的方法,比如把数据特征映射到[0, 1]或[−1, 1]区间内,或者映射为服从均值为0、方差为1的分布。

归一化的作用[1][2]

归一化具体作用可总结如下:

(1)统一尺度(无量纲化):

一般而言,样本特征由于来源以及度量单位不同,它们的尺度(Scale)往往差异很大。以描述长度的特征为例,当用“米”作单位时令其值为 𝑥 𝑥 x,那么当用“厘米”作单位时其值为 100 𝑥 100𝑥 100x。不同机器学习模型对数据特征尺度的敏感程度不一样。如果一个机器学习算法在缩放全部或部分特征后不影响它的学习和预测,我们就称该算法具有尺度不变性(Scale Invariance)。比如线性分类器是尺度不变的,而最近邻分类器就是尺度敏感的。当我们计算不同样本之间的欧氏距离时,尺度大的特征会起到主导作用。因此,对于尺度敏感的模型,必须先对样本进行预处理,将各个维度的特征转换到相同的取值区间,并且消除不同特征之间的相关性,才能获得比较理想的结果。

(2)减少调参的人工干预:

从理论上,神经网络应该具有尺度不变性,可以通过参数的调整来适应不同特征的尺度。但尺度不同的输入特征会增加训练难度。假设一个只有一层的网络 y = tanh ⁡ ( w 1 x 1 + w 2 x 2 + b ) y=\tanh \left(w_{1} x_{1}+w_{2} x_{2}+b\right) y=tanh(w1x1+w2x2+b),其中 𝑥 1 ∈ [ 0 , 10 ] , 𝑥 2 ∈ [ 0 , 1 ] 𝑥_1 ∈ [0, 10],𝑥_2 ∈ [0, 1] x1[0,10]x2[0,1] tanh ⁡ \tanh tanh 函数的导数在区间 [ − 2 , 2 ] [−2, 2] [2,2] 上是敏感的,其余的导数接近于 0。

因此,如果 𝑤 1 𝑥 1 + 𝑤 2 𝑥 2 + 𝑏 𝑤_1𝑥_1 + 𝑤_2𝑥_2 + 𝑏 w1x1+w2x2+b过大(正值)或(负值)过小,都会导致梯度过小,难以训练。为了提高训练效率,我们需要使 𝑤 1 𝑥 1 + 𝑤 2 𝑥 2 + 𝑏 𝑤_1𝑥_1 + 𝑤_2𝑥_2 + 𝑏 w1x1+w2x2+b [ − 2 , 2 ] [−2, 2] [2,2]区间,因此需要将 𝑤 1 𝑤_1 w1 设得小一点,比如在 [ − 0.1 , 0.1 ] [−0.1, 0.1] [0.1,0.1]之间。可以想象,如果数据维数很多时,我们很难这样精心去选择每一个参数。因此,如果每一个特征的尺度相似,比如 [ 0 , 1 ] [0, 1] [0,1] 或者 [ − 1 , 1 ] [−1, 1] [1,1],我们就不太需要区别对待每一个参数,从而减少人工干预。

(3)提升模型的收敛速度:

​如图(a),尺度不同会造成在大多数位置上的梯度方向并不是最优的搜索方向。当使用梯度下降法寻求最优解时,会导致需要很多次迭代才能收敛。如果我们把数据归一化为相同尺度,如图(b)所示,大部分位置的梯度方向近似于最优搜索方向。这样,在梯度下降求解时,每一步梯度的方向都基本指向最小值,训练效率会大大提高。

在这里插入图片描述

常用的归一化方法

常用的归一化方法有:最小最大值归一化,标准化(Standardization),白化(Whitening)

假设有 p p p个特征, n n n个样本,则可构成大小为 p × n p\times n p×n的样本矩阵 X X X

X = [ x 11 x 12 ⋯ x 1 n x 21 x 22 ⋯ x 2 n ⋮ ⋮ ⋱ ⋮ x p 1 x p 2 ⋯ x p n ] = [ x 1 x 2   ⋮ x p ] X=\left[\begin{array}{cccc} x_{11} & x_{12} &\cdots & x_{1n} \\ x_{21} & x_{22} &\cdots & x_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ x_{p1} & x_{p2} & \cdots & x_{pn } \end{array}\right]=\left[\begin{array}{cccc}\boldsymbol{x}_1\\\boldsymbol{x}_2\\\ \vdots\\\boldsymbol{x}_p\\ \end{array}\right] X=x11x21xp1x12x22xp2x1nx2nxpn=x1x2 xp

例如,两行45列的数据(2个特征,45个样本):data.txt

-1.3800 -1.1500 -0.4500 -0.4000 0.1100 0.3100 0.4000 0.4400 0.8400 1.0200 1.2200 1.2500 1.4600 1.4700 1.6000 1.6400 1.6800 1.8700 1.8900 1.9700 1.9800 1.9900 2.0400 2.3800 2.4300 2.4800 2.5200 2.5300 2.5700 2.6500 2.8300 2.9000 2.9600 2.9700 2.9900 3.1500 3.6400 3.6400 3.6500 3.7400 3.8800 4.1400 4.2700 4.7200 5.3300
-0.2400 -1.7400 0.0500 -0.8000 0.2900 1.3100 2.6200 0.3000 1.5900 0.7600 1.4500 4.1100 1.7400 0.9900 2.6500 2.6100 0.2600 1.2700 1.4700 1.7300 2.0800 1.4500 2.4500 2.7600 1.5300 2.7600 1.3200 3.2300 2.2600 3.2300 1.7000 3.4900 2.5100 2.7100 2.5300 3.5800 5.0800 4.2000 3.3600 2.6800 3.6000 2.7600 3.7500 5.1200 4.6000
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def ax_adjust(ax):
    '''调整坐标系'''
    ax.spines['top'].set_color('none')
    ax.spines['right'].set_color('none')

    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))
    ax.set_xlim([-6, 6])
    ax.set_ylim([-6, 6])
# 获取数据
X=np.loadtxt('data.txt')
print(np.shape(X))

输出:

(2, 45)

可视化数据:

fig = plt.figure(figsize=(6, 6))
ax1 = fig.add_subplot(111)
ax_adjust(ax1)
# 画出原数据
ax1.scatter(X[0, :40], X[1, :40])
ax1.scatter(X[0, 41:], X[1, 41:])  
ax1.set_title("原始数据")
plt.show()

备注:不同颜色可视化数据是为了表示数据的“方向”。

最小最大值归一化[3]

最小最大值归一化(Min-Max Normalization)通过缩放将每一个特征的取值范围归一到[0, 1]或[−1, 1]之间。
对于每一维特征 x i , i = 1 , 2 , . . . p \boldsymbol{x}_{ i},i=1,2,...p xi,i=1,2,...p,第 k k k个样本的特征值 x i k , k = 1 , 2 , . . . , n x_{ ik},k=1,2,...,n xik,k=1,2,...,n归一化后:
x ^ i k = x i k − min ⁡ ( x i ) max ⁡ ( x i ) − min ⁡ ( x i ) \hat{x}_{ik }=\frac{x_{ik }-\min\left(\boldsymbol{x}_{ i}\right)}{\max \left(\boldsymbol{x}_{ i}\right)-\min \left(\boldsymbol{x}_{i}\right)} x^ik=max(xi)min(xi)xikmin(xi)
使结果值映射到[0, 1]之间。其中 min ⁡ ( x i ) \min(\boldsymbol{x}_{i}) min(xi) max ⁡ ( x i ) \max(\boldsymbol{x}_{i}) max(xi)分别是特征 x i \boldsymbol{x}_{i} xi在所有样本上的最小值和最大值。

min_value=np.min(X,1).reshape(2,1)
max_value=np.max(X,1).reshape(2,1)

min_max_data=(X-min_value)/(max_value-min_value)

fig2 = plt.figure(figsize=(6, 6))
ax2 = fig2.add_subplot(111)
# ax_adjust(ax2)
ax2.scatter(min_max_data[0, :40], min_max_data[1, :40])
ax2.scatter(min_max_data[0, 41:], min_max_data[1, 41:])
ax2.set_title('最小最大值归一化')
plt.show()

因为归一化对异常值(比如:太大的最大值,太小的最小值)非常敏感,所以大多数机器学习算法会选择标准化来进行特征缩放。在主成分分析(PCA)、聚类、逻辑回归、支持向量机、神经网络等算法中,下文的标准化往往是最好的选择。归一化在数据需要被压缩到特定区间时,以及不涉及距离度量、梯度、协方差计算时被广泛使用,如数字图像处理中量化像素强度时,都会使用归一化将数据压缩在区间 [0,1] 内。[3]

标准化(Z值归一化)

标准化(Standardization)也叫Z值归一化(Z-Score Normalization)将样本每一维特征都调整为均值为0,方差为1的分布。

对于特征 x i \boldsymbol{x}_{ i} xi,我们先计算它的均值和方差:
μ i = 1 n ∑ k = 1 n x i k \mu_i=\frac{1}{n} \sum_{k=1}^{n} x_{ik} μi=n1k=1nxik

σ i 2 = 1 n ∑ k = 1 n ( x i k − μ i ) 2 \sigma^{2}_i=\frac{1}{n} \sum_{k=1}^{n}\left(x_{ik}-\mu_i\right)^{2} σi2=n1k=1n(xikμi)2

然后,将第 k k k个样本的特征值 x i k , k = 1 , 2 , . . . n x_{ik},k=1,2,...n xik,k=1,2,...n减去均值 μ i \mu_i μi,并除以标准差 σ i \sigma_i σi,得到新的特征值 x ^ i k \hat{x}_{ik } x^ik

x ^ i k = x i k − μ i σ i + ϵ \hat{x}_{ik }=\frac{x_{ik }-\mu_i}{\sigma_i+\epsilon} x^ik=σi+ϵxikμi

+ ϵ +\epsilon +ϵ是为了防止分母为0.

epsilon = 1e-5
fig3 = plt.figure(figsize=(6, 6))
mu = np.mean(X,1).reshape(2, 1)
sigma = np.std(X, 1).reshape(2, 1)
standard_data = (X- mu) / (sigma + epsilon)
ax3 = fig3.add_subplot(111)
ax_adjust(ax3)
ax3.scatter(standard_data[0, :40], standard_data[1, :40])
ax3.scatter(standard_data[0, 41:], standard_data[1, 41:])
ax3.set_title('标准化')
plt.show()

标准化的不足在于无法减少特征的相关性,而白化则可以。

白化[4][5][6]


推荐阅读:

【机器学习的数学基础】(七)矩阵分解(Matrix Decomposition)(中)


数据经过白化处理后,能满足两个性质:

(1)特征之间相关性较低;

(2)所有特征具有相同的方差。

PCA白化

PCA降维可以实现对数据特征的降维,降维后各维特征不相关。PCA白化的实现与PCA降维类似,在求得协方差的特征值与特征向量以后,用特征向量矩阵的转置左乘原始数据矩阵以实现对数据的旋转变换,再对变换后数据矩阵每一维除以对应标准差(特征值为对应的方差)。

(1)将 X X X 的每一维数据进行零均值化,即每一行的特征值减去这一行的特征均值,结果记为 X ~ \tilde{X} X~

(2)用零均值化后的结果计算协方差矩阵:
Σ = 1 m ( X ~ − 0 ) ( X ~ − 0 ) T \Sigma=\frac{1}{m} (\tilde{X}-0) (\tilde{X}-0)^{T} Σ=m1(X~0)(X~0)T

备注:协方差的无偏估计是 Σ = 1 m − 1 X ~ X ~ T \Sigma=\frac{1}{m-1} \tilde{X} \tilde{X}^{T} Σ=m11X~X~T

(3)对协方差矩阵进行特征值分解
Σ = U Λ U T \Sigma=U \Lambda U^{T} Σ=UΛUT
(4)对数据进行旋转(投影到主成分轴上,实现了去相关性)
X rotate  = U T X X_{\text {rotate }}=U^{T} X Xrotate =UTX
(5)让每一维特征上的数据都除以该维特征的标准差(对每一个主成分轴上的数据进行缩放,使其方差为 1)

X PCAWhite,  i = X rotate  , i λ i + ϵ X_{\text {PCAWhite, } i}=\frac{X_{\text {rotate }, i}}{\sqrt{\lambda_{i}+\epsilon}} XPCAWhite, i=λi+ϵ Xrotate ,i

+ ϵ +\epsilon +ϵ是为了防止分母为0。

综上过程,PCA白化的定义为:
X PCAWhite  = Λ − 1 2 U T X = [ 1 λ 1 + ϵ 0 0 0 ⋱ 0 0 0 1 λ n + ϵ ] U T X rotate  X_{\text {PCAWhite }}=\Lambda^{-\frac{1}{2}} U^{T} X=\left[\begin{array}{ccc} \frac{1}{\sqrt{\lambda_{1}+\epsilon}} & 0 & 0 \\ 0 & \ddots & 0 \\ 0 & 0 & \frac{1}{\sqrt{\lambda_{n}+\epsilon}} \end{array}\right] U^{T}X_{\text {rotate }} XPCAWhite =Λ21UTX=λ1+ϵ 1000000λn+ϵ 1UTXrotate 

数据在经过 PCA 白化以后,其协方差矩阵是一个单位矩阵 I I I,即各维度变得不相关,且每个维度方差都是 1。证明:
Σ P C A w h i t e = 1 m ( X P C A w h i t e − 0 ) ( X P C A w h i t e − 0 ) T = Λ − 1 2 U T ( 1 m X X T ) U ( Λ − 1 2 ) T = Λ − 1 2 U T Σ U Λ − 1 2 = Λ − 1 2 ( U T U ) Λ ( U T U ) Λ − 1 2 = Λ − 1 2 I Λ I Λ − 1 2 = I \begin{aligned} \Sigma_{\mathrm{PCAwhite}} &=\frac{1}{m} (X_{P C A w h i t e}-0)( X_{P C A w h i t e}-0)^{T} \\ &=\Lambda^{-\frac{1}{2}} U^{T}\left(\frac{1}{m} X X^{T}\right) U\left(\Lambda^{-\frac{1}{2}}\right)^{T} \\ &=\Lambda^{-\frac{1}{2}} U^{T} \Sigma U \Lambda^{-\frac{1}{2}} \\ &=\Lambda^{-\frac{1}{2}}\left(U^{T} U\right) \Lambda\left(U^{T} U\right) \Lambda^{-\frac{1}{2}} \\ &=\Lambda^{-\frac{1}{2}} I \Lambda I \Lambda^{-\frac{1}{2}} \\ &=I \end{aligned} ΣPCAwhite=m1(XPCAwhite0)(XPCAwhite0)T=Λ21UT(m1XXT)U(Λ21)T=Λ21UTΣUΛ21=Λ21(UTU)Λ(UTU)Λ21=Λ21IΛIΛ21=I

ZCA白化

ZCA白化则是在PCA白化基础上,将PCA白化后的数据旋转回到原来的特征空间,这样可以使得变换后的数据更加接近原始输入数据。 ZCA白化的计算公式:
X Z C A W h i t e = U X P C A W h i t e X_{\mathrm{ZCAWhite}}=U X_{\mathrm{PCAWhite}} XZCAWhite=UXPCAWhite

同样地,数据在经过 PCA 白化以后,其协方差矩阵依然是一个单位矩阵 I I I

Σ Z C A w h i t e = 1 m X Z C A w h i t e X Z C A w h i t e T = U 1 m X P C A w h i t e X P C A w h i t e T U T = U I U T = I \begin{aligned} \Sigma_{\mathrm{ZCAwhite}} &=\frac{1}{m} X_{\mathrm{ZCAwhite}} X_{Z C A w h i t e}^{T} \\ &=U \frac{1}{m} X_{P C A w h i t e} X_{P C A w h i t e}^{T} U^{T} \\ &=U I U^{T} \\ &=I \end{aligned} ΣZCAwhite=m1XZCAwhiteXZCAwhiteT=Um1XPCAwhiteXPCAwhiteTUT=UIUT=I

fig4 = plt.figure(figsize=(8,8))

# 零均值化
X_hat= X- np.mean(X)  
ax4 = fig4.add_subplot(221)
ax_adjust(ax4)
ax4.scatter(X_hat[0, :40], X_hat[1, :40])
ax4.scatter(X_hat[0, 41:], X_hat[1, 41:])
ax4.set_title('零均值化')
sigma = np.dot(X_hat, X_hat.T) / X_hat.shape[1] # 计算协方差矩阵sigma
[u, s, v] = np.linalg.svd(sigma) # 计算特征向量矩阵u(对称矩阵的奇异值分解就是特征分解)

# 旋转数据
x_rot = np.dot(u.T, X_hat)
ax4 = fig4.add_subplot(222)
ax_adjust(ax4)
ax4.scatter(x_rot[0, :40], x_rot[1, :40])
ax4.scatter(x_rot[0, 41:], x_rot[1, 41:])
ax4.set_title('旋转')

# PCA白化
PCA_whitening = np.diag(1. / np.sqrt(s + epsilon)).dot(x_rot)
ax4 = fig4.add_subplot(223)
ax_adjust(ax4)
ax4.scatter(PCA_whitening[0, :40], PCA_whitening[1, :40])
ax4.scatter(PCA_whitening[0, 41:], PCA_whitening[1, 41:])
ax4.set_title('PCA白化')

# ZCA白化
ZCA_whitening = np.dot(u,PCA_whitening)
ax4 = fig4.add_subplot(224)
ax_adjust(ax4)
ax4.scatter(ZCA_whitening[0, :40], ZCA_whitening[1, :40])
ax4.scatter(ZCA_whitening[0, 41:], ZCA_whitening[1, 41:])
ax4.set_title('ZCA白化')

plt.show()

在这里插入图片描述

参考:

[1] https://zhuanlan.zhihu.com/p/296252799

[2]《神经网络与深度学习》 作者:邱锡鹏

[3]https://blog.csdn.net/xufive/article/details/115345361

[4]https://blog.csdn.net/hjimce/article/details/50864602

[5] https://blog.csdn.net/jiede1/article/details/77039209

[6] https://zhuanlan.zhihu.com/p/414275930

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二进制人工智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值