在CountVectorizer变为(40845 X 218904)(unigram)后,我遇到了一个只有2个类和训练数据集矩阵大小的文档分类问题。在考虑八卦的情况下,它可以达到(40845 X 3931789)。有没有一种方法可以在这样的数据集上执行PCA,而不会出现内存或稀疏数据集错误。我在6GB的机器上使用python sklearn。
您可以尝试稀疏SVD,如通过sklearn:中的TruncatedVD实现的那样
http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.TruncatedSVD.html
对文档数据集执行SVD是一种常见的技术,通常被称为潜在语义分析(LSA)。SVD和PCA也非常相似。如果你想了解更多关于差异的信息,这个问题有一些很好的信息:
https://math.stackexchange.com/questions/3869/what-is-the-intuitive-relationship-between-svd-and-pca
如果你有6GB的RAM,你就有一台64位的机器,所以最简单的解决方案可能就是增加RAM。
否则,此的交叉柱:https://scicomp.stackexchange.com/questions/1681/what-is-the-fastest-way-to-calculate-the-largest-eigenvalue-of-a-general-matrix/7487#7487
最近对此有一些很好的研究。新方法使用"随机算法",只需要对矩阵进行几次读取即可获得最大特征值的良好准确性。这与幂迭代形成对比,幂迭代需要多次矩阵向量乘法才能达到高精度。
你可以在这里阅读更多关于新研究的信息:
http://math.berkeley.edu/~菌株/273.F10/martinsson.tygert.rokhlin.randomized.decomposition.pdf
http://arxiv.org/abs/0909.4061
这个代码会为你做这件事:
http://cims.nyu.edu/~tygert/software.html
https://bitbucket.org/rcompton/pca_hgdp/raw/be45a1d9a7077b60219f7017af0130c7f43d7b52/pca.m
http://code.google.com/p/redsvd/
https://cwiki.apache.org/MAHOUT/stochastic-singular-value-decomposition.html
如果你选择的语言不在那里,你可以很容易地滚动你自己的随机SVD;它只需要矩阵向量乘法,然后调用现成的SVD。
如果不需要太多组件(通常不需要),可以迭代计算主组件。我一直觉得这在实践中是足够的。