主成分分析理论与MATLAB实现示例

本文详细介绍了主成分分析(PCA)的基本思想和方法,强调PCA通过线性变换寻找数据的主要成分。文章通过解答如何描述信息、变换方式及最大化信息的问题,阐述PCA的优化过程。并提供了一个MATLAB实现PCA的实例,展示了PCA如何从高维数据中提取主要特征。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主成分分析理论与MATLAB实现示例

2017.9.3
关于主成分分析,其实还是比较简单的,但是感觉网上的资料对于理论上的分析有些欠缺,这里自己整理一下,依然是追求严谨完整,另外再加上一个自己练习的示例。

1.基本思想

现实中的数据常常会以高维数据的形式出现。举个简单的例子:对于平面上一条过原点斜线上的一些点,一般地我们需要它的(x,y)坐标来描述,但是实际上对于这个数据结构,我们只要知道点在斜线上的位置,比如到原点的距离,就可以间接地确定点的坐标。事实上,上面的过程就把二维的数据(x,y)转变为了一维(点到原点的距离)。对于有几百上千个分量的数据,我们同样可以通过选取某些“主成分”来代表这些高维数据,自然地我们希望这些主成分能够尽可能多的表示出原本数据的信息。

2.方法

接着上面的思想,我们将面对三个问题:

  • 1.如何描述变换后前数据承载的信息?
  • 2.将高维坐标变换成主成分坐标应该是怎样一种变换?
  • 3.如何使得主成分能尽可能多的代表原来数据的信息?

1:当数据很集中时,比如说都在一个点的小邻域内,数据之间差别很小,此时的数据除了体现出一个总体趋势(均值)外,没有产生其他信息,而如果数据是分散开的,那么就认为它带来了较多的信息。因此在主成分分析中,我们选取数据的方差来表示所携带的信息量。此外方差还有一个性质:数据的方差等于数据每个坐标上的方差之和。
2:无疑,对一组坐标进行变换有很多种方法,主成分分析提供的便是最常见的线性变换,各个主成分也就是变换后的坐标。进一步地,我们希望不同的“主成分”代表不同的信息,或者说,他们之间是“无关的”,即各个坐标的变换之间是相互正交的。到这里,我们很容易想到正交变换,正交变换除了能满足上面的要求时,还保持了变换前后方差不变(这是因为方差依赖于距离,而正交变换是保距离的),因此正交变换是一个十分合理的选择。
3:在第一个问题中我们就指出了,我们选取方差作为信息的度量,因此,要尽可能多的获得信息,换成数学语言,就是如下的优化问题:
设我们有数据Xi=(Xi(0),,Xi(m))Rm, i=1,,nX=(X1;;Xn)Rnm,最大化方差:

max|P|=1   i=1n(PXTiPX¯¯¯¯¯¯¯¯)2/(n1)

