要采用多少主要组件?

Lon*_*guy 33 machine-learning data-mining svd

我知道主成分分析在矩阵上进行SVD​​,然后生成特征值矩阵.要选择主成分,我们必须只取前几个特征值.现在,我们如何决定我们应该从特征值矩阵中获取的特征值的数量?

bog*_*ron 35

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


Nei*_*gan 23

没有正确答案,它介于1和n之间.

将主要组成部分视为您以前从未访问过的城镇中的街道.你应该走多少条街才能了解这个小镇?

那么,你应该明显地访问主要街道(第一个组成部分),也许还有其他一些大街道.您是否需要访问每条街道以充分了解该镇?可能不是.

要完全了解这个小镇,你应该去所有的街道.但是,如果你可以参观50条街道中的10条街道并对城镇有95%的了解呢?这够好吗?

基本上,您应该选择足够的组件来解释您认为足够的差异.


ogr*_*sel 9

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

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

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


Ano*_*sse 8

有许多启发式方法可供使用.

例如,取第一个k特征向量,捕获总方差的至少85%.

然而,对于高维度,这些启发式通常不是很好.

  • 是的,特征值对应于相对方差.但高方差=高重要性值得怀疑.它在低维度上是有意义的,例如物理x,y,z.但是当尺寸具有不同的含义和尺度时,它就不再有意义了. (8认同)
  • 谢谢。只是一个小疑问。特征向量将按降序排列,对吗?你的意思是前 k 个特征值捕获了特征值总和的 85%? (2认同)

Ale*_*ams 6

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

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

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


m79*_*13d 5

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

我将通过一个小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
Run Code Online (Sandbox Code Playgroud)

该图像将类似于:

在此处输入图片说明

对于此示例图像,可以通过将输入数据投影到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
Run Code Online (Sandbox Code Playgroud)

绘制尺寸(主成分)数量函数的相对误差将导致下图:

在此处输入图片说明

根据此图,您可以确定需要考虑的主要成分。在该理论图像中,拍摄100个分量会得到精确的图像表示。因此,采用100多个元素是没有用的。例如,如果要最大5%的误差,则应采用约40个主要成分。

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

代码参考