我正在使用 scikit-learning 做一些降维任务。我的训练/测试数据采用 libsvm 格式。它是一个有 50 万列的大型稀疏矩阵。
我使用 load_svmlight_file 函数加载数据,并通过使用 SparsePCA,scikit-learning 抛出输入数据错误的异常。
如何解决?
我正在使用 scikit-learning 做一些降维任务。我的训练/测试数据采用 libsvm 格式。它是一个有 50 万列的大型稀疏矩阵。
我使用 load_svmlight_file 函数加载数据,并通过使用 SparsePCA,scikit-learning 抛出输入数据错误的异常。
如何解决?
稀疏 PCA 是一种用于在密集数据上找到稀疏分解(组件具有稀疏约束)的算法。
如果您想对稀疏数据执行 vanilla PCA,您应该使用sklearn.decomposition.RandomizedPCA
它实现了一种可扩展的近似方法,该方法适用于稀疏和密集数据。
IIRCsklearn.decomposition.PCA
目前仅适用于密集数据。例如,将来可以通过将稀疏数据矩阵上的 SVD 计算委托给 arpack 来添加对稀疏数据的支持。
编辑:如注释中所述,RandomizedPCA
不推荐使用稀疏输入:相反,您应该使用sklearn.decomposition.TruncatedSVD
它来精确地 RandomizedPCA
执行过去对稀疏数据所做的操作,但首先不应将其称为 PCA。
澄清一下:PCA 在数学上定义为使数据居中(去除每个特征的平均值),然后对居中的数据应用截断的 SVD。
由于将数据居中会破坏稀疏性并强制使用通常不再适合内存的密集表示,因此通常直接对稀疏数据进行截断 SVD(不居中)。这类似于 PCA,但并不完全相同。这在 scikit-learn 中实现为sklearn.decomposition.TruncatedSVD
.
编辑(2019 年 3 月):正在进行的工作是在具有隐式居中的稀疏数据上实施 PCA:https ://github.com/scikit-learn/scikit-learn/pull/12841