r - 使用 matlab 和 R 计算数据集的 PCA,但每个组件的方差不同

标签 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 代码:

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

Matlab代码:

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

“数据集”是一个包含 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

标准差反射(reflect)了变量的不同范围

如果仅将变量居中,则保留方差不变,这通常称为“基于协方差的 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应该类似于matlab中的加权PCA,其中在执行主成分时使用逆变量方差作为权重分析。

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

我没有 matlab 来测试。

关于r - 使用 matlab 和 R 计算数据集的 PCA,但每个组件的方差不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50236177/

相关文章:

r - R可以用于GIS吗?

algorithm - 如何在 Matlab 中使用 Gram-Schmidt 算法生成具有正交行的随机矩阵

matlab - MATLAB 绘图标签/标题中的扩展 ASCII 字符

r - 在 R 中编写自己的 kmeans 算法

r - 旧的 ggplot 脚本给出空白图的问题

r - 根据列中的唯一值在 R 中聚合

matlab - 如何用Matlab立体计算机视觉测量运动物体的距离和质心?

python - Pybrain 神经网络 : _convertToOneOfMany error

function - 有没有一种方法可以更改函数的更新列表,而无需在 Theano 中重新编译它?

R: ggplot2 点范围示例