使用matlab和R计算数据集的PCA,但每个组件获得不同的差异

时间:2018-05-08 14:35:52

标签: r matlab machine-learning bigdata pca

我正在尝试使用PCA可视化5个特色数据集。我正在使用matlab和R.在R中我使用prcomp()命令,在matlab中我使用pca()命令。两者都使用SVD来获得主成分,但是我在matlab和R之间的每个主成分的方差上都有很大差异。在matlab中,我在第一个成分中获得95%的变化,在第二个成分中获得3%的变化,而在R中第一个成分的差异约为42%,第二个成分约为28%。他们怎么变化这么多?

我还可以提一下,我计划稍后将数据用于机器学习模型,并希望使用主要组件来减少维度。我应该使用matlab或R的结果吗?

旁注:我使用fviz_eig()在R中显示每个组件的差异。

编辑:

R代码:

[coeff, score,~,~,var, mean] = pca(dataset,'algorithm','SVD');
bar(var)

Matlab代码:

{{1}}

“数据集”是具有5个要素的csv文件,每个要素包含257493个观测值。

1 个答案:

答案 0 :(得分:1)

正如@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”:

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”。

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"))

enter image description here

带有缩放的prcomp应与Weighted PCA中的matlab类似,其中逆变量差异在执行主成分分析时用作权重。

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

我没有matlab来测试。