2011-08-22 11 views
5

Sto provando ad applicare SVD sulla mia matrice (3241 x 12596) che è stata ottenuta dopo un po 'di elaborazione del testo (con l'obiettivo finale di eseguire l'analisi semantica latente) e non riesco a capire perché questo sta accadendo come la mia macchina a 64 bit ha 16 GB di RAM. Il momento svd(self.A) viene chiamato, genera un errore. L'errore esatto è il seguente:L'applicazione di SVD genera istantaneamente un errore di memoria?

Traceback (most recent call last): 
    File ".\SVD.py", line 985, in <module> 
    _svd.calc() 
    File ".\SVD.py", line 534, in calc 
    self.U, self.S, self.Vt = svd(self.A) 
    File "C:\Python26\lib\site-packages\scipy\linalg\decomp_svd.py", line 81, in svd 
    overwrite_a = overwrite_a) 
MemoryError 

Così ho provato ad utilizzare

self.U, self.S, self.Vt = svd(self.A, full_matrices= False) 

e questa volta, si getta il seguente errore:

Traceback (most recent call last): 
    File ".\SVD.py", line 985, in <module> 
    _svd.calc() 
    File ".\SVD.py", line 534, in calc 
    self.U, self.S, self.Vt = svd(self.A, full_matrices= False) 
    File "C:\Python26\lib\site-packages\scipy\linalg\decomp_svd.py", line 71, in svd 
    return numpy.linalg.svd(a, full_matrices=0, compute_uv=compute_uv) 
    File "C:\Python26\lib\site-packages\numpy\linalg\linalg.py", line 1317, in svd 
    work = zeros((lwork,), t) 
MemoryError 

è questo dovrebbe essere un così grande matrice che Numpy non può gestire e c'è qualcosa che posso fare in questa fase senza cambiare la metodologia stessa?

+0

Quanta memoria è utilizzata da Python nel punto in cui tenta di calcolare SVD? Stai usando Python a 32 o 64 bit? –

+0

@Ferdinand Beyer: utilizza 380 MB quando si blocca. Ah! :(Sto usando un Python a 32 bit, andrò avanti e installerò la versione a 64 bit – Legend

+0

@Ferdinand Beyer: Sei un vero salvatore! In qualche modo quel punto mi ha saltato la mente, funziona perfettamente ora! Grazie – Legend

risposta

2

A quanto pare, grazie a @Ferdinand Beyer, non ho notato che stavo usando una versione a 32 bit di Python sulla mia macchina a 64 bit.

L'utilizzo di una versione a 64 bit di Python e la reinstallazione di tutte le librerie hanno risolto il problema.

8

Sì, il parametro full_matrices a scipy.linalg.svd è importante: il vostro contributo è altamente rango-deficienti (rango max 3.241), in modo da non vogliono destinare l'intera matrice 12.596 x 12.596 per V!

Ancora più importante, le matrici provenienti dall'elaborazione del testo sono probabilmente molto sparse. Il scipy.linalg.svd è denso e non offre SVD troncato, il che si traduce in a) prestazioni tragiche eb) un sacco di memoria sprecata.

Dai un'occhiata al pacchetto sparseSVD da PyPI, che funziona su input sparsi e puoi chiedere solo i fattori principali K. Oppure prova scipy.sparse.linalg.svd, anche se non è così efficiente e disponibile solo nelle versioni più recenti di Scipy.

Oppure, per evitare completamente i dettagli grintosi, utilizzare un pacchetto che rende LSA efficiente per te in modo trasparente, come ad esempio gensim.

Problemi correlati