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