主成分分析(PCA)可用于降维。在执行了这种降维之后,如何从少量的主成分中近似地重构原始变量/特征?
或者,如何从数据中删除或丢弃几个主要成分?
换句话说,如何反转PCA?
鉴于PCA与奇异值分解(SVD)密切相关,可以提出以下相同问题:如何反转SVD?
主成分分析(PCA)可用于降维。在执行了这种降维之后,如何从少量的主成分中近似地重构原始变量/特征?
或者,如何从数据中删除或丢弃几个主要成分?
换句话说,如何反转PCA?
鉴于PCA与奇异值分解(SVD)密切相关,可以提出以下相同问题:如何反转SVD?
Answers:
PCA计算协方差矩阵的特征向量(“主轴”),并按其特征值(解释的方差量)对它们进行排序。然后可以将居中的数据投影到这些主轴上以产生主要成分(“分数”)。出于降维的目的,可以只保留一个主成分子集,而将其余部分丢弃。(请参阅此处以了解外行对PCA的介绍。)
令为数据矩阵,其中行(数据点)和列(变量或特征)。减去平均矢量后从每一行,我们得到的居中数据矩阵。令为我们要使用的某些特征向量的矩阵;这些通常是特征值最大的特征向量。然后,可以简单地通过给出PCA投影的矩阵(“分数”)。 n×pnp
下图对此进行了说明:第一个子图显示了一些居中数据(在链接线程的动画中使用的相同数据)及其在第一个主轴上的投影。第二个子图仅显示此投影的值。维度从两个减少到一个:
为了能够从该一个主分量重建原始的两个变量,我们可以使用将其映射回维。实际上,每个PC的值都应与投影所用的向量相同。然后比较子图1和3。结果由。我在上面的第三个子图中显示它。为了获得最终的重建,我们需要在其中加上均值向量:
注意,人们可以直接从第一副区到第三个乘以去与矩阵; 它称为投影矩阵。如果所有的中使用的特征向量,然后是单位矩阵(不执行维数降低,因此,“重建”是完美的)。如果仅使用特征向量的子集,则不是同一性。
这适用于PC空间中的任意点;可以通过映射到原始空间。
丢弃(卸下)领先的PC
有时,人们想要丢弃(删除)一台或几台领先的PC并保留其余的,而不是保留领先的PC并丢弃其余的PC(如上所述)。在这种情况下,所有公式都保持完全相同,但是应该由所有主轴组成,但要丢弃的主轴除外。换句话说,应该始终包括一个人想要保留的所有PC。
关于PCA相关性的警告
当在相关矩阵(而不是协方差矩阵)上进行PCA时,原始数据不仅以减去为中心, 而且通过将每列除以其标准偏差缩放。在这种情况下,要重建原始数据,需要使用对的列进行缩放,然后才将平均矢量加回去。
这个主题经常出现在图像处理的背景下。考虑一下Lenna-图像处理文献中的标准图像之一(请单击链接查找其来源)。在左下方,我显示了此图像的灰度变体(可在此处找到文件)。
我们可以将此灰度图像视为数据矩阵。我对其执行PCA,并使用前50个主要成分计算。结果显示在右侧。
PCA与奇异值分解(SVD)密切相关,请参阅 SVD与PCA之间的关系。如何使用SVD执行PCA?更多细节。如果将矩阵进行SVD 运算,因为,则选择一个维矢量,它表示“缩减”空间中的点的维度,然后将其映射回维度,则需要将其与相乘。
我将对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
nComp