Ефективні в пам’яті реалізації часткових сингулярних декомпозицій (SVD)


10

Для скорочення моделі я хочу обчислити ліві сингулярні вектори, пов'язані з - скажімо, 20 - найбільшими сингулярними значеннями матриці , де N 10 6 та k 10 3 . На жаль, моя матриця A буде щільною без будь-якої структури.АRN,кN106к103А

Якщо я просто викликаю svdрутину з numpy.linalgмодуля в Python для випадкової матриці такого розміру, я стикаюся з помилкою пам'яті. Це пов'язано з розподілом для розкладання А = V S U .VRN,NA=VSU

Чи існують алгоритми навколо, які уникають цієї нерівності? Наприклад, встановивши лише сингулярні вектори, асоційовані з ненульовими сингулярними значеннями.

Я готовий торгувати обчислювальним часом та точністю.


1
Цікаво, здається, що Numpy не знає, як зробити тонкий SVD ...
JM

Дякую за підказку. Дійсно, numpy.linalg.svd має опцію full_matrices, встановлену на False, щоб обчислювались лише "ненулі" частини. Тим не менш, чи є спосіб зменшити обчислення ще більше?
січня

3
numpyБекенд використовує FORtran код, LAPACKE_dgesvdзвичайні для стандартних СВДА. Однак, як правило, ваша матриця є C_CONTIGOUS(позначте matrix.flags). Тому він копіює дані для вирівнювання fortran. Крім того, під час запуску програми lapack dgesvd потрібна ще одна копія вашої матриці (або принаймні пам'ять для неї). Ви можете позбутися однієї копії, якщо переконаєтесь, що вирівнювання пам’яті є стилем fortran з самого початку.
Борт

Відповіді:


6

Якщо ви хочете лише декілька сингулярних значень / векторів, ARPACK повинен зробити свою справу. Документи SVD не великі, і цей розподіл є більш сучасним.

EDIT: Якщо ви хочете зробити це в python, у SciPy є обгортка . Оскільки ваша матриця щільна, ви можете спробувати формат блоку рядкових рядків (BSR).


Я подивлюся, як ARPACK інтегрується з пітоном ...
Jan

1
Схоже, у scipy є обгортки. Я додам їх, щоб відповісти тілом.
Макс Хатчінсон


2

Можливо, ви можете спробувати це.

https://github.com/jakevdp/pypropack

Це обгортка Python для пакету PROPACK, яка реалізує ефективні часткові розклади сингулярного значення великих розріджених матриць та лінійних операторів.


2

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 або будь-який інший механізм обгортання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.