Какой самый быстрый способ вычисления частичного SVD огромной матрицы с использованием библиотек Python? - PullRequest
1 голос
/ 31 мая 2019

У меня есть большая (500k x 300k) плотная матрица, для которой мне нужно найти верх прибл.50 сингулярных значений (высокая точность не важна) и соответствующие сингулярные векторы.У меня есть доступ к экземплярам Amazon SageMaker, что позволяет мне использовать до 256 ГБ ОЗУ, однако матрица занимает около 600 ГБ, поэтому ее нельзя хранить в памяти.

Чтобы обойти эту проблему, вычисление матрично-векторных произведений с этой матрицей довольно быстро и распараллеливается с использованием Tensorflow.

Я рассмотрел некоторые связанные вопросы, такие как https://stats.stackexchange.com/questions/41259/how-to-compute-svd-of-a-huge-sparse-matrix, однако весь рабочий процесс реализован в Python / Tensorflow и, следовательно, использование R. было бы значительным расходом.

Во-первых, я попытался использовать numpy.linalg.svd, который может использовать многоядерное выполнение, однако, как я упоминал, я не могу поместить всю матрицу в память и мне не нужен полный SVD (это единственный вариант, поскольку он использует LAPACK).

Во-вторых, я попробовал scipy.sparse.linalg.svds, который использует ARPACK и берет LinearOperator вместо матрицы.Это решило проблемы с памятью, однако эта реализация ARPACK, похоже, использует одно ядро ​​для SVD (даже при том, что умножение матрицы на вектор выполняется на нескольких ядрах) и, следовательно, чрезвычайно медленно.Тот факт, что матрица плотная, делает проблему намного хуже.

Я был бы очень признателен, если бы подобные проблемы обычно решались.Возможно, я упустил некоторые встроенные функции numpy или scipy, но я также открыт для других практических алгоритмов, не доступных в библиотеках Python, для частичного SVD, который может помочь с проблемой памяти и сделает работу вразумное количество времени (максимум пару дней).
Спасибо за ответ заранее!

...