2011-08-22 14 views
5

Estoy tratando de aplicar SVD en mi matriz (3241 x 12596) que se obtuvo después de un procesamiento de texto (con el objetivo final de realizar análisis semántico latente) y no puedo entender por qué está sucediendo esto como mi máquina de 64 bits tiene 16GB de RAM En el momento en que se llama al svd(self.A), arroja un error. Se da el error precisa a continuación:Al aplicar SVD, ¿se produce un error de memoria instantáneamente?

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 

así que he intentado usar

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

y esta vez, que arroja el siguiente error:

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 

Es éste supone que es un gran tamaño, matriz que Numpy no puede manejar y ¿hay algo que pueda hacer en esta etapa sin cambiar la metodología en sí?

+0

¿Cuánta memoria usa Python en el punto en que intenta calcular la SVD? ¿Estás ejecutando Python de 32 bits o 64 bits? –

+0

@Ferdinand Beyer: está utilizando 380 MB cuando se bloquea. Ah! :(Estoy usando un Python de 32 bits. Voy a seguir adelante e instalar la versión de 64 bits. – Legend

+0

@Ferdinand Beyer: ¡Eres un verdadero salvador! De alguna manera ese punto se me pasó por la mente. ¡Funciona perfectamente bien ahora! Muchas gracias mucho. – Legend

Respuesta

2

Aparentemente, gracias a @Ferdinand Beyer, no noté que estaba usando una versión de 32 bits de Python en mi máquina de 64 bits.

El uso de una versión de 64 bits de Python y la reinstalación de todas las bibliotecas resolvió el problema.

8

Sí, el parámetro full_matrices a scipy.linalg.svd es importante: su opinión es muy deficiente en rango (máximo rango 3241), por lo que no quieren asignar toda la matriz de 12,596 x 12,596 para V!

Más importante aún, las matrices provenientes del procesamiento de texto son probablemente muy dispersas. El scipy.linalg.svd es denso y no ofrece SVD truncada, lo que resulta en a) un rendimiento trágico yb) una gran cantidad de memoria desperdiciada.

Eche un vistazo al paquete sparseSVD de PyPI, que funciona con entradas dispersas y solo puede solicitar los factores K superiores. O pruebe scipy.sparse.linalg.svd, aunque eso no es tan eficiente y solo está disponible en las versiones más recientes de scipy.

O, para evitar los detalles arenosos por completo, utilice un paquete que hace eficiente LSA para usted de manera transparente, como gensim.

Cuestiones relacionadas