600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > PCA SVD ZCA白化理论与实现

PCA SVD ZCA白化理论与实现

时间:2024-04-16 20:55:58

相关推荐

PCA SVD ZCA白化理论与实现

简介

UFLDL中介绍了主成分分析这一块的知识,而且当时学机器学习的时候,老师是将PCASVD联系起来将的,同时UFLDL也讲到了使用PCA做数据白化whitening处理,这个词经常在论文里面看到。

国际惯例,参考博客:

UFLDLPCA章节

PRML的第12.1 PCA章节

知乎深入理解PCA与SVD的关系

PCA and SVD explained with numpy

Relationship between SVD and PCA. How to use SVD to perform PCA?

百度百科正交投影

知乎正交投影

SVD(奇异值分解)小结

特征分解

协方差矩阵一定是满秩的吗?

PCA、ZCA白化

PCA理论

PRML中给出了PCA的两种定义:

数据在低维线性空间上的正交投影,这个线性空间被称为主子空间,使得投影数据的方差被最大化平均投影代价最小的线性投影。其中平均投影代价是数据点与投影点之间的平均平方距离。

如下图就是将二维数据投影一维空间u1u_1u1​中

上图中红色的二维数据点被正交投影到主子空间(紫色的线),PCA的目的就是想让投影后的数据(绿色点)具有最大的方差。 其中正交投影被神乎其神的说了一大堆理论,其实就是投影线垂直于投影面。

通常情况下,我们都是用第一个定义去理解PCA的,设每个样本都有D个属性,即D维向量,总共有N个样本。

第一步将数据投影到D维向量u1u_1u1​上,一般来说我们设这个u1u_1u1​是D维空间中的方向向量:

x^=u1Tx\hat{x}=u_1^Tx x^=u1T​x

第二步求投影方差

1N{u1Txn−u1Txˉ}2=u1TSu1\frac{1}{N}\{u_1^Tx_n-u_1^T\bar{x}\}^2=u_1^TSu_1 N1​{u1T​xn​−u1T​xˉ}2=u1T​Su1​

其中xˉ\bar{x}xˉ所有样本均值xˉ=1N∑n=1Nxn\bar{x}=\frac{1}{N}\sum_{n=1}^Nx_nxˉ=N1​∑n=1N​xn​,注意不是每个样本所有属性求均值。

其中SSS是原数据集的协方差矩阵:

S=1N∑n=1N(xn−xˉ)(xn−xˉ)TS=\frac{1}{N}\sum_{n=1}^N(x_n-\bar{x})(x_n-\bar{x})^T S=N1​n=1∑N​(xn​−xˉ)(xn​−xˉ)T

【注】协方差反映的是属性与属性之间的关系,而非样本与样本之间的关系。

第三步约束

上面我们经常约束u1u_1u1​是方向向量,那么

u1Tu1=1u_1^Tu_1=1 u1T​u1​=1

结合这个约束以及为了让方差最大化的目标,可以利用拉格朗日乘数法建立下式:

u1TSu1+λ1(1−u1Tu1)u_1^TSu_1+\lambda_1(1-u_1^Tu_1) u1T​Su1​+λ1​(1−u1T​u1​)

当上式导数为零时,驻点满足

Su1=λ1u1Su_1=\lambda_1u_1 Su1​=λ1​u1​

很容易发现u1u_1u1​一定是SSS的特征向量,同时也能发现当λ1\lambda_1λ1​越大,方差越大。所以最大特征值对应的特征向量为第一主成分。同理就能利用特征分解的方法求解到第二、三、…主分量。

综上,可以得到PCA的一般步骤为:

整理原始矩阵Xn×mX_{n \times m}Xn×m​ ,代表n个样本,每个样本维度为m

求原始矩阵Xn×mX_{n \times m}Xn×m​的协防差阵Sm×m=Cov(X)S_{m\times m}=Cov(X)Sm×m​=Cov(X)

求解协防差阵的特征值和特征向量。

选取最大的K(人为给定)个特征值所对应的特征向量组成构成矩阵Wm×kW_{m\times k}Wm×k​

直接进行矩阵计算,就得到了降维后的数据

Zn×k=Xn×mWm×kZ_{n\times k} = X_{n\times m }W_{m\times k } Zn×k​=Xn×m​Wm×k​

SVD 理论

一般来说实对称矩阵可以被分解为A=Q∑QTA=Q\sum Q^TA=Q∑QT的形式,其中QQQ为标准正交矩阵,∑\sum∑对角阵,对角阵上的元素λi\lambda_iλi​是矩阵A的特征值,对应的特征向量是QiQ_iQi​

那么如果矩阵AAA为非实对称矩阵的时候,有没有类似的

A=UΣVTA=U\Sigma V^T A=UΣVT

