关于PCA

PCA(主成分分析)是一种数据降维的方法,通过映射数据到新空间来减少特征维度。首先计算数据的协方差矩阵,接着进行奇异值分解,选取最大的几个特征值对应的特征向量,形成降维后的样本矩阵。MATLAB的princomp函数可用于PCA计算,包括特征向量、特征值、样本得分和降维后的数据。在实际应用中,需根据特征值的阈值选择保留的主成分数量。

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

PCA的理解

刚开始听到PCA时,只知道它讲的是对数据进行降维,还以为是直接去掉一些数据特征;这几天看了下网上各位牛人的博客(http://blog.youkuaiyun.com/abcjennifer/article/details/8002329以及http://blog.youkuaiyun.com/watkinsong/article/details/8234766)后,我才知道原来它只是把原来的数据映射到新的空间中进行表示,即测试样本通过转换,映射到这个空间中进行表示,并没有对原来的数据进行删减。所以我们要保存住这个空间坐标转换矩阵,把测试样本同样地转换到相同的坐标空间中


为了解释PCA的过程,下面引用百度百科里面的解释:

对于一个训练集,100个对象模板,特征是10维,那么它可以建立一个100*10的矩阵,作为样本。求这个样本的协方差矩阵,得到一个10*10的协方差矩阵,然后求出这个协方差矩阵的特征值和特征向量,应该有10个特征值和特征向量,我们根据特征值的大小,取前四个特征值所对应的特征向量,构成一个10*4的矩阵,这个矩阵就是我们要求的特征矩阵,100*10的样本矩阵乘以这个10*4的特征矩阵,就得到了一个100*4的新的降维之后的样本矩阵,每个特征的维数下降了。

对上面的解释进行总结如下(假定数据样本为n×p矩阵,p为维数):
(1)计算协方差矩阵Σ,Σ为一个p×p的实对称矩阵。
这里写图片描述
注意:如果使用matlab自带的cov函数,它会先对x进行去均值操作,即每一列减去该列的均值,详情可参考博客http://blog.youkuaiyun.com/raodotcong/article/details/5941602
(2)根据SVD求取特征值和特征向量
这里写图片描述
其中,svd为奇异值分解(singular value decomposition),在matlab中有函数[U,S,V] = svd(A) 返回一个与A同大小的对角矩阵S(由Σ的特征值组成),两个酉矩阵U和V,且满足= U*S*V’。若A为m×n阵,则U为m×m阵,V为n×n阵。奇异值在S的对角线上,非负且按降序排列。
那么对于方阵Σ呢,由于方阵的SVD相当于特征值分解,所以事实上U = V, 即Σ = U*S*U’。U是特征向量组成的p×p的正交矩阵,即每一列就是一个特征向量;S是由特征值组成的p×p的对角矩阵且特征值按降序排列。
(3)选择k个分量,即取U中的前K个特征向量作为U,此时的U为一个p×k的矩阵。
注意这里涉及到K的选择,我们一般选择的K必须满足下面条件:
这里写图片描述
其中这里写图片描述为(2)中S对角线上的第i个值,threshold为设定的阈值。
(4)利用U对数据进行降维
例如给定一个实例这里写图片描述为1×p的向量,将其降维到(1×p)×(p×k)=1×k维向量。
这里写图片描述
那如果想恢复原数据呢??
这里写图片描述
注意这里算出的x(approx)并不是原先的x,而是向量x的近似值,因为在求解的过程中进行的是伪求逆操作(等式的两边左乘U的逆,(2)提到的U是一个正交矩阵,则U的逆即为U的转置,但是这里的U已经是一个n×p的矩阵,不存在逆,所以称为伪求逆)。


例子

使用matlab自带的princomp()函数,使用格式如下:
(1)[COEFF,SCORE] = princomp(X)
(2)[COEFF,SCORE,latent] = princomp(X)
(3)[COEFF,SCORE,latent,tsquare] = princomp(X)
(4)[…] = princomp(X,’econ’)
其中X为n×p的矩阵;COEFF是X矩阵所对应的协方差矩阵的所有特征向量组成的p×p的矩阵,即变换矩阵或称投影矩阵,COEFF每列对应一个特征值的特征向量,列的排列顺序是按特征值的大小递减排序;SCORE是对主分的打分,也就是说原X矩阵在主成分空间的表示。SCORE每行对应样本观测值,每列对应一个主成份(变量),它的行和列的数目和X的行列数目相同;返回的latent是一个向量,它是X所对应的协方差矩阵的特征值向量;tsquare表示对每个样本点Hotelling的T方统计量。当维数p超过样本个数n的时候,用[…] = princomp(X,’econ’)来计算,这样会显著提高计算速度。

  1. 步骤一,求特征向量和特征值
load hald; %载入matlab内部数据
[pc,score,latent,tsquare]= princomp(ingredients); %调用pca分析函数,其中ingredients为13×4的矩阵

得到pc、score、latent的值如下所示:
这里写图片描述
这里写图片描述
这里写图片描述
到目前为止,实现的是PCA过程中的(1)和(2),pc为协方差矩阵对应的特征向量矩阵,latent为特征值矩阵。
下面我们对上述结果进行验证:

ingre_cov=cov(ingredients);
[U,S,V] = svd(ingre_cov)

结果如下:
这里写图片描述
由图可知U=V=pc,S中的特征值跟latent的值相同。
2. 步骤二,选择k个分量

cumsum(latent)./sum(latent) %consum(A)返回与A同型的和矩阵

结果:
这里写图片描述
由PCA过程(3)中k的选择条件知,如果阈值为0.05,则k可以取值为2,即取pc中的前两列。

tranMatrix = pc(:,1:2)

这里的 tranMatrix 即PCA过程(4)中的U矩阵。
3. 对样本进行降维,获取主成分表示

 myscore=ingredients*tranMatrix

结果:
这里写图片描述
跟princomp()函数得到的score进行对比:
这里写图片描述
发现不一样,这是为什么呢?
原因是matlab中的princomp()函数在计算PCA的时候,自动对样本的列进行了去均值的操作(每列数都减去该列的均值)
我们可以验证:

 x=ingredients;
 x0 = bsxfun(@minus,x,mean(x,1)); %去均值操作
 myscore = x0 * pc;  %矩阵变换

结果:
这里写图片描述
这时得到的主成分跟matlab中的princomp()函数得到的是一样的了。
我们的目标是用前2(也就是K)个主成分来表示原来的样本,所以我们只需要前两列即可。

z=score(:,1:2);
或者 z= x0 * tranMatrix ;

结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值