【问题标题】:How can scikit-learning perform PCA on sparse data in libsvm format?scikit-learning 如何对 libsvm 格式的稀疏数据执行 PCA?
【发布时间】:2012-08-02 07:50:06
【问题描述】:

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

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

如何解决?

【问题讨论】:

  • 请至少发布异常消息。

标签: pca scikit-learn


【解决方案1】:

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

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

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

编辑:如 cmets 中所述,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

【讨论】:

  • 你的意思不正确吗?还是对您的任务无用?如果您使用了RandomizedPCA,请尝试使用iterated_power 的幂迭代次数来查看是否可以改进结果(默认情况下为 3,例如,您可以在 0 到 10 之间尝试)。
  • 有关更多详细信息,请查看参考文档scikit-learn.org/dev/modules/generated/… 和链接参考。
  • 为了其他后来者的利益,RandomizedPCA 不再支持稀疏数组输入。见stackoverflow.com/questions/30242215/…
  • 对于后来者,RandomizedPCA 已被弃用。相反,使用 PCA 和关键字参数 svd_solver='randomized'
  • 在稀疏数据上,PCAsvd_solver='randomized' 将失败。相反,您应该使用上面提到的TruncatedSVD
猜你喜欢
  • 2016-02-09
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2015-07-26
  • 2013-09-12
  • 1970-01-01
  • 2013-11-16
  • 2012-11-05
相关资源
最近更新 更多