scikit学习如何对libsvm格式的稀疏数据执行PCA?

scikit学习如何对libsvm格式的稀疏数据执行PCA?,pca,scikit-learn,Pca,Scikit Learn,我正在使用scikit学习做一些降维任务。 我的训练/测试数据是libsvm格式的。它是一个50万列的大型稀疏矩阵 我使用load_svmlight_file函数加载数据,通过使用SparsePCA,scikit学习抛出输入数据错误的异常 如何修复?稀疏PCA是一种在密集数据上寻找稀疏分解(组件具有稀疏性约束)的算法 如果你想对稀疏数据进行普通PCA,你应该使用sklearn.decomposition.RandomizedPCA,它实现了一种可伸缩的近似方法,可以对稀疏数据和密集数据都有效 I

我正在使用scikit学习做一些降维任务。 我的训练/测试数据是libsvm格式的。它是一个50万列的大型稀疏矩阵

我使用load_svmlight_file函数加载数据,通过使用SparsePCA,scikit学习抛出输入数据错误的异常


如何修复?

稀疏PCA是一种在密集数据上寻找稀疏分解(组件具有稀疏性约束)的算法

如果你想对稀疏数据进行普通PCA,你应该使用
sklearn.decomposition.RandomizedPCA
,它实现了一种可伸缩的近似方法,可以对稀疏数据和密集数据都有效

IIRC
sklearn.decomposition.PCA
目前仅适用于密集数据。例如,将来可以通过将稀疏数据矩阵上的SVD计算委托给arpack来增加对稀疏数据的支持

编辑:如注释中所述,
RandomizedPCA
的稀疏输入不推荐使用:相反,您应该使用
sklearn.decomposition.TruncatedSVD
,它与
RandomizedPCA
在稀疏数据上所做的完全相同,但不应该首先被称为PCA

澄清一下:PCA在数学上定义为数据居中(去除每个特征的平均值),然后对居中数据应用截断SVD

由于对数据进行中心化会破坏稀疏性并强制执行通常不再适合内存的密集表示,因此通常直接对稀疏数据进行截断SVD(不进行中心化)。这类似于PCA,但并不完全相同。这在scikit learn中实现为
sklearn.decomposition.TruncatedSVD


编辑(2019年3月):正在对稀疏数据实施隐式居中PCA:

请至少发布异常消息。您的意思是不正确吗?还是对你的任务毫无用处?如果您使用了
RandomizedPCA
尝试使用power迭代次数
iterated\u power
,看看您是否可以改进结果(默认情况下为3,您可以在0到10之间进行尝试)。有关更多详细信息,请查看参考文档和链接参考。为了其他后来者的利益,RandomizedPCA不再支持稀疏数组输入。请参阅,对于后来者,
RandomizedPCA
已被弃用。相反,对稀疏数据使用带关键字参数的
svd\u solver='randomized'
时,
PCA
svd\u solver='randomized'
将失败。相反,您应该使用如上所述的
TruncatedSVD