Применение SVD мгновенно вызывает ошибку памяти? - PullRequest
6 голосов
/ 22 августа 2011

Я пытаюсь применить SVD к моей матрице (3241 x 12596), которая была получена после некоторой обработки текста (с конечной целью выполнения скрытого семантического анализа), и я не могу понять, почему это происходит как мой 64-разрядный Машина имеет 16 ГБ оперативной памяти. Момент svd(self.A) вызывается, выдает ошибку. Точная ошибка приведена ниже:

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

Итак, я попытался использовать

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

и на этот раз выдает следующую ошибку:

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

Предполагается, что это такая большая матрица, с которой Нампи не может справиться, и есть ли что-то, что я могу сделать на этом этапе без изменения самой методологии?

Ответы [ 2 ]

10 голосов
/ 23 августа 2011

Да, параметр full_matrices для scipy.linalg.svd важен: ваш вход крайне недостаточен (ранг макс. 3241), поэтому вы не хотите выделять всю матрицу 12 596 x 12 596 для V!

Что еще более важно, матрицы, поступающие в результате обработки текста, вероятно, очень разреженные .scipy.linalg.svd является плотным и не предлагает усеченного SVD, что приводит к а) трагической производительности и б) большому количеству потраченной впустую памяти.

Посмотрите на пакет sparseSVD от PyPI, который работает с разреженным вводом, и вы можете запросить только верхние K факторы.Или попробуйте scipy.sparse.linalg.svd, хотя это не так эффективно и доступно только в новых версиях scipy.

Или, чтобы полностью избежать мелких деталей, используйте пакет, который делает эффективный LSA для вас прозрачным, например, gensim .

2 голосов
/ 22 августа 2011

Как оказалось, благодаря @Ferdinand Beyer я не заметил, что на моей 64-битной машине я использовал 32-битную версию Python.

Использование 64-битной версии Python и переустановка всех библиотек решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...