Для редукции модели я хочу вычислить левые сингулярные векторы, связанные с, скажем, 20-ю самыми большими сингулярными значениями матрицы , где N ≈ 10 6 и k ≈ 10 3 . К сожалению, моя матрица А будет плотной без какой-либо структуры.
Если я просто вызываю svd
подпрограмму из numpy.linalg
модуля в Python для случайной матрицы такого размера, я сталкиваюсь с ошибкой памяти. Это связано с распределением для разложения А = V S U .
Существуют ли алгоритмы, позволяющие избежать этой ловушки? Например, путем установки только сингулярных векторов, связанных с ненулевыми сингулярными значениями.
Я готов торговать временем и точностью вычислений.
full_matrices
которая имеет значение False, так что вычисляются только «ненулевые» части. Тем не менее, есть ли способ уменьшить вычисления еще дальше?numpy
Бэкенд использует FORtran код,LAPACKE_dgesvd
обычные для стандартных СВДА. Тем не менее, как правило, ваша матрицаC_CONTIGOUS
(проверить сmatrix.flags
). Поэтому он копирует данные для выравнивания Фортрана. Кроме того, при запуске процедуры lapack dgesvd необходима еще одна копия вашей матрицы (или, по крайней мере, память для нее). Вы можете избавиться от одной копии, если вы убедитесь, что выравнивание памяти выполнено в стиле Fortran с самого начала.Ответы:
Если вы хотите только несколько особых значений / векторов, ARPACK должен сделать свое дело. Документы SVD не очень хороши , и этот дистрибутив более актуален.
РЕДАКТИРОВАТЬ: Если вы хотите сделать это в Python, SciPy имеет оболочку . Поскольку ваша матрица плотная, вы можете попробовать формат блочной строки (BSR).
источник
Взгляните на sklearn.decomposition.TruncatedSVD в scikit-learn 0.14-rc.
(Я полагаю, что люди, изучающие scikit, следуют stackoverflow.com/questions/tagged/scikit-learn , поэтому я бы задал там подробные вопросы.)
источник
Может быть, вы можете попробовать это.
https://github.com/jakevdp/pypropack
Это оболочка Python для пакета PROPACK, которая реализует эффективные частичные разложения по сингулярным числам больших разреженных матриц и линейных операторов.
источник
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 или любой другой механизм переноса.
источник