如何反转PCA并从几个主要组成部分重建原始变量?


113

主成分分析(PCA)可用于降维。在执行了这种降维之后,如何从少量的主成分中近似地重构原始变量/特征?

或者,如何从数据中删除或丢弃几个主要成分?

换句话说,如何反转PCA?


鉴于PCA与奇异值分解(SVD)密切相关,可以提出以下相同问题:如何反转SVD?


10
我正在发布此Q&A主题,因为我厌倦了看到很多问题问这个问题,并且由于我们没有关于该主题的规范主题而无法将它们作为重复项关闭。有体面的答案几个类似的主题,但似乎都存在较大的局限性,例如像只关注R.
阿米巴

4
我很感谢所做的努力-我认为迫切需要将有关PCA,它做什么,不做什么的信息收集到一个或几个高质量线程中。我很高兴您自己承担了这个责任!
Sycorax

1
我不相信这种标准答案“清理”能够达到目的。我们这里有一个很好的,通用的问答,但是每个问题对实践中的PCA都有一些微妙的地方,在这里就消失了。从本质上讲,您已经回答了所有问题,对它们进行了PCA,并丢弃了较低的主要部分,有时隐藏了丰富而重要的细节。此外,您已经恢复到教科书线性代数符号而这正是使PCA不透明的很多人,而不是使用休闲统计人员的通用语言,这是R.
托马斯布朗

1
@托马斯谢谢。我认为我们有分歧,很高兴在聊天或Meta中讨论它。非常简短:(1)最好单独回答每个问题,但严酷的现实是它不会发生。就像您可能会回答的那样,许多问题仍然没有答案。(2)这里的社区强烈希望对许多人有用的通用答案;您可以看看哪种答案最受好评。(3)同意数学,但这就是为什么我在这里给出R代码!(4)对通用语言有异议;就我个人而言,我不认识
amoeba

@amoeba恐怕我不知道如何找到所说的聊天,因为我以前从未参加过元讨论。
Thomas Browne

Answers:


146

PCA计算协方差矩阵的特征向量(“主轴”),并按其特征值(解释的方差量)对它们进行排序。然后可以将居中的数据投影到这些主轴上以产生主要成分(“分数”)。出于降维的目的,可以只保留一个主成分子集,而将其余部分丢弃。(请参阅此处以了解外行对PCA的介绍。)

令为数据矩阵,其中行(数据点)和列(变量或特征)。减去平均矢量后从每一行,我们得到的居中数据矩阵。令为我们要使用的某些特征向量的矩阵;这些通常是特征值最大的特征向量。然后,可以简单地通过给出PCA投影的矩阵(“分数”)。 n×pnpXrawn×pnpμXVp×kkkn×kZ=XV

下图对此进行了说明:第一个子图显示了一些居中数据(在链接线程的动画中使用的相同数据)及其在第一个主轴上的投影。第二个子图仅显示此投影的值。维度从两个减少到一个:

在此处输入图片说明

为了能够从该一个主分量重建原始的两个变量,我们可以使用将其映射回维。实际上,每个PC的值都应与投影所用的向量相同。然后比较子图1和3。结果由。我在上面的第三个子图中显示它。为了获得最终的重建,我们需要在其中加上均值向量:pVX^=ZV=XVVX^rawμ

PCA reconstruction=PC scoresEigenvectors+Mean

注意,人们可以直接从第一副区到第三个乘以去与矩阵; 它称为投影矩阵。如果所有的中使用的特征向量,然后是单位矩阵(不执行维数降低,因此,“重建”是完美的)。如果仅使用特征向量的子集,则不是同一性。XVVpVV

这适用于PC空间中的任意点;可以通过映射到原始空间。zx^=zV

丢弃(卸下)领先的PC

有时,人们想要丢弃(删除)一台或几台领先的PC并保留其余的,而不是保留领先的PC并丢弃其余的PC(如上所述)。在这种情况下,所有公式都保持完全相同,但是应该由所有主轴组成,但要丢弃的主轴除外。换句话说,应该始终包括一个人想要保留的所有PC。VV

关于PCA相关性的警告

在相关矩阵(而不是协方差矩阵)上进行PCA时,原始数据不仅以减去为中心, 而且通过将每列除以其标准偏差缩放。在这种情况下,要重建原始数据,需要使用对的列进行缩放,然后才将平均矢量加回去。XrawμσiX^σiμ


图像处理实例

这个主题经常出现在图像处理的背景下。考虑一下Lenna-图像处理文献中的标准图像之一(请单击链接查找其来源)。在左下方,我显示了此图像的灰度变体(可在此处找到文件)。512×512

Lenna图像的两个灰度版本。 右边的一个是粒状的,但绝对可以识别。

我们可以将此灰度图像视为数据矩阵。我对其执行PCA,并使用前50个主要成分计算。结果显示在右侧。512×512XrawX^raw


还原SVD

PCA与奇异值分解(SVD)密切相关,请参阅 SVD与PCA之间的关系。如何使用SVD执行PCA?更多细节。如果将矩阵进行SVD 运算,因为,则选择一个维矢量,它表示“缩减”空间中的点的维度,然后将其映射回维度,则需要将其与相乘。n×pXX=USVkzUkpS1:k,1:kV:,1:k


R,Matlab,Python和Stata中的示例

我将对Fisher Iris数据进行PCA ,然后使用前两个主要成分对其进行重构。我在协方差矩阵上而不是在相关矩阵上进行PCA,即我不在这里缩放变量。但是我仍然必须加平均值。一些软件包,例如Stata,通过标准语法来解决。感谢@StasK和@Kodiologist对代码的帮助。

我们将检查第一个数据点的重构,即:

5.1        3.5         1.4        0.2

Matlab的

load fisheriris
X = 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 = 2
Xhat = 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实例,请参见此答案

蟒蛇

import numpy as np
import sklearn.datasets, sklearn.decomposition

X = sklearn.datasets.load_iris().data
mu = np.mean(X, axis=0)

pca = sklearn.decomposition.PCA()
pca.fit(X)

nComp = 2
Xhat = np.dot(pca.transform(X)[:,:nComp], pca.components_[:nComp,:])
Xhat += mu

print(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
list in 1

  iris   seplen   sepwid   petlen   petwid    _seplen    _sepwid    _petlen    _petwid  
setosa      5.1      3.5      1.4      0.2   5.083039   3.517414   1.403214   .2135317  

1
在MATLAB中,您可以从标准PCA输出中检索mu,还可以提供输入中的组件数。
阿克萨卡尔邦

2
@Aksakal我试图使所有三个代码节选尽可能相似(并且尽可能清晰);特别是,我想在调用pca()之前手动计算,并且还要运行具有所有分量的PCA并在分数和特征向量之间执行点积运算时仅使用分量。我现在修改了Python代码以遵循相同的模式。μnComp
变形虫

3
我将从与该问题的直接答案无关的答案中删除所有内容,例如那个可爱的女孩的图像和图像处理。如果某人对图像不感兴趣,则会使消费困难。记住,问这个问题的人已经很困惑了。
阿克萨卡尔邦

5
兰娜(Lenna)与虹膜一样是标准的数据集。
StasK

2
@amoeba我在谈论边框的大小,位深度甚至黑色像素。我没有确定的版本http://www.ece.rice.edu/~wakin/images/:“似乎有很多版本的Lena(又名“ Lenna”)测试图像可用。Shapiro指出了这个问题。在他的1993年《零树》论文中,到今天仍然令人惊讶地如此”
洛朗·杜瓦尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.