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