其中|P|=1是正交变换的要求,P就是从原坐标变换到新的第一个坐标的变换系数。如果我们提前为了便捷起见,将数据减去均值Xi:=XiX¯¯¯处理,这样就成了
max|P|=1   i=1n(PXTi)2/(n1)=i=1nP(XTiXi)PT/(n1)=P(i=1nXTiXi)PT/(n1)=PAPT
其中A=(ni=1XTiXi)/(n1),其实它就是(X(:,1),,X(:,m))协方差矩阵X中一行代表一个样本此处是取各列),这个结果用定义就可以验证。于是我们的优化最终化为:
max|P|=1  PAPT
A矩阵是上述的协方差矩阵。
这是一个很常规的条件极值问题,我们可以用Lagrange乘子法进行求解:

  • 首先,由于|P|=1约束,我们有
    maxpD   PAPT
    其中D={P|PPT=1}是一个有界闭集,因此根据连续性我们知道优化的最优解存在且最优值可达,记解为P1,并且P1APT1=infpD   PAPT
    我们写出其拉格朗日函数
    L(P,λ)=PAPT+λ(1PPT)
    P1,应该有:
    L(P1,λ)=0
    得到
    2APT12λPT1=0APT1=λPT1

    由于P1PT1=1,所以
    P1APT1=λ
    并且λ是矩阵A的特征值,P1是其对应的特征向量。而由于矩阵A是一个协方差矩阵,所以它是对称的,所以它的特征值是实数,不妨设全体特征值为λ1<<λk,分别对应重述l1,,lk,于是我们此时应该取最大的特征值λk。也就是P1APT1=infpDPAPT=λkP1λk对应的特征向量。
    我们已经完成了前lk个主成分的选择(λk对应lk个相互正交的特征值),接下来便是在已经选择的主成分构成子空间外垂直的空间中进行优化(这是正交的要求)
    maxPEλk  |P|=1  PAPT
    同样开可以得到此时最优值为λk1,以此类推。最终得到P1,,Pm我们最终的变换就是
    Fj=i=1mPj(i)x(i)   j=1,,m
    也就是从坐标(x(1),,x(m))变换为(F(1),,F(m))

    现在为止,我们已经回答了之前提出的三个问题,此时实际上我们已经得到了主成分分析的算法流程。
    但是有一点需要注意,主成分分析对数据的尺度是敏感的,换句话说,我们如果对数据进行放缩会显著影响到我们最后的结果,因此,一般说法是,为了消除单位带来的差异,我们可以选择在对数据做预处理是不仅减去均值,还除以每个坐标上的标准差已消除单位带来的偏差:

    Xi(j):=Xi(j)X¯¯¯(j)std(X(:,j))

    MATLAB实例与测试

    a=imread('1.jpg');
    b=imread('2.jpg');
    c=imread('3.jpg');
    d=imread('4.jpg');
    a=imresize(a,0.01);
    b=imresize(b,0.01);
    c=imresize(c,0.01);
    d=imresize(d,0.01);
    e=rgb2gray(a);
    f=rgb2gray(b);
    g=rgb2gray(c);
    h=rgb2gray(d);
    g1=e(:);
    g2=f(:);
    g3=g(:);
    g4=h(:);
    g1=double(g1);
    g2=double(g2);
    g3=double(g3);
    g4=double(g4);
    av=(g1+g2+g3+g4)/4;
    G=[g1,g2,g3,g4]-repmat(av,1,4);
    mat=cov(G');
    [V,D]=eig(mat);
    subplot(2,2,2);imshow(uint8(reshape(av+V(:,end)*    (g1-av)'*V(:,end),42,24)));
    title('第一主成分')
    subplot(2,2,3);imshow(uint8(reshape(av+V(:,end-1)*(g1-av)'*V(:,end-1),42,24)));
    title('第二主成分')
    subplot(2,2,4);imshow(uint8(reshape(av+V(:,end-2)*(g1-av)'*V(:,end-2),42,24)));
    title('第三主成分')
    subplot(2,2,1);imshow(e)
    title('原图')
    

    这里写图片描述

    (你没看错这就是我的手2333)
    上面第一个的是输入的图片,下面的是前三个主成分,可以看到这从生成的三幅图里仍然能看出原图的大体样子,他们的方差贡献分别为0.5836,0.28580.1306
    事实上,因为这个实例中样本数据很少(4个),因此用PCA意义不大,仅仅作为一个例子展示。可以证明,对于落在m维空间中的n(nm)个点(减去均值),那么仅有n1个主成分对应的λ(或方差)不为零,即用n1个坐标就可以完全描述原来的数据,此时PCA可以说是没有什么意义了。,例如三维空间中的两个点,我们在做减去均值处理后,就可以选择一条空间直线穿过这两个点。我们面对的应当是在空间中大量的存在一定结构的数据。
    主成分全部计入后就可以得到原来数据

    subplot(2,1,2);imshow(uint8(reshape(av+V(:,end-1)*(g1-av)'*V(:,end-1)+V(:,end-2)*(g1-av)'*V(:,end-2)+V(:,end)*(g1-av)'*V(:,end),42,24)));
    title('三个主成分的叠加')
    subplot(2,1,1);imshow(e)
    title('原图')
    

    这里写图片描述
    可以看到和原图是完全相同了。
    我用的图片是压缩了100倍后得到的,所以图片不是很清晰,否则太高的清晰度我是等不及电脑去计算太大的矩阵的特征值和特征向量。

    个人博客,请勿转载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值