scikit-learning如何在libsvm格式的稀疏数据上执行PCA?

Bin*_*Hsu 6 pca scikit-learn

我正在使用scikit-learning做一些降维任务.我的训练/测试数据采用libsvm格式.它是50万列中的大型稀疏矩阵.

我使用load_svmlight_file函数加载数据,并且通过使用SparsePCA,scikit-learning抛出了输入数据错误的异常.

怎么解决?

ogr*_*sel 16

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

如果您想对稀疏数据执行vanilla PCA,您应该使用sklearn.decomposition.RandomizedPCA它实现可扩展的近似方法,该方法适用于稀疏数据和密集数据.

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

编辑:如评论中所述,稀疏输入为RandomizedPCA不推荐使用:相反,您应该使用sklearn.decomposition.TruncatedSVD它确实准确地 RandomizedPCA处理稀疏数据,但不应该首先称为PCA.

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

由于数据的居中将破坏稀疏性并迫使通常不再适合存储器的密集表示,通常直接对稀疏数据进行截断的SVD(没有居中).这类似于PCA,但它并不完全相同.这是在scikit-learn as中实现的sklearn.decomposition.TruncatedSVD.

  • 为了其他后来者的利益,RandomizedPCA不再支持稀疏数组输入.请参阅http://stackoverflow.com/questions/30242215/scikit-learn-sklearn-pca-throws-type-error-on-sparse-matrix (2认同)
  • 对于后来者,"RandomizedPCA"已被弃用.相反,使用带有关键字参数`svd_solver ='randomized'的`PCA` (2认同)