我知道主成分分析在矩阵上执行SVD然后生成特征值矩阵。为了选择主成分,我们只需要取前几个特征值。那么,我们如何决定从特征值矩阵中应该取多少个特征值呢?
我知道主成分分析在矩阵上执行SVD然后生成特征值矩阵。为了选择主成分,我们只需要取前几个特征值。那么,我们如何决定从特征值矩阵中应该取多少个特征值呢?
要决定保留多少个特征值/特征向量,你需要考虑最初进行PCA的原因。是为了减少存储需求,为分类算法降维,还是出于其他原因?如果没有严格的限制,建议绘制特征值的累计和(假设它们按降序排列)。如果在绘图之前将每个值除以特征值的总和,则您的图将显示所保留的总方差的分数与特征值数量的关系。然后,该图将提供一个很好的指示,告诉您何时达到收益递减点(即,通过保留额外的特征值几乎不会增加方差)。
这个问题没有正确答案,它应该在1到n之间。
把主成分想象成你从未去过的一个镇上的街道。你需要走多少条街才能了解这个镇?
显然,你应该先游览主要街道(也就是第一个成分),可能还要走一些其他大街。你需要游览每一条街道才能完全了解这个镇吗?也许不需要。
要完美地了解这个镇,你应该游览所有的街道。但是如果你只需要游览50条街道中的10条,就能对这个镇有95%的了解程度,那么这已经足够好了吗?
基本上,你应该选择足够数量的成分来解释足够多的方差,以使你感到满意。
正如其他人所说,绘制解释的方差对结果并没有害处。
如果你将PCA作为监督学习任务的预处理步骤,你应该交叉验证整个数据处理流程,并将PCA维度数量视为超参数,使用最终监督得分(例如分类的F1得分或回归的RMSE)在网格搜索中选择。
如果在整个数据集上进行交叉验证的网格搜索过于昂贵,请在两个子样本上尝试,例如一个包含1%的数据,另一个包含10%的数据,并查看是否得出相同的PCA维度的最优值。
有许多启发式算法可以使用。
例如,选择捕获至少85%总方差的前k个特征向量。
但是,对于高维度情况下,这些启发式算法通常不太好用。
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
pcares
的源代码
- 有关 pcares
的 StackOverflow帖子