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

时间:2011-09-28 19:38:25

标签: matlab pca princomp

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

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

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

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

[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重要。 我的哪一次出局是错的?

1 个答案:

答案 0 :(得分:3)

编辑我完全重写了答案,因为我明白哪些假设是错误的。

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

如果我们有一个数组

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

不出所料,每次测量都与自身完全相关,v1v2完全相关。

EDIT2

  

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

如果您的观察结果在一个测量变量中显示非常小的差异(例如,x = [1 2 3;1 4 22;1 25 -25;1 11 100];,那么这是有效的,因此第一个变量对方差没有贡献)。但是,对于共线测量,两个矢量都保存等效的信息,并将等同提供给方差。因此,特征向量(系数)可能彼此相似。


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

  1. 矢量应该是行,而不是列(每个矢量是一个 观察)。
  2. coeff返回委托人的基础向量 组件及其顺序与原始输入
  3. 无关
  4. 要了解主要组件的重要性,请使用eigenvalues/sum(eigenvalues)
  5. 如果你有两个共线矢量,你不能说第一个很重要,第二个不重要。你怎么知道它不应该是相反的方式?如果要测试共线性,则应检查数组的等级,或者在规范化(即unique等于1)向量上调用norm