使用 matlab 和 R 计算数据集的 PCA,但每个组件的方差不同
Calculating PCA of a dataset using both matlab and R but getting different variances per component
我正在尝试使用 PCA 可视化包含 5 个特征的数据集。我同时使用 matlab 和 R。在 R 中我使用 prcomp() 命令,在 matlab 中我使用 pca() 命令。两者都使用 SVD 来获得主要成分,但我在 matlab 和 R 之间的每个主要成分中得到了巨大的方差差异。在 matlab 中,我在第一个成分中获得 95% 的方差,在第二个成分中获得 3%,而在 R 中第一个组件的方差约为 42%,第二个组件的方差约为 28%。他们怎么相差这么多?
我还可以提一下,我计划稍后将数据用于机器学习模型,并希望使用主成分来降低维度。我应该使用 matlab 还是 R 的结果?
旁注:我在 R 中使用 fviz_eig() 显示每个组件的方差。
编辑:
R代码:
res.pca <- prcomp(dataset, scale=TRUE)
fviz_eig(res.pca)
Matlab代码:
[coeff, score,~,~,var, mean] = pca(dataset,'algorithm','SVD');
bar(var)
"dataset" 是一个包含 5 个特征的 csv 文件,每个特征包含 257493 个观察值。
正如@Lyngbakr 在评论中指出的,观察到的差异的可能原因是您在 R 代码中而不是在 matlab 代码中指定了要缩放的变量。
这是 R 中的一个例子:
生成不同幅度的变量(不同幅度的随机均匀噪声):
x1 <- runif(100, 200, 500)
x2 <- runif(100, 20, 50)
x3 <- runif(100, 2, 5)
x4 <- runif(100, 0.2, 0.5)
mat <- cbind(x1, x2, x3, x4)
在不缩放的情况下进行 PCA:
pca1 <- prcomp(mat)
pca1$sdev
[1] 80.27564312 8.15330049 0.82751057 0.08491903
标准差反映了变量的不同范围
如果你只对变量进行中心化,让方差保持原样,这通常被称为"PCA based on covariances":
cov(mat)
x1 x2 x3 x4
x1 6444.144562 11.149336032 9.70055864 -1.191862833
x2 11.149336 66.495763487 0.06598063 -0.001822713
x3 9.700559 0.065980626 0.69928547 0.007559200
x4 -1.191863 -0.001822713 0.00755920 0.007560817
如果你也将变量标准化为方差=1,这通常被称为"PCA based on correlations"。
pca2 <- prcomp(mat, scale = TRUE)
pca2$sdev
[1] 1.1308637 1.0205627 0.9624318 0.8679425
对数据进行缩放后,主成分的标准差说明了不同的情况。
cov(scale(mat))
x1 x2 x3 x4
x1 1.00000000 0.017032146 0.144506324 -0.170749431
x2 0.01703215 1.000000000 0.009675918 -0.002570615
x3 0.14450632 0.009675918 1.000000000 0.103959503
x4 -0.17074943 -0.002570615 0.103959503 1.000000000
all.equal(cov(scale(mat)), cor(mat))
[1] TRUE
一张图说一千个字:
library(ggbiplot)
library(cowplot)
plot_grid(ggbiplot(pca1),
ggbiplot(pca2),
labels = c("not scaled", "scaled"))
带缩放的 prcomp
应该类似于 matlab
中的 Weighted PCA
,其中在执行主成分分析时使用逆变量方差作为权重。
[coeff,~,latent,~,explained] = pca(dataset,...'VariableWeights','variance')
我没有matlab来测试。
我正在尝试使用 PCA 可视化包含 5 个特征的数据集。我同时使用 matlab 和 R。在 R 中我使用 prcomp() 命令,在 matlab 中我使用 pca() 命令。两者都使用 SVD 来获得主要成分,但我在 matlab 和 R 之间的每个主要成分中得到了巨大的方差差异。在 matlab 中,我在第一个成分中获得 95% 的方差,在第二个成分中获得 3%,而在 R 中第一个组件的方差约为 42%,第二个组件的方差约为 28%。他们怎么相差这么多?
我还可以提一下,我计划稍后将数据用于机器学习模型,并希望使用主成分来降低维度。我应该使用 matlab 还是 R 的结果?
旁注:我在 R 中使用 fviz_eig() 显示每个组件的方差。
编辑:
R代码:
res.pca <- prcomp(dataset, scale=TRUE)
fviz_eig(res.pca)
Matlab代码:
[coeff, score,~,~,var, mean] = pca(dataset,'algorithm','SVD');
bar(var)
"dataset" 是一个包含 5 个特征的 csv 文件,每个特征包含 257493 个观察值。
正如@Lyngbakr 在评论中指出的,观察到的差异的可能原因是您在 R 代码中而不是在 matlab 代码中指定了要缩放的变量。
这是 R 中的一个例子:
生成不同幅度的变量(不同幅度的随机均匀噪声):
x1 <- runif(100, 200, 500)
x2 <- runif(100, 20, 50)
x3 <- runif(100, 2, 5)
x4 <- runif(100, 0.2, 0.5)
mat <- cbind(x1, x2, x3, x4)
在不缩放的情况下进行 PCA:
pca1 <- prcomp(mat)
pca1$sdev
[1] 80.27564312 8.15330049 0.82751057 0.08491903
标准差反映了变量的不同范围
如果你只对变量进行中心化,让方差保持原样,这通常被称为"PCA based on covariances":
cov(mat)
x1 x2 x3 x4
x1 6444.144562 11.149336032 9.70055864 -1.191862833
x2 11.149336 66.495763487 0.06598063 -0.001822713
x3 9.700559 0.065980626 0.69928547 0.007559200
x4 -1.191863 -0.001822713 0.00755920 0.007560817
如果你也将变量标准化为方差=1,这通常被称为"PCA based on correlations"。
pca2 <- prcomp(mat, scale = TRUE)
pca2$sdev
[1] 1.1308637 1.0205627 0.9624318 0.8679425
对数据进行缩放后,主成分的标准差说明了不同的情况。
cov(scale(mat))
x1 x2 x3 x4
x1 1.00000000 0.017032146 0.144506324 -0.170749431
x2 0.01703215 1.000000000 0.009675918 -0.002570615
x3 0.14450632 0.009675918 1.000000000 0.103959503
x4 -0.17074943 -0.002570615 0.103959503 1.000000000
all.equal(cov(scale(mat)), cor(mat))
[1] TRUE
一张图说一千个字:
library(ggbiplot)
library(cowplot)
plot_grid(ggbiplot(pca1),
ggbiplot(pca2),
labels = c("not scaled", "scaled"))
带缩放的 prcomp
应该类似于 matlab
中的 Weighted PCA
,其中在执行主成分分析时使用逆变量方差作为权重。
[coeff,~,latent,~,explained] = pca(dataset,...'VariableWeights','variance')
我没有matlab来测试。