首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用sklearn对大型稀疏矩阵进行PCA分析

利用sklearn对大型稀疏矩阵进行PCA分析
EN

Stack Overflow用户
提问于 2015-11-09 14:46:23
回答 2查看 27.3K关注 0票数 19

我正在尝试将主成分分析应用于巨大的稀疏矩阵,在下面的链接中它说sklearn的randomizedPCA可以处理scipy稀疏格式的稀疏矩阵。Apply PCA on very large sparse matrix

然而,我总是得到错误。有人能指出我做错了什么吗?

输入矩阵'X_train‘包含float64格式的数字:

代码语言:javascript
复制
>>>type(X_train)
<class 'scipy.sparse.csr.csr_matrix'>
>>>X_train.shape
(2365436, 1617899)
>>>X_train.ndim 
2
>>>X_train[0]     
<1x1617899 sparse matrix of type '<type 'numpy.float64'>'
    with 81 stored elements in Compressed Sparse Row format>

我想做的是:

代码语言:javascript
复制
>>>from sklearn.decomposition import RandomizedPCA
>>>pca = RandomizedPCA()
>>>pca.fit(X_train)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/sklearn/decomposition/pca.py", line 567, in fit
    self._fit(check_array(X))
  File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/sklearn/utils/validation.py", line 334, in check_array
    copy, force_all_finite)
  File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/sklearn/utils/validation.py", line 239, in _ensure_sparse_format
    raise TypeError('A sparse matrix was passed, but dense '
TypeError: A sparse matrix was passed, but dense data is required. Use X.toarray() to convert to a dense numpy array.

如果我尝试转换为密集矩阵,我认为我的内存不足。

代码语言:javascript
复制
>>> pca.fit(X_train.toarray())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/scipy/sparse/compressed.py", line 949, in toarray
    return self.tocoo(copy=False).toarray(order=order, out=out)
  File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/scipy/sparse/coo.py", line 274, in toarray
    B = self._process_toarray_args(order, out)
  File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/scipy/sparse/base.py", line 800, in _process_toarray_args
    return np.zeros(self.shape, dtype=self.dtype, order=order)
MemoryError
EN

回答 2

Stack Overflow用户

发布于 2015-11-09 19:30:07

由于PCA的性质,即使输入是稀疏矩阵,输出也不是。你可以用一个简单的例子来检查它:

代码语言:javascript
复制
>>> from sklearn.decomposition import TruncatedSVD
>>> from scipy import sparse as sp

创建一个随机稀疏矩阵,其中0.01%的数据为非零。

代码语言:javascript
复制
>>> X = sp.rand(1000, 1000, density=0.0001)

对其应用PCA:

代码语言:javascript
复制
>>> clf = TruncatedSVD(100)
>>> Xpca = clf.fit_transform(X)

现在,检查结果:

代码语言:javascript
复制
>>> type(X)
scipy.sparse.coo.coo_matrix
>>> type(Xpca)
numpy.ndarray
>>> print np.count_nonzero(Xpca), Xpca.size
95000, 100000

这表明95000的条目是非零的,然而,

代码语言:javascript
复制
>>> np.isclose(Xpca, 0, atol=1e-15).sum(), Xpca.size
99481, 100000

99481 elements 0 (<1e-15),但不是 0

这意味着,简而言之,对于PCA,即使输入是稀疏矩阵,输出也不是。因此,如果您试图从矩阵中提取100,000,000 (1e8)个分量,您最终将得到一个1e8 x n_features (在您的示例中为1e8 x 1617899)密集型矩阵,当然,它不能保存在内存中。

我不是一个专业的统计学家,但我相信目前没有办法使用scikit-learn来解决这个问题,因为这不是scikit-learn实现的问题,只是他们的稀疏PCA (通过稀疏SVD)的数学定义,这使得结果变得密集。

对于您来说,唯一可行的解决方法是从少量组件开始,然后增加它,直到您在可以保留在内存中的数据和所解释的数据的百分比之间达到平衡为止(您可以按以下方式计算):

代码语言:javascript
复制
>>> clf.explained_variance_ratio_.sum()
票数 20
EN

Stack Overflow用户

发布于 2018-11-13 14:22:54

PCA(X)是奇异值分解(X-均值(X))。即使X是稀疏矩阵,X-均值(X)始终是稠密矩阵。因此,随机奇异值分解(TruncatedSVD)不像稀疏矩阵的随机奇异值分解那样有效。然而,延迟的评估

延迟(X-均值(X))

可以避免将稀疏矩阵X扩展到稠密矩阵X-均值(X)。延迟评估使得能够使用随机化的SVD对稀疏矩阵进行有效的PCA。

这个机制是在我的包中实现的:

https://github.com/niitsuma/delayedsparse/

您可以使用以下机制查看PCA的代码:https://github.com/niitsuma/delayedsparse/blob/master/delayedsparse/pca.py

与现有方法的性能比较表明,这种机制大大减少了所需的内存大小:https://github.com/niitsuma/delayedsparse/blob/master/demo-pca.sh

关于这项技术的更详细描述可以在我的专利中找到:https://patentscope2.wipo.int/search/ja/detail.jsf?docId=JP225380312

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33603787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档