gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:29:52 25 4
gpt4 key购买 nike

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

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

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

所以我假设要找出原始数据集中哪些变量最重要,哪些变量最不重要,我应该将 coeff 矩阵乘以特征值 - 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 重要。
我的哪个假设是错误的?

最佳答案

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

在解释什么在 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

不出所料,每个测量值都与其自身完全相关,而且 v1v2 完全相关.

编辑2

but the eigenvalues tell us which vectors in the new space are most important (cover the most of variation) and also coefficients tell us how much of each variable is in each component. so I assume we can use this data to find out which of the original variables hold the most of variance and thus are most important (and get rid of those that represent small amount)



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

为了让@agnieszka 的评论继续有意义,我在下面留下了答案的原始点 1-4。请注意,#3 是对特征向量除以特征值的响应,这对我来说没有多大意义。
  • 向量应该在行中,而不是列中(每个向量是一个
    观察)。
  • coeff返回主体的基向量
    组件,其顺序与原始输入无关
  • 要查看主成分的重要性,请使用 eigenvalues/sum(eigenvalues)
  • 如果您有两个共线向量,则不能说第一个很重要而第二个不重要。你怎么知道不应该反过来呢?如果你想测试共线性,你应该检查数组的秩,或者调用 unique在归一化(即 norm 等于 1)向量上。
  • 关于Matlab:如何在matlab中使用PCA找到可以丢弃数据集中的哪些变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7588637/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com