Для скорочення моделі я хочу обчислити ліві сингулярні вектори, пов'язані з - скажімо, 20 - найбільшими сингулярними значеннями матриці , де N ≈ 10 6 та k ≈ 10 3 . На жаль, моя матриця A буде щільною без будь-якої структури.
Якщо я просто викликаю svd
рутину з numpy.linalg
модуля в Python для випадкової матриці такого розміру, я стикаюся з помилкою пам'яті. Це пов'язано з розподілом для розкладання А = V S U .
Чи існують алгоритми навколо, які уникають цієї нерівності? Наприклад, встановивши лише сингулярні вектори, асоційовані з ненульовими сингулярними значеннями.
Я готовий торгувати обчислювальним часом та точністю.
full_matrices
, встановлену на False, щоб обчислювались лише "ненулі" частини. Тим не менш, чи є спосіб зменшити обчислення ще більше?
numpy
Бекенд використовує FORtran код, LAPACKE_dgesvd
звичайні для стандартних СВДА. Однак, як правило, ваша матриця є C_CONTIGOUS
(позначте matrix.flags
). Тому він копіює дані для вирівнювання fortran. Крім того, під час запуску програми lapack dgesvd потрібна ще одна копія вашої матриці (або принаймні пам'ять для неї). Ви можете позбутися однієї копії, якщо переконаєтесь, що вирівнювання пам’яті є стилем fortran з самого початку.