Lon*_*guy 33 machine-learning data-mining svd
我知道主成分分析在矩阵上进行SVD,然后生成特征值矩阵.要选择主成分,我们必须只取前几个特征值.现在,我们如何决定我们应该从特征值矩阵中获取的特征值的数量?
bog*_*ron 35
要确定要保留多少特征值/特征向量,您应该首先考虑进行PCA的原因.您是在降低存储要求,降低分类算法的维数还是出于其他原因?如果您没有任何严格的约束,我建议绘制特征值的累积和(假设它们按降序排列).如果在绘图之前将每个值除以特征值的总和,那么您的图将显示保留的总方差的分数与特征值的数量.然后,该图将提供关于何时达到收益递减点的良好指示(即,通过保留额外的特征值而获得的方差很小).
Nei*_*gan 23
没有正确答案,它介于1和n之间.
将主要组成部分视为您以前从未访问过的城镇中的街道.你应该走多少条街才能了解这个小镇?
那么,你应该明显地访问主要街道(第一个组成部分),也许还有其他一些大街道.您是否需要访问每条街道以充分了解该镇?可能不是.
要完全了解这个小镇,你应该去所有的街道.但是,如果你可以参观50条街道中的10条街道并对城镇有95%的了解呢?这够好吗?
基本上,您应该选择足够的组件来解释您认为足够的差异.
正如其他人所说,绘制解释的方差并没有什么坏处.
如果您使用PCA作为监督学习任务的预处理步骤,您应该交叉验证整个数据处理管道并将PCA维度的数量视为超参数,以使用最终监督分数的网格搜索进行选择(例如,分类的F1分数)或RMSE用于回归).
如果对整个数据集进行交叉验证的网格搜索成本太高,请尝试使用2个子样本,例如,一个包含1%的数据,第二个包含10%,并查看是否为PCA维度提供了相同的最佳值.
有许多启发式方法可供使用.
例如,取第一个k特征向量,捕获总方差的至少85%.
然而,对于高维度,这些启发式通常不是很好.
我强烈推荐 Gavish 和 Donoho 的以下论文:The Optimal Hard Threshold for Singular Values is 4/sqrt(3)。
我在CrossValidated (stats.stackexchange.com)上发布了更长的摘要。简而言之,他们在非常大的矩阵的限制下获得了最佳过程。该过程非常简单,不需要任何手动调整参数,并且在实践中似乎效果很好。
他们在这里有一个很好的代码补充:https ://purl.stanford.edu/vg705qn9070
根据您的情况,通过将数据投影到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个主要成分。
免责声明:所获得的值仅对我的人工数据有效。因此,不要在您的情况下盲目使用建议的值,而要执行相同的分析,并在所产生的错误和所需的组件数量之间进行权衡。
代码参考
pcarespcares