使用matlab和R计算数据集的主成分分析,但每个分量的方差不同

使用matlab和R计算数据集的主成分分析,但每个分量的方差不同,r,matlab,machine-learning,bigdata,pca,R,Matlab,Machine Learning,Bigdata,Pca,我正在尝试使用PCA可视化一个5个特征的数据集。我同时使用matlab和R。在R中,我使用prcomp命令,在matlab中,我使用pca命令。两者都使用奇异值分解(SVD)来获得主成分,但我在matlab和R之间的每个主成分的方差都有巨大差异。在matlab中,我在第一个成分中得到95%的方差,在第二个成分中得到3%,而在R中,第一个成分的方差约为42%,第二个成分的方差约为28%。为什么它们变化这么大 我还可以提到,我计划稍后将数据用于机器学习模型,并希望使用主成分来降低维度。我应该使用ma

我正在尝试使用PCA可视化一个5个特征的数据集。我同时使用matlab和R。在R中,我使用prcomp命令,在matlab中,我使用pca命令。两者都使用奇异值分解(SVD)来获得主成分,但我在matlab和R之间的每个主成分的方差都有巨大差异。在matlab中,我在第一个成分中得到95%的方差,在第二个成分中得到3%,而在R中,第一个成分的方差约为42%,第二个成分的方差约为28%。为什么它们变化这么大

我还可以提到,我计划稍后将数据用于机器学习模型,并希望使用主成分来降低维度。我应该使用matlab还是R的结果

旁注:我使用fviz_eig显示R中每个分量的方差

编辑:

R代码:

res.pca <- prcomp(dataset, scale=TRUE)
fviz_eig(res.pca)

数据集是一个csv文件,包含5个要素,每个要素包含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)
如果还将变量标准化为方差=1,这通常称为基于相关性的PCA

pca2 <- prcomp(mat, scale = TRUE)
pca2$sdev
[1] 1.1308637 1.0205627 0.9624318 0.8679425
一幅图像可以表达千言万语:

library(ggbiplot)
library(cowplot)

plot_grid(ggbiplot(pca1),
          ggbiplot(pca2),
          labels = c("not scaled", "scaled"))
具有标度的prcomp应类似于matlab中的加权PCA,在进行主成分分析时,使用逆变量方差作为权重

[coeff,~,latent,~,explained] = pca(dataset,...'VariableWeights','variance')

我没有matlab进行测试。

由于您没有显示代码,有一种可能性:您做得不对。我们无法证明或反驳这一论点。请使用dputdata输出的代码和数据集编辑问题,或者,如果数据集太大,请使用dputheaddata,30。您使用什么参数?例如,您是否指定在这两种情况下居中并缩放数据?正如其他人所说,你需要提供数据和代码。我认为你不需要PCA的5维。大多数分类器应该能够很好地处理它们。我现在已经插入了代码。我知道大多数分类器可以处理5个特征,但这项工作是为了一篇论文,因此我需要与pca和未经pca进行比较。非常感谢!我在没有缩放的情况下尝试了prcomp,得到了与matlab相同的结果。我看到很多人在进行PCA时使用R中的刻度。“为什么有必要?”阿德南·侯赛因很乐意帮忙。看看这两个关于缩放的答案:和。
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"))
[coeff,~,latent,~,explained] = pca(dataset,...'VariableWeights','variance')