奇异值分解(singular value decompositionSVD)做的就是这件事。在SVD的官方术语中,U是(n,n)(n,n)(n,n)维的方阵称为左奇异向量;Σ\SigmaΣ是(n,m)(n,m)(n,m)的对角阵,对角线上的元素称为奇异值;V是(m,m)(m,m)(m,m)维度的方阵称为右奇异向量,并且UV均为单位正交矩阵,UUT=1UU^T=1UUT=1且VVT=1VV^T=1VVT=1

求解方法就是利用AATAA^TAAT与ATAA^TAATA都是对称阵的特性,得到:

AAT=UΣΣTUTATA=VΣTΣVTAA^T=U\Sigma \Sigma ^T U^T \\ A^TA=V\Sigma^T\Sigma V^T AAT=UΣΣTUTATA=VΣTΣVT

这样就能求解出U、Σ\SigmaΣ、V。

这篇文章里面有例子。

PCA和SVD的关系

摘自此处,通过协方差矩阵的求解方法建立联系:

SVD中:

S=ATX=VΣUTUΣVT=VΣ2VT=VΣ2V−1S=A^TX =V\Sigma U^T U\Sigma V^T =V\Sigma ^2V^T =V\Sigma^2V^{-1} S=ATX=VΣUTUΣVT=VΣ2VT=VΣ2V−1

而在PCA中:

S=u1λ1u1−1S=u_1\lambda_1u_1^{-1} S=u1​λ1​u1−1​

所以:

λ=Σ2u=V\lambda=\Sigma^2\\ u=V λ=Σ2u=V

这一点可以通过代码验证:

a=np.array([[1,5,7],[2,3,6],[5,9,3]])C = np.dot(a.T, a)eigen_vals,eigen_vecs = np.linalg.eig(C)u,sigma,v=np.linalg.svd(a,full_matrices=False,compute_uv=True)print(eigen_vals,sigma**2)'''[208.58666048 1.52969164 28.88364788] [208.58666048 28.88364788 1.52969164]'''eigen_vecs'''array([[-0.34088613, -0.85005392, -0.40150339],[-0.72034757, 0.51060491, -0.46944862],[-0.60406625, -0.12919347, 0.78639241]])'''v.T'''array([[-0.34088613, -0.40150339, -0.85005392],[-0.72034757, -0.46944862, 0.51060491],[-0.60406625, 0.78639241, -0.12919347]])'''

使用PCA对mnist数据集降维

其实在这里遇到一个问题:使用eig对手写数字数据集的协方差矩阵求解特征值时得到了复数特征值和特征向量,这一点暂时没弄明白,但是使用svd可以得到正常的特征值和特征向量。

sklearn中的pca

from sklearn.decomposition import PCApca = PCA(n_components=2)result = pca.fit_transform(data)

得到结果图

numpy手撕PCA

def PCA_numpy(X):#零均值化print(X.shape)X=X-X.mean(axis=0)## 使用特征值和特征向量#协方差矩阵#cov_X = np.cov(X,rowvar=0)#每一列一个特征#eig_val,eig_vec = np.linalg.eig(cov_X) #出现复数了##使用svdU,eig_val,eig_vec = np.linalg.svd(X)#选两个最大的idx = np.argsort(-eig_val)temp_M=[]for i in range(2):temp_M.append(eig_vec[idx[i]])temp_M = np.array(temp_M).Tresult = np.dot(X,temp_M)return result

同样得到结果值

这个图里面每个颜色代表手写数字数据集里面的0-9数字。

ZCA白化

UFLDL中还介绍了基于PCA的白化(whitening或者球化sphering)方法,白化的目标有两个:

特征之间具有尽量少的相关性特征具有相同的方差

针对第一个目标,前面的使用PCA降维x=uTxx=u^Txx=uTx已经达到了效果。

针对第二个目标,让每个输入特征值都具有单位方差(unit variance),只需要除以特征值的开根号即可:

xpcai=xiλix_{pcai}=\frac{x_i}{\sqrt{\lambda _i}} xpcai​=λi​​xi​​

降维数据的第i列对应第i个特征值。这时候,数据的协方差就是单位阵,这就是所说的PCA白化(数据的不同成分无联系并且具有单位方差)。

但是我们第二个目标其实是具有相同方差,而具有相同的单位方差并不是唯一的一个情况,也可能是具有相同的非单位方差。在ZCA白化中,又对pca白化做了一次左乘:

xzca=uxpcax_{zca}=ux_{pca} xzca​=uxpca​

这样虽然把方差不再是1了,但是变换后的数据更加接近原始数据。

有一点需要注意:PCA可以用于降维(取前面一部分主成分),但是zca必须保持原有的维度不变,zca只做去相关,不做降维。

后记

这个学习笔记主要是针对机器学习里面常见的降维方法PCA进行剖析和逐步实现,具体代码包括手写数字的读取和最终降维图的画图,请参看公众号简介中的github网址。后续将持续更新其它机器学习理论和算法,敬请关注:

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