600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 【机器学习】最小最大值归一化 标准化 PCA白化 ZCA白化

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

时间:2022-01-11 10:22:56

相关推荐

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

文章目录

归一化归一化的作用[1][2]常用的归一化方法最小最大值归一化[3]标准化(Z值归一化)白化[4][5][6]PCA白化ZCA白化

归一化

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

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

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

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

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

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

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

因此,如果𝑤1𝑥1+𝑤2𝑥2+𝑏𝑤_1𝑥_1 + 𝑤_2𝑥_2 + 𝑏w1​x1​+w2​x2​+b过大(正值)或(负值)过小,都会导致梯度过小,难以训练。为了提高训练效率,我们需要使𝑤1𝑥1+𝑤2𝑥2+𝑏𝑤_1𝑥_1 + 𝑤_2𝑥_2 + 𝑏w1​x1​+w2​x2​+b在[−2,2][−2, 2][−2,2]区间,因此需要将𝑤1𝑤_1w1​ 设得小一点,比如在[−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)

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

X=[x11x12⋯x1nx21x22⋯x2n⋮⋮⋱⋮xp1xp2⋯xpn]=[x1x2⋮xp]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=⎣⎢⎢⎢⎡​x11​x21​⋮xp1​​x12​x22​⋮xp2​​⋯⋯⋱⋯​x1n​x2n​⋮xpn​​⎦⎥⎥⎥⎤​=⎣⎢⎢⎢⎡​x1​x2​⋮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 npimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus'] = Falsedef 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]之间。

对于每一维特征xi,i=1,2,...p\boldsymbol{x}_{ i},i=1,2,...pxi​,i=1,2,...p,第kkk个样本的特征值xik,k=1,2,...,nx_{ ik},k=1,2,...,nxik​,k=1,2,...,n归一化后:

x^ik=xik−min⁡(xi)max⁡(xi)−min⁡(xi)\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​)xik​−min(xi​)​

使结果值映射到[0, 1]之间。其中min⁡(xi)\min(\boldsymbol{x}_{i})min(xi​)和max⁡(xi)\max(\boldsymbol{x}_{i})max(xi​)分别是特征xi\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的分布。

对于特征xi\boldsymbol{x}_{ i}xi​,我们先计算它的均值和方差:

μi=1n∑k=1nxik\mu_i=\frac{1}{n} \sum_{k=1}^{n} x_{ik} μi​=n1​k=1∑n​xik​

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

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

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

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

epsilon = 1e-5fig3 = 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)将 XXX 的每一维数据进行零均值化,即每一行的特征值减去这一行的特征均值,结果记为X~\tilde{X}X~ 。

(2)用零均值化后的结果计算协方差矩阵:

Σ=1m(X~−0)(X~−0)T\Sigma=\frac{1}{m} (\tilde{X}-0) (\tilde{X}-0)^{T} Σ=m1​(X~−0)(X~−0)T

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

(3)对协方差矩阵进行特征值分解

Σ=UΛUT\Sigma=U \Lambda U^{T} Σ=UΛUT

(4)对数据进行旋转(投影到主成分轴上,实现了去相关性)

Xrotate=UTXX_{\text {rotate }}=U^{T} X Xrotate​=UTX

(5)让每一维特征上的数据都除以该维特征的标准差(对每一个主成分轴上的数据进行缩放,使其方差为 1)

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

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

综上过程,PCA白化的定义为:

XPCAWhite=Λ−12UTX=[1λ1+ϵ000⋱0001λn+ϵ]UTXrotateX_{\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​=Λ−21​UTX=⎣⎡​λ1​+ϵ​1​00​0⋱0​00λn​+ϵ​1​​⎦⎤​UTXrotate​

数据在经过 PCA 白化以后,其协方差矩阵是一个单位矩阵III,即各维度变得不相关,且每个维度方差都是 1。证明:

ΣPCAwhite=1m(XPCAwhite−0)(XPCAwhite−0)T=Λ−12UT(1mXXT)U(Λ−12)T=Λ−12UTΣUΛ−12=Λ−12(UTU)Λ(UTU)Λ−12=Λ−12IΛIΛ−12=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​(XPCAwhite​−0)(XPCAwhite​−0)T=Λ−21​UT(m1​XXT)U(Λ−21​)T=Λ−21​UTΣUΛ−21​=Λ−21​(UTU)Λ(UTU)Λ−21​=Λ−21​IΛIΛ−21​=I​

ZCA白化

ZCA白化则是在PCA白化基础上,将PCA白化后的数据旋转回到原来的特征空间,这样可以使得变换后的数据更加接近原始输入数据。 ZCA白化的计算公式:

XZCAWhite=UXPCAWhiteX_{\mathrm{ZCAWhite}}=U X_{\mathrm{PCAWhite}} XZCAWhite​=UXPCAWhite​

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

ΣZCAwhite=1mXZCAwhiteXZCAwhiteT=U1mXPCAwhiteXPCAwhiteTUT=UIUT=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​​=m1​XZCAwhite​XZCAwhiteT​=Um1​XPCAwhite​XPCAwhiteT​UT=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] /p/296252799

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

[3]/xufive/article/details/115345361

[4]/hjimce/article/details/50864602

[5] /jiede1/article/details/77039209

[6] /p/414275930

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。