У меня есть большая (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, который может помочь с проблемой памяти и сделает работу вразумное количество времени (максимум пару дней).
Спасибо за ответ заранее!