Sto tentando di applicare PCA su una matrice sparsa enorme, nel seguente collegamento si dice che la PPA randomizzata di sklearn può gestire la matrice sparsa del formato sparse scipy. Apply PCA on very large sparse matrixEsecuzione di PCA su una matrice sparsa di grandi dimensioni utilizzando sklearn
Tuttavia, ottengo sempre l'errore. Qualcuno può far notare quello che sto facendo male.
matrice Input 'X_train' contiene i numeri in 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>
che sto cercando di fare:
>>>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.
se provo a convertire in matrice densa, penso di essere la memoria .
>>> 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
Hai visto questa risposta nella domanda che hai collegato? http://stackoverflow.com/a/10721425/2272172 – cel
sì, ma voglio sapere se c'è un modo per applicare PCA su una matrice sparsa enorme (se possibile usando python e sklearn) – khassan
Quindi hai già usato 'TruncatedSVD' e non ha funzionato? Se è così, per favore documentalo anche nella tua domanda. – cel