通过SVD指定维持能量的尺寸降低

时间:2014-11-10 18:32:05

标签: python numpy scikit-learn

我希望使用SVD减少一些数据集的维度。但是,当前的sklearn接口只允许我指定要减少的组件数(通过n_components参数)。

这感觉"硬编码",因为一些数据集的维度比其他数据集大得多,并且没有正确数量的组件来确定先验。指定要保留原始矩阵的能量(或者更具体地说,在这种情况下是数据集)是一个更好的选择(最快的#34;参考"我可以抓住this book,在{ {3}}(更具体地说,本PDF的第20页,"我们应该保留多少奇异值?"框)。

有什么方法可以在scikit-learn中使用SVD做到这一点?

我已尝试修改源代码以允许此操作,但是当前代码执行了一个"优化步骤"这取决于传递给代码的组件数量。如果我没有通过组件数量(即保留默认数量),则只会分解12个组件(并且能量计算将仅使用这12个组件)。为了根据能量进行计算,我必须将n_components设置为每个数据集的特征总数(转到安全方面),对某些人来说,非常慢更大的数据集。

解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:2)

正如您所见from the documentation,您可以使用解释的方差比(我认为您正在寻找的内容)或使用“mle”估算。

PCA类总是计算完整的SVD,所以你不会得到加速。您可以使用RandomizedPCA,但这不允许根据解释的方差比选择组件数。您无论如何都应该尝试它,因为对于大型数据集,它可能会比PCA快很多,即使您计算所有组件(假设n_features不是很大)。