PCA计算协方差矩阵的特征向量(“主轴”),并按其特征值(解释的方差量)对它们进行排序。然后可以将居中的数据投影到这些主轴上以产生主要成分(“分数”)。出于降维的目的,可以只保留一个主成分子集,而将其余部分丢弃。(请参阅此处以了解外行对PCA的介绍。)
令为数据矩阵,其中行(数据点)和列(变量或特征)。减去平均矢量后从每一行,我们得到的居中数据矩阵。令为我们要使用的某些特征向量的矩阵;这些通常是特征值最大的特征向量。然后,可以简单地通过给出PCA投影的矩阵(“分数”)。n×pnpXrawXrawn×pn×pnnppμμXXVVp×kp×kkkkkn×kn×kZ=XVZ=XV
下图对此进行了说明:第一个子图显示了一些居中数据(在链接线程的动画中使用的相同数据)及其在第一个主轴上的投影。第二个子图仅显示此投影的值。维度从两个减少到一个:
为了能够从该一个主分量重建原始的两个变量,我们可以使用将其映射回维。实际上,每个PC的值都应与投影所用的向量相同。然后比较子图1和3。结果由。我在上面的第三个子图中显示它。为了获得最终的重建,我们需要在其中加上均值向量:ppV⊤V⊤X^=ZV⊤=XVV⊤X^=ZV⊤=XVV⊤X^rawX^rawμμ
PCA reconstruction=PC scores⋅Eigenvectors⊤+MeanPCA reconstruction=PC scores⋅Eigenvectors⊤+Mean
注意,人们可以直接从第一副区到第三个乘以去与矩阵; 它称为投影矩阵。如果所有的中使用的特征向量,然后是单位矩阵(不执行维数降低,因此,“重建”是完美的)。如果仅使用特征向量的子集,则不是同一性。XXVV⊤VV⊤ppVV⊤VV⊤
这适用于PC空间中的任意点;可以通过映射到原始空间。zzx^=zV⊤x^=zV⊤
丢弃(卸下)领先的PC
有时,人们想要丢弃(删除)一台或几台领先的PC并保留其余的,而不是保留领先的PC并丢弃其余的PC(如上所述)。在这种情况下,所有公式都保持完全相同,但是应该由所有主轴组成,但要丢弃的主轴除外。换句话说,应该始终包括一个人想要保留的所有PC。VVVV
关于PCA相关性的警告
当在相关矩阵(而不是协方差矩阵)上进行PCA时,原始数据不仅以减去为中心, 而且通过将每列除以其标准偏差缩放。在这种情况下,要重建原始数据,需要使用对的列进行缩放,然后才将平均矢量加回去。XrawXrawμμσiσiX^X^σiσiμμ
图像处理实例
这个主题经常出现在图像处理的背景下。考虑一下Lenna-图像处理文献中的标准图像之一(请单击链接查找其来源)。在左下方,我显示了此图像的灰度变体(可在此处找到文件)。512×512512×512
我们可以将此灰度图像视为数据矩阵。我对其执行PCA,并使用前50个主要成分计算。结果显示在右侧。512×512512×512XrawXrawX^rawX^raw
还原SVD
PCA与奇异值分解(SVD)密切相关,请参阅
SVD与PCA之间的关系。如何使用SVD执行PCA?更多细节。如果将矩阵进行SVD 运算,因为,则选择一个维矢量,它表示“缩减”空间中的点的维度,然后将其映射回维度,则需要将其与相乘。n×pn×pXXX=USV⊤X=USV⊤kkzzUUkkppS⊤1:k,1:kV⊤:,1:kS1:k,1:k⊤V:,1:k⊤
R,Matlab,Python和Stata中的示例
我将对Fisher Iris数据进行PCA ,然后使用前两个主要成分对其进行重构。我在协方差矩阵上而不是在相关矩阵上进行PCA,即我不在这里缩放变量。但是我仍然必须加平均值。一些软件包,例如Stata,通过标准语法来解决。感谢@StasK和@Kodiologist对代码的帮助。
我们将检查第一个数据点的重构,即:
5.1 3.5 1.4 0.2
Matlab的
load fisheririsX=meas;mu=mean(X);[eigenvectors,scores]=pca(X);nComp=2;Xhat=scores(:,1:nComp)*eigenvectors(:,1:nComp)';Xhat=bsxfun(@plus,Xhat,mu);Xhat(1,:)
输出:
5.083 3.5174 1.4032 0.21353
[R
X=iris[,1:4]mu=colMeans(X)Xpca=prcomp(X)nComp=2Xhat=Xpca$x[,1:nComp]%*%t(Xpca$rotation[,1:nComp])Xhat=scale(Xhat,center=-mu,scale=FALSE)Xhat[1,]
输出:
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.0830390 3.5174139 1.4032137 0.2135317
对于PCA重建图像的R实例,请参见此答案。
蟒蛇
importnumpyasnpimportsklearn.datasets,sklearn.decomposition
X=sklearn.datasets.load_iris().data
mu=np.mean(X,axis=0)pca=sklearn.decomposition.PCA()pca.fit(X)nComp=2Xhat=np.dot(pca.transform(X)[:,:nComp],pca.components_[:nComp,:])Xhat+=muprint(Xhat[0,])
输出:
[ 5.08718247 3.51315614 1.4020428 0.21105556]
请注意,这与其他语言的结果略有不同。那是因为Python的Iris数据集版本包含errors。
斯塔塔
webuse iris,clear
pca sep*pet*,components(2)covariance
predict _seplen _sepwid _petlen _petwid,fit
listin1iris seplen sepwid petlen petwid _seplen _sepwid _petlen _petwid
setosa5.13.51.40.25.0830393.5174141.403214.2135317