Matlab:如何在matlab中使用PCA找到数据集中的哪些变量?

agn*_*zka 7 matlab pca princomp

我正在使用PCA来找出我的数据集中哪些变量是冗余的,因为它与其他变量高度相关.我在以前使用zscore标准化的数据上使用princomp matlab函数:

[coeff, PC, eigenvalues] = princomp(zscore(x))
Run Code Online (Sandbox Code Playgroud)

我知道特征值告诉我数据集的变化覆盖了每个主成分,并且该系数告诉我第i个原始变量中有多少是第j个主成分(其中i - 行,j - 列).

所以,我认为找出哪些变量出原始数据集是最重要的,这是我至少应该乘以系数_用矩阵的特征值 - _系数的值表示多少每个变量的每个组件都有和特征值告诉这有多重要组成部分是.所以这是我的完整代码:

[coeff, PC, eigenvalues] = princomp(zscore(x));
e = eigenvalues./sum(eigenvalues);
abs(coeff)/e
Run Code Online (Sandbox Code Playgroud)

但这并没有真正显示任何东西 - 我在下面的集合中尝试了它,其中变量1与变量2完全相关(v2 = v1 + 2):

     v1    v2    v3
     1     3     4
     2     4    -1
     4     6     9
     3     5    -2
Run Code Online (Sandbox Code Playgroud)

但我的计算结果如下:

v1 0.5525
v2 0.5525
v3 0.5264
Run Code Online (Sandbox Code Playgroud)

这并没有真正显示任何东西.我希望变量2的结果表明它远不如v1或v3重要.我的哪一次出局是错的?

Jon*_*nas 3

编辑现在我已经完全修改了答案,因为我明白哪些假设是错误的。

在解释什么在 OP 中不起作用之前,让我先确保我们使用相同的术语。在主成分分析中,目标是获得能够很好地分离观测值的坐标变换,并且这可以使得在较低维空间中描述数据(即不同的多维观测值)变得容易。当观察由多个测量组成时,它们就是多维的。如果线性独立观测值少于测量值,我们预计至少一个特征值为零,因为例如 3D 空间中的两个线性独立观测向量可以由 2D 平面描述。

如果我们有一个数组

x = [    1     3     4
         2     4    -1
         4     6     9
         3     5    -2];
Run Code Online (Sandbox Code Playgroud)

由四个观测值组成,每个观测值具有三个测量值,princomp(x)将找到四个观测值所跨越的低维空间。由于存在两个相互依赖的测量,其中一个特征值将接近于零,因为测量空间只是 2D 而不是 3D,这可能是您想要找到的结果。事实上,如果你检查特征向量 ( coeff),你会发现前两个分量非常明显地共线

coeff = princomp(x)
coeff =
      0.10124      0.69982      0.70711
      0.10124      0.69982     -0.70711
       0.9897     -0.14317   1.1102e-16
Run Code Online (Sandbox Code Playgroud)

由于前两个分量实际上指向相反的方向,因此变换后的观测值的前两个分量的值本身是没有意义的:[1 1 25]相当于[1000 1000 25]

现在,如果我们想找出任何测量值是否是线性相关的,并且我们是否真的想为此使用主成分,因为在现实生活中,测量值可能不是完全共线的,并且我们感兴趣的是找到良好的描述符向量机器学习应用程序中,将三个测量视为“观察值”并运行更有意义princomp(x')。由于因此只有三个“观测值”,但有四个“测量值”,因此第四个特征向量将为零。然而,由于有两个线性相关的观测值,我们只剩下两个非零特征值:

eigenvalues =
       24.263
       3.7368
            0
            0
Run Code Online (Sandbox Code Playgroud)

要找出哪些测量值具有如此高的相关性(如果您使用特征向量转换的测量值作为机器学习的输入,则实际上没有必要),最好的方法是查看测量值之间的相关性:

corr(x)
  ans =
        1            1      0.35675
        1            1      0.35675
  0.35675      0.35675            1
Run Code Online (Sandbox Code Playgroud)

毫不奇怪,每个测量值都与其自身完全相关,并且v1与 完全相关v2

编辑2

但特征值告诉我们新空间中哪些向量最重要(涵盖大部分变化),系数还告诉我们每个变量在每个分量中占多少。所以我假设我们可以使用这些数据来找出哪些原始变量具有最大的方差,因此是最重要的(并去掉那些代表少量的变量)

如果您的观察结果显示一个测量变量的方差很小(例如,其中x = [1 2 3;1 4 22;1 25 -25;1 11 100];,因此第一个变量对方差没有贡献),则此方法有效。然而,通过共线测量,两个向量都包含相同的信息,并且对方差的贡献相同。因此,特征向量(系数)可能彼此相似。


为了让 @agnieszka 的评论继续有意义,我在下面保留了我的答案的原始第 1-4 点。请注意,#3 是对特征向量除以特征值的响应,这对我来说没有多大意义。

  1. 向量应该位于行中,而不是列中(每个向量都是一个观察值)。
  2. coeff返回主成分的基向量,其阶数与原始输入关系不大
  3. 要查看主成分的重要性,您可以使用eigenvalues/sum(eigenvalues)
  4. 如果有两个共线向量,则不能说第一个重要而第二个不重要。你怎么知道事情不应该是相反的?如果您想测试共线性,您应该检查数组的秩,或者调用unique归一化(即norm等于 1)向量。

  • @agnieszka PCA 不会“删除”变量,如上所述,如果您有兴趣寻找线性组合,请查看排名。PCA 找到一组新的垂直轴(由数据的 cov 矩阵的特征向量形成),将数据映射到该轴,并将此过程中的变量组合成新的变量。看看这个[教程](http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf)。 (2认同)