要采用多少主要组件?

时间:2012-08-22 06:31:16

标签: machine-learning data-mining svd

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

6 个答案:

答案 0 :(得分:33)

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

答案 1 :(得分:17)

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

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

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

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

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

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:7)

有许多启发式用法。

E.g。采用第一个k特征向量来捕获至少85%的总方差

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

答案 4 :(得分: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

图像看起来类似于:

enter image description here

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

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

enter image description here

根据此图表,您可以决定需要考虑多少主要组件。在该理论图像中,取100个分量导致精确的图像表示。因此,超过100个元素是没用的。如果您想要例如最大5%的错误,则应该使用大约40个主要组件。

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

代码参考

答案 5 :(得分:1)

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

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

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

相关问题