我试图将主成分分析应用于大型稀疏矩阵,在下面的链接中,它说明sklearn的randomizedPCA可以处理scipy稀疏格式的稀疏矩阵。 Apply PCA on very large sparse matrix
但是,我总是犯错误。有人能指出我做错了什么吗。
输入矩阵“X_train”包含float64中的数字:
>>>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>
我想做的是:
>>>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.
如果我试图转换成稠密矩阵,我想我已经没有记忆了。
>>> 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
由于PCA的性质,即使输入是稀疏矩阵,输出也不是。您可以用一个简单的例子来检查它:
创建一个0.01%数据为非零的随机稀疏矩阵。
对其应用PCA:
现在,检查结果:
这表明95000个条目是非零的
99481个元素接近
0
(<1e-15
),但不是0
。简而言之,这意味着对于PCA,即使输入是稀疏矩阵,输出也不是。因此,如果您试图从矩阵中提取100000000(
1e8
)成分,您将得到一个1e8 x n_features
(在您的示例中1e8 x 1617899
)密集的矩阵,当然,它不能保存在内存中。我不是一个专家统计学家,但我相信目前还没有使用scikit-learn来解决这一问题的方法,因为scikit-learn的实现不是一个问题,而是它们的稀疏PCA(通过稀疏SVD)的数学定义,这使得结果很密集。
唯一可行的解决方法是从少量的组件开始,并增加它,直到在可以保存在内存中的数据和解释的数据百分比(可以按如下方式计算)之间取得平衡:
PCA(X)为SVD(X-均值(X))。 即使X是稀疏矩阵,X-均值(X)始终是稠密矩阵。 因此,随机SVD(TruncatedSVD)不像稀疏矩阵的随机SVD那样有效。 但是,延迟评估
延迟(X-平均值(X))
可以避免将稀疏矩阵X扩展为稠密矩阵X均值(X)。 延迟评估使稀疏矩阵的有效PCA使用随机SVD。
此机制在我的包中实现:
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
相关问题 更多 >
编程相关推荐