欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

重新审视PCA

程序员文章站 2022-07-16 18:16:38
...

PCA中的一些简单问题思考

好久没有写博客了,自己将知识记录在了笔记本上,最近又看了之前学过的PCA(主成分分析),有了一些新问题的解决,so,以此记录一下。就不详细介绍原理了,需要的同学可以去看看别的博客,有很多讲的还是很清楚的。这里只要针对下面几个问题来分析,1、投影方向选多少合适;2、为什么数据矩阵要去中心化;3、为什么投影矩阵是正交的;4、投影方差最大和重构误差最小的联系。

一、算法流程

现有m条n维数据,即数据矩阵为:Xn×m,每一列是一个样本。

1、将X的每一行(代表一个属性字段,即特征)进行零均值化——每一个元素减去这一行的均值,形成新的矩阵X¯
2、求出协方差矩阵C=1mX¯X¯TC为实对称矩阵,主对角线的元素为每一特征上的方差,其他元素为特征间的协方差。
3、求出协方差矩阵C的特征值(λ)及其对应的特征向量(w)。
4、将特征向量按对应的特征值大小从左到右按列排列成矩阵,全前k列组成新的投影矩阵Wn×k
5、Yk×m=WTX¯将为k维后的数据矩阵

针对上述计算流程的matlab实现见文章末(第一次看PCA的实现,代码仅作参考)。

二、一些问题的解决与思考

2.1 投影方向选多少合适

正如我们上面的PCA计算流程,将n维的数据降到了k维,也许大家都有这样的疑问,这个k取多少合适呢?我们看刚刚去k个特征向量(投影方向)的方法,由前k个特征值大的特征向量被选取,特征值(λ)的大小实际上就是这个特征所占的重要性(后续2.3节推导中会讲解),因此我们希望前k个特征值的和占总整个特征值的和尽可能大,也就是i=1kλij=1nλj的比值,它可以理解为投影后所保留原有数据信息的比例,当比值为1时,k=n,保留了所有信息,也就没有实现降维。可以发现我们希望k越小越好,比值越大越好,这是两个矛盾点,因此有了一些研究者们的综合经验,让i=1kλij=1nλj0.8即可。

2.2 为什么数据矩阵要去中心化

之前学习中一直是这么理解的,中心化是为了让所有样本在某一特征上的分布拉近在中心点周围,后来的学习中发现,原来从思想的推理上是可以证明的,由于对markdown不是很熟,下面就以手推公式的图片如下展示:
重新审视PCA

2.3 为什么投影矩阵是正交的

对于这个问题,第一次学习PCA时,我感性的认为,就像我们的二维三维坐标系一样,都会是正交的方向来作为我们的空间表示方式,后来在进一步的学习中发现,原来用公式法同样可以证明,这些才想起,妈妈小时告诉我们的:“事情的发生都是有一定科学道理的”,下面就进入科学道理的手推图片证明,如下图所示:
重新审视PCA

以上是通过最大方差(投影后的样本点间的距离最大化)的思想来进行的推导,从推导中我们可以知道特征值与特征向量的由来,因为投影方向就是特征向量,所以他们之间相互正交,即解决了为什么投影方向相互正交的问题,从中也可以明白为什么特征值的大小可以作为某个特征的重要性了吧(特征值某一投影方向对应的方差)!

通过2.2,2.3问题的分析我才发现,那些我们忽略又看似的简单问题,回答起来反而是不容易的。

2.4 投影方差最大和重构误差最小的联系

在2.3节,我们的证明过程,实际上就是投影方差最大方法的证明,下面我们再来看一下重构误差最小的思想:
重新审视PCA

从推导中我们可以看出,两个思想是相互等价的!!!!

三、Matlab代码实现PCA

function [newX,T,meanValue,dummy,newd,order,C,V,D] = MyFirstPca(X,CRate)
%每行是一个样本
%newX  降维后的新矩阵
%T 变换矩阵
%meanValue  X每列均值构成的矩阵,用于将降维后的矩阵newX恢复成X
%CRate 贡献率
%计算中心化样本矩阵
meanValue=ones(size(X,1),1)*mean(X);
X=X-meanValue;%每个维度减去该维度的均值
C=X'*X/(size(X,1)-1);%计算协方差矩阵

%计算特征向量,特征值
[V,D]=eig(C);
%将特征向值按降序排序
[dummy,order]=sort(diag(D),'descend');
V=V(:,order);%将特征向量按照特征值大小进行降序排列
d=diag(D);%将特征值取出,构成一个列向量
newd=d(order);%将特征值构成的列向量按降序排列

%取前n个特征向量,构成变换矩阵
sumd=sum(newd);%特征值之和
for j=1:length(newd)
    i=sum(newd(1:j,1))/sumd;%计算贡献率,贡献率=前n个特征值之和/总特征值之和
    if i>CRate%当贡献率大于95%时循环结束,并记下取多少个特征值
        cols=j;
        break;
    end
end
T=V(:,1:cols);%取前cols个特征向量,构成变换矩阵T
newX=X*T;%用变换矩阵T对X进行降维
end

以上是再次审视PCA时得到的一些分析,肯定会有很多没有想到的地方,欢迎大家一起讨论学习!!!