7

由于与其他变量高度相关,我正在使用 PCA 找出我的数据集中的哪些变量是多余的。我正在对先前使用 zscore 标准化的数据使用 princomp matlab 函数:

[coeff, PC, eigenvalues] = princomp(zscore(x))

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

所以我假设要找出原始数据集中哪些变量是最重要的,哪些是最少的,我应该将系数矩阵乘以特征值-数值表示每个组件具有的每个变量的多少,而特征值说明该组件的重要性是。所以这是我的完整代码:

[coeff, PC, eigenvalues] = princomp(zscore(x));
e = eigenvalues./sum(eigenvalues);
abs(coeff)/e

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

     v1    v2    v3
     1     3     4
     2     4    -1
     4     6     9
     3     5    -2

但我的计算结果如下:

v1 0.5525
v2 0.5525
v3 0.5264

这并没有真正显示出任何东西。我希望变量 2 的结果表明它远没有 v1 或 v3 重要。我的哪个假设是错误的?

4

1 回答 1

3

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

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

如果我们有一个数组

x = [    1     3     4
         2     4    -1
         4     6     9
         3     5    -2];

由四个观测值组成,每个观测值具有三个测量值,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

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

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

eigenvalues =
       24.263
       3.7368
            0
            0

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

corr(x)
  ans =
        1            1      0.35675
        1            1      0.35675
  0.35675      0.35675            1

不出所料,每个测量都与自身完全相关,并且与v1完全相关v2

编辑2

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

如果您的观察结果显示一个测量变量的方差很小(例如 where 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)向量。
于 2011-09-28T21:12:53.773 回答