PCA 的成分真的代表方差的百分比吗?它们的总和可以超过 100% 吗?

机器算法验证 r 主成分分析
2022-03-14 02:16:18

O'Reilly 的“黑客机器学习”说,每个主成分代表方差的百分比。我已经引用了下面页面的相关部分(第 8 章,第 207 页)。与另一位专家交谈时,他们同意这是百分比。

然而,这 24 个组件的总和为 133.2095%。怎么可能?

在说服自己可以使用 PCA 之后,我们如何在 R 中做到这一点?同样,这是 R 的亮点:整个 PCA 可以在一行代码中完成。我们使用 princomp 函数来运行 PCA:

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])

如果我们只是在 R 中输入 pca,我们将看到主要组件的快速摘要:

Call:
princomp(x = date.stock.matrix[, 2:ncol(date.stock.matrix)])
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7
29.1001249 20.4403404 12.6726924 11.4636450 8.4963820 8.1969345 5.5438308
Comp.8 Comp.9 Comp.10 Comp.11 Comp.12 Comp.13 Comp.14
5.1300931 4.7786752 4.2575099 3.3050931 2.6197715 2.4986181 2.1746125
Comp.15 Comp.16 Comp.17 Comp.18 Comp.19 Comp.20 Comp.21
1.9469475 1.8706240 1.6984043 1.6344116 1.2327471 1.1280913 0.9877634
Comp.22 Comp.23 Comp.24
0.8583681 0.7390626 0.4347983
24 variables and 2366 observations.

在这个总结中,标准差告诉我们数据集中有多少方差是由不同的主成分解释的。第一个分量称为 Comp.1,占方差的 29%,而下一个分量占 20%。到最后,最后一个组件 Comp.24 占方差的不到 1%。这表明我们可以通过查看第一个主成分来了解很多关于我们的数据的信息。

[代码和数据可以在github上找到。]

3个回答

用于summary.princomp查看“方差比例”和“累积比例”。

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])
summary(pca)

它们的总和应为100 %.

具有协方差矩阵变量随机变量的总方差定义为pXΣ

tr(Σ)=σ11+σ22++σpp.

现在,对称矩阵的是其特征值 因此,如果我们使用来表示 \Sigma 的特征值,总方差为 注意因为协方差矩阵是半正定的,所以总方差是非负的。λ1λ2λp.

tr(Σ)=λ1++λp
λiΣλp0

但是主成分由给出,其中是第个特征向量(标准化为长度为),对应于特征值它的方差是 因此前个主成分组成 的总方差。特别是,时,它们占总方差的eiXeii1λi

Var(eiX)=eiΣei=λieiei=λi
k
(λ1++λkλ1++λp100) %
100 %k=p

这是一些 R 代码来补充以前的答案(pca[["sdev"]]通常是编写pca$sdev的,但它会导致下面的代码段中的格式错误)。

# Generate a dummy dataset.
set.seed(123)
x <- matrix(rnorm(400, sd=3), ncol=4)
# Note that princomp performs an unscaled PCA.
pca1 <- princomp(x)
# Show the fraction variance of each PC.
pca1[["sdev"]]^2
cumsum(pca1[["sdev"]]^2)/sum(pca1[["sdev"]]^2)
# Perform a scaled PCA.
pca2 <- princomp(x, cor=TRUE)
pca2[["sdev"]]^2
cumsum(pca2[["sdev"]]^2)/sum(pca2[["sdev"]]^2)

因此,正如@Max 指出的那样,使用方差而不是标准差并且不要忘记除以总方差可以解决问题。