PCA原理理解记录

2019-07-14 11:23发布

以前对主成分分析PCA(Principal Component Analysis)总是似懂非懂,也因此只会拿来用,但心里没底气深入地跟人交流自己对PCA的理解。最近总算是下定决心搞懂了PCA的原理由来以及推导证明了,让我用C++程序实现也有底气了。
现在给定一堆数据集是n个p维的向量。有时候为了更好的分析,我们希望能对它进行降维(这只是拿来举例,一开始可能只是想要更好地重组这个数据)。这些数据是p维的向量,我们想要把它降到低维度的空间去。      
投影的方式原理
一个最简单的方式就是投影,选定任意某个p维向量Y0,将这n个向量都投影到Y0上去,实际就是分别都作个内积,最终结果就是变为n个数。 选择多少个投影方向,那么就有多少种结果,将这些结果组合一下,就是所要求得的低维空间。 其实上面的投影方法就是对数据进行线性变换,线性变换矩阵是正交矩阵,正交矩阵的每一列就是要投影的方向对应的向量,p维空间的基向量组线性无关的最多取p个。   也就是说,变换矩阵里取多少个向量,就投影到多少维空间。 总而言之,对原数据进行变换的方式有无数种,而PCA就是其中一种。
选取准则,信息
前面说了投影的方式原理,并且有无数种方式,因此应该选取哪一种,即选取准则。选取准则里有一种就是想  尽可能保留更多的信息,因此,需要弄清楚信息的定义不同的方法对 信息的定义不同,比如,PCA认为要保留的信息是   数据之间的方差,因此就有了PCA这个方法。  还有一种降维度的方法是LDA fisher方法,它的目的或者说保留的信息是,极小化类内方差,极大化类间方差。  也就是说对信息的不同定义,不同假设,造就了不同的数据处理降维方法。
PCA的原理 前面已经说了,PCA的目标就是 保留数据的方差。方差的一系列公式网上资料都有,我就直接贴推导了。  设X为原数据,X为 n X p维矩阵,那么由投影后的数据方差极大化公式我们可以得到:                             上面的方差公式少了减去平均值操作,我的理解是,其推导不严谨,省去了一部分步骤。省去的步骤是 将公式中的 减去均值操作 进行变量替换,从而可以将这个操作提前,也就是假设条件中的X必须每一列都中心化。    这也是PCA算法第一步的归一化的由来。

根据推导证明,投影方向只要取 证明中的矩阵 的特征值绝对值比较大 的特征向量方向即可。   该矩阵即为协方差矩阵,这也是PCA方法中为什么出现协方差矩阵,并且涉及到求特征向量的步骤的原因。
证明最后结论表明,只要做个特征值分解,求出特征向量,组合一下就得到了最终要求的 PCA的投影矩阵。


上面搞定了原理,虽然已经可以了。 不过还是做个PCA步骤总结记录。如下:
X为n*p的矩阵。 很简单,直接对X求个协方差矩阵,然后求协方差矩阵的特征值特征向量即为投影方向,设所有特征向量按每一列一个特征向量排列成P,即投影矩阵。求得 X*P即为降维后的数据。   协方差矩阵求法:点击打开链接

如果是Matlab,直接调用PCA函数即可。





总结一下, PCA其实就是对原始数据进行某种线性变换,然后将某些分量抛弃。。。就这么简单。。。


竟然没有记住这么有用的一个性质!以下性质特别重要!
假如我们的数据按行存放,A是N*n的矩阵,n>>N,N是样本个数,n是维数,则协方差矩阵应该是A'A,A'A是n*n维的一个矩阵,这个矩阵非常大,不利于求特征值和特征向量,所以先求AA'的特征值,它是一个N*N维的矩阵。 由矩阵性质,AA'的特征值就是A'A的特征值。下面推导A'A的特征向量和AA'的特征向量的关系。     B = A'A; B*x=b*x; C = AA'; C*y=c*y -> AA'*y=c*y -> A'A*(A'*y)=c*(A'*y) -> c = b, x=A'*y 所以根据AA'的特征向量y可以算出A'A的特征向量x。
上面的证明还要补充一个,那就是正向反向均能推到一遍,即y与x的关系,以及x与y的关系。并且还有当由x到y时,当x对应特征值不是零时,由于x不是0向量,所以相对应的y不可能为0向量,否则与已知条件矛盾。   最后结论,AA'与A'A的非零特征值对应的特征向量互相一一对应,而0特征值对应的特征向量则可能转换后变为0向量,是否一定会变成0向量,暂时还没证明出来,也许不是一定。     
证明过程让我联想到了 奇异值的性质,等下看看。