Для редукции модели я хочу вычислить левые сингулярные векторы, связанные с, скажем, 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 с самого начала.