Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab:如何在Matlab中使用PCA从数据集中找出哪些变量可以丢弃?_Matlab_Pca_Princomp - Fatal编程技术网

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

Matlab:如何在Matlab中使用PCA从数据集中找出哪些变量可以丢弃?,matlab,pca,princomp,Matlab,Pca,Princomp,我使用PCA来找出数据集中的哪些变量是冗余的,因为它们与其他变量高度相关。我正在使用princomp matlab函数对之前使用zscore标准化的数据进行处理: [coeff, PC, eigenvalues] = princomp(zscore(x)) 我知道特征值告诉我数据集的变化有多少覆盖了每个主成分,而系数告诉我第I个原始变量有多少位于第j个主成分中(其中I-行,j-列) 所以我假设要找出原始数据集中哪些变量最重要,哪些变量最少,我应该用特征值乘以系数矩阵——系数值表示每个分量有多少

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

[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 0.5525
v2 0.5525
v3 0.5264
这并没有显示出什么。我希望变量2的结果显示它远没有v1或v3重要。
我的假设中哪一个是错误的?

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

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

如果我们有一个数组

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]

现在,如果我们想知道任何测量值是否是线性相关的,如果我们真的想使用主成分,因为在现实生活中,测量值不是完全共线的,我们想为机器学习应用找到良好的描述符向量,将三个测量值视为“观测值”,并运行<代码> PRIMCOMP(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的评论保持有意义,我在下面留下了我答案的原始点1-4。注意#3是对特征向量除以特征值的响应,这对我来说没有太多意义

  • 向量应该是行而不是列(每个向量都是一个 观察)
  • coeff
    返回主体的基向量 组件,其顺序与原始输入几乎没有关系
  • 要查看主成分的重要性,请使用
    特征值/和(特征值)
  • 如果你有两个共线向量,你不能说第一个是重要的,第二个不是。你怎么知道不应该是相反的呢?如果要测试共线性,则应检查数组的秩,或者对规范化(即
    norm
    等于1)向量调用
    unique

    2.错;与主成分相对应的系数列的顺序是递减的,但行与变量的顺序是正确的,这是我唯一的假设(PC1的系数在第1列,第1行与v1、第2行与v2等相对应)3有什么问题?特征值告诉我们主成分方差覆盖,使其成为特征值。
    corr(x)
      ans =
            1            1      0.35675
            1            1      0.35675
      0.35675      0.35675            1