Эффективные по памяти реализации частичных сингулярных разложений (SVD)

10

Для редукции модели я хочу вычислить левые сингулярные векторы, связанные с, скажем, 20-ю самыми большими сингулярными значениями матрицы , где N 10 6 и k 10 3 . К сожалению, моя матрица А будет плотной без какой-либо структуры.ARN,kN106k103A

Если я просто вызываю svdподпрограмму из numpy.linalgмодуля в Python для случайной матрицы такого размера, я сталкиваюсь с ошибкой памяти. Это связано с распределением для разложения А = V S U .VRN,NA=VSU

Существуют ли алгоритмы, позволяющие избежать этой ловушки? Например, путем установки только сингулярных векторов, связанных с ненулевыми сингулярными значениями.

Я готов торговать временем и точностью вычислений.

январь
источник
1
Интересно, кажется, Numpy не знает, как сделать тонкий SVD ...
JM
Спасибо за подсказку. Действительно, numpy.linalg.svd имеет опцию, full_matricesкоторая имеет значение False, так что вычисляются только «ненулевые» части. Тем не менее, есть ли способ уменьшить вычисления еще дальше?
января
3
numpyБэкенд использует FORtran код, LAPACKE_dgesvdобычные для стандартных СВДА. Тем не менее, как правило, ваша матрица C_CONTIGOUS(проверить с matrix.flags). Поэтому он копирует данные для выравнивания Фортрана. Кроме того, при запуске процедуры lapack dgesvd необходима еще одна копия вашей матрицы (или, по крайней мере, память для нее). Вы можете избавиться от одной копии, если вы убедитесь, что выравнивание памяти выполнено в стиле Fortran с самого начала.
Борт

Ответы:

6

Если вы хотите только несколько особых значений / векторов, ARPACK должен сделать свое дело. Документы SVD не очень хороши , и этот дистрибутив более актуален.

РЕДАКТИРОВАТЬ: Если вы хотите сделать это в Python, SciPy имеет оболочку . Поскольку ваша матрица плотная, вы можете попробовать формат блочной строки (BSR).

Макс Хатчинсон
источник
Я посмотрю, как ARPACK интегрируется с питоном ...
Jan
1
Похоже, у Сципи есть фантики. Я добавлю их, чтобы ответить на тело.
Макс Хатчинсон
2

Может быть, вы можете попробовать это.

https://github.com/jakevdp/pypropack

Это оболочка Python для пакета PROPACK, которая реализует эффективные частичные разложения по сингулярным числам больших разреженных матриц и линейных операторов.

Масс Чжоу
источник
2

Intel MKL реализует новый алгоритм Jacobi-SVD. Вот подробности реализации: http://www.netlib.org/lapack/lawnspdf/lawn169.pdf http://www.fernuni-hagen.de/MATHPHYS/veselic/downloads/j02.pdf

И подпрограмма LAPACK: http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-732F9EE1-BCEC-4D9B-9B93-AF5499B21140.htm#DRMAC08-1

Размер работы, конечно, регулируется. Вы можете легко вызывать функции C из Python, используя Cython, SWIG или любой другой механизм переноса.

Толга Бердал
источник