我知道主成分分析确实在基质上一个SVD,然后生成的本征值矩阵。 要选择我们只取前几个特征值的主要组成部分。 现在,我们如何决定,我们应该从本征值矩阵特征值的数目?
Answer 1:
要决定多少特征值/特征向量保留,你应该考虑你的理由摆在首位做PCA。 你这样做是为了减少存储需求,减少对维的分类算法,或其他原因? 如果你没有任何严格的约束,我建议密谋特征值的累计总和(假定它们按降序排列)。 如果你之前绘制除以特征值的总和每个值,那么你的曲线将显示保留对本征值的数量总方差的比例。 然后,阴谋将提供当你打了收益递减点的一个很好的迹象(即小方差通过保留更多的特征值获得)。
Answer 2:
没有正确的答案,它是介于1和n之间。
觉得作为一个街道的主要成分在一个小镇你以前从来没有访问过的。 你应该有多少街道采取结识镇?
那么,你显然应该访问的主要街道(第一部分),也许其他一些大的街道了。 你需要访问每一条街道知道镇不够好? 可能不是。
完美知道镇,你应该访问所有的街道。 但是,如果你可以参观,说10出50个街道,并有城镇的95%的理解? 是不是不够好?
基本上,你应该选择足够的分量来解释不够,你是舒服的变异。
Answer 3:
正如有人说,它不会伤害绘制解释方差。
如果您使用PCA作为一个监督的学习任务预处理步骤,您应该交叉验证整个数据处理管线和治疗PCA维度的号码作为超参数使用最终监督分数的网格搜索选择(如F1分数分类或RMSE为回归)。
如果整个数据集交叉验证网格搜索成本太高试穿2个采样,例如一个与数据的1%,第二个具有10%,看看你拿出了PCA尺寸相同的最佳值。
Answer 4:
有一些启发式的使用了点。
例如服用的前k个本征向量,捕捉的总方差的至少85%。
然而,对于高维,这些启发式通常不是很好。
Answer 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
图像将类似于:
对于此示例的图像,可以计算通过投射输入数据到由所述相对误差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个主成分。
免责声明 :所获得的数值仅适用于我的人工数据。 所以,不要使用建议值盲目地在您的情况,但执行相同的分析,并作出权衡你做出错误,你需要的部件数量之间。
代码参考
- 迭代算法是基于源代码
pcares
- 一个StackOverflow的岗位约
pcares
Answer 6:
我通过Gavish和Donoho等高度推荐以下纸: 最优硬阈值用于奇异值是4 / SQRT(3) 。
我张贴的这对一个更长的总结交叉验证(stats.stackexchange.com) 。 简单地说,他们获得非常大的矩阵的限制的最佳过程。 这个过程非常简单,不需要任何手动调整参数,并且似乎在实践中很好地工作。
他们有一个很好的补充代码在这里: https://purl.stanford.edu/vg705qn9070