【问题标题】:How many principal components to take?取多少主成分?
【发布时间】:2023-03-12 06:42:01
【问题描述】:

我知道主成分分析对矩阵进行 SVD,然后生成特征值矩阵。为了选择主成分,我们只需要取前几个特征值。现在,我们如何决定应该从特征值矩阵中取多少个特征值?

【问题讨论】:

    标签: machine-learning data-mining svd


    【解决方案1】:

    根据您的情况,通过在ndim 维度上投影您的数据来定义最大允许相对误差可能会很有趣。

    Matlab 示例

    我将用一个小的 matlab 示例来说明这一点。不感兴趣的可以直接跳过。

    我将首先生成一个由n 样本(行)和p 特征组成的随机矩阵,其中正好包含 100 个非零主成分。

    n = 200;
    p = 119;
    data = zeros(n, p);
    for i = 1:100
      data = data + rand(n, 1)*rand(1, p);
    end
    

    图像看起来类似于:

    对于此示例图像,可以通过将输入数据投影到ndim 维度来计算相对误差,如下所示:

    [coeff,score] = pca(data,'Economy',true);
    
    relativeError = zeros(p, 1);
    for ndim=1:p
        reconstructed = repmat(mean(data,1),n,1) + score(:,1:ndim)*coeff(:,1:ndim)';
        residuals = data - reconstructed;
        relativeError(ndim) = max(max(residuals./data));
    end
    

    绘制维数(主成分)函数的相对误差,结果如下图:

    根据此图,您可以决定需要考虑多少个主成分。在这个理论图像中,100 个分量会产生精确的图像表示。所以,取超过 100 个元素是没有用的。例如,如果你想要最大 5% 的误差,你应该取大约 40 个主成分。

    免责声明:获取的值仅对我的人工数据有效。因此,不要在您的情况下盲目使用建议的值,而是执行相同的分析并在您犯的错误和您需要的组件数量之间进行权衡。

    代码参考

    【讨论】:

    • 原谅我的无知,你的代码是什么语言的?
    • @ww2406 代码是用 Matlab 编写的。更新了答案以清楚地表明它并提供正确的代码突出显示
    【解决方案2】:

    我强烈推荐 Gavish 和 Donoho 的以下论文:The Optimal Hard Threshold for Singular Values is 4/sqrt(3)

    我在CrossValidated (stats.stackexchange.com) 上发布了一个更长的摘要。简而言之,他们在非常大的矩阵的限制下获得了一个最佳过程。该过程非常简单,不需要任何手动调整的参数,并且在实践中似乎效果很好。

    他们在这里有一个很好的代码补充:https://purl.stanford.edu/vg705qn9070

    【讨论】:

      【解决方案3】:

      没有正确答案,它在 1 和 n 之间。

      将主成分想象成您从未去过的城镇中的一条街道。您应该走多少条街道才能了解这个小镇?

      嗯,您显然应该参观主要街道(第一个组成部分),也许还应该参观其他一些大街道。您是否需要走遍每条街道才能充分了解这座城市?应该不会吧。

      要完全了解这座城市,您应该走遍所有街道。但是,如果你可以参观,比如说 50 条街道中的 10 条,并且对小镇有 95% 的了解,那会怎样?这够好吗?

      基本上,您应该选择足够多的分量来解释足够多的方差,让您感到满意。

      【讨论】:

        【解决方案4】:

        正如其他人所说,绘制解释方差并没有什么坏处。

        如果您使用 PCA 作为监督学习任务的预处理步骤,您应该交叉验证整个数据处理管道,并将 PCA 维度的数量视为超参数,以使用网格搜索对最终监督分数(例如 F1分类得分或回归 RMSE)。

        如果对整个数据集进行交叉验证的网格搜索成本太高,请尝试使用 2 个子样本,例如一个包含 1% 的数据,第二个包含 10% 的数据,看看您是否为 PCA 维度提出了相同的最佳值。

        【讨论】:

          【解决方案5】:

          要决定要保留多少个特征值/特征向量,您应该首先考虑您进行 PCA 的原因。你这样做是为了减少存储需求,减少分类算法的维数,还是出于其他原因?如果您没有任何严格的约束,我建议绘制特征值的累积和(假设它们按降序排列)。如果在绘图之前将每个值除以特征值的总和,那么您的绘图将显示保留的总方差与特征值数量的比例。然后,该图将很好地指示您何时达到收益递减点(即,通过保留额外的特征值获得的方差很小)。

          【讨论】:

          【解决方案6】:

          对此有许多启发式方法。

          例如取前 k 个能够捕获总方差的至少 85% 的特征向量。

          但是,对于高维,这些启发式通常不是很好。

          【讨论】:

          • 谢谢。只是一个小小的疑问。特征向量将按降序排列对吗?你的意思是前 k 个特征值占特征值总和的 85%?
          • 是的,特征值对应于相对方差。但是高方差是否=高重要性是值得怀疑的。它在低维度上是有意义的,例如物理 x,y,z。但是当维度有不同的含义和尺度时,它就不再有意义了。
          猜你喜欢
          • 2018-03-12
          • 2019-07-29
          • 2015-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多