【问题标题】:Matlab: how to find which variables from dataset could be discarded using PCA in matlab?Matlab:如何在 matlab 中使用 PCA 查找数据集中的哪些变量可以丢弃?
【发布时间】:2011-11-27 04:00:57
【问题描述】:

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

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

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

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

[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 重要。 我的哪个假设是错误的?

【问题讨论】:

    标签: matlab pca princomp


    【解决方案1】:

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

    在解释什么在 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 完全相关。

    EDIT2

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

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


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

    1. 向量应该是行,而不是列(每个向量都是一个 观察)。
    2. coeff 返回主体的基向量 组件,其顺序与原始输入关系不大
    3. 要查看主要组件的重要性,请使用eigenvalues/sum(eigenvalues)
    4. 如果您有两个共线向量,则不能说第一个重要而第二个不重要。你怎么知道它不应该反过来?如果你想测试共线性,你应该检查数组的等级,或者在归一化(即norm等于1)向量上调用unique。

    【讨论】:

    • 2.错误的;对应于主成分的系数列按降序排列,但行对应于正确顺序的变量,这是我所做的唯一假设(PC 1 的系数在第 1 列,第 1 行对应于 v1,第 2 行对应于 v2 和等等)
    • 3有什么问题? eigenvalues 告诉我们关于主成分的方差覆盖,使它成为 eigenvalues./sum(eigenvalues) 只计算百分比
    • 4.如果我有两个共线向量,例如一个人的身高(以厘米为单位)和一个人的身高(以英寸为单位),我不需要这两个信息,因为它们实际上代表相同的特征。它们不会为区分对象(观察)增加任何价值,我想找到这些变量,从数据集中删除后不会显着影响变化
    • 1.向量在行中(v1、v2、v3 是变量,不是向量)
    • @agnieszka PCA 不会“删除”变量,如前所述,如果您对寻找线性组合感兴趣,请查看排名。 PCA 找到一组新的垂直轴(由数据的 cov 矩阵的特征向量形成),您的数据映射到该垂直轴,并将此过程中的变量组合成新的变量。看看这个tutorial。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多