Як обчислити SVD величезної розрідженої матриці?


26

Який найкращий спосіб обчислити сингулярне розкладання величини (SVD) дуже великої позитивної матриці (65M x 3.4M), де дані надзвичайно рідкі?

Менше 0,1% матриці не дорівнює нулю. Мені потрібен спосіб, який:

  • впишеться в пам'ять (я знаю, що існують онлайн-методи)
  • буде обчислено у розумний час: 3,4 дня
  • буде досить точним, проте точність не є моєю основною проблемою, і я хотів би мати можливість контролювати, скільки ресурсів я вклав у це.

Було б чудово мати бібліотеку Haskell, Python, C # тощо, яка реалізує її. Я не використовую математику або R, але при необхідності я можу піти з Р.


3
Скільки у вас пам’яті? 0,1% 65M * 3,4M все ще становить 221e9 ненульових значень. Якщо ви використовуєте 4 байти на значення, це все-таки більше 55 Гбіт, не допускаючи накладних витрат, тому розрідженість все ще не вирішує проблему ... Чи потрібно завантажувати весь набір в пам'ять відразу?
Побіт

Я повинен був бути більш точним. Не більше 250-500 Мб з 32-бітним цілим числом. Напевно, набагато менше, але розмірність - це проблема, наскільки я це розумію. У мене машина на 16 Гб.
Соня

Як щодо цього? quora.com / ...
побітовое

Ця веб-сторінка посилається на бібліотеку Python, яка реалізує "швидкий, інкрементальний алгоритм SVD з низькою пам'яттю": en.wikipedia.org/wiki/Latent_semantic_analysis
побіжно

Відповіді:


21

Якщо вона вписується в пам'ять, побудуйте розріджену матрицю в R за допомогою пакету Matrix і спробуйте irlba для SVD. Ви можете вказати, скільки сингулярних векторів ви хочете отримати в результаті, що є ще одним способом обмеження обчислення.

Це досить велика матриця, але я мав дуже хороші результати з цим методом у минулому. irlbaє досить сучасним. Він використовує неявно перезапущений алгоритм дводіагоналізації Ланцоса .

Він може пережовувати набір даних призів netflix (480,189 рядків на 17,770 стовпців, 100,480,507 ненульових записів) за мілісекунди. Ваш набір даних приблизно в 200 000 разів більший, ніж набір даних Netflix, тому він займає значно більше часу. Можна було б розраховувати, що він зможе зробити обчислення за пару днів.


матриця даних вписується в пам'ять, чи буде irlba впоратися з розкладанням також ефективним способом пам'яті?
Соня

@Sonia: irlba - це дуже ефективна пам'ять: вона обчислює приблизне рішення, ви можете обмежити кількість сингулярних векторів, і він був розроблений для роботи над розрідженими матрицями. Наскільки я знаю, це так швидко, як ви збираєтеся отримати для обчислення часткових SVD.
Зак

@Sonia: Удачі!
Зак

Дайте йому випробувати пам'ять ... Я обчислю форму блоку трикутника перед його запуском.
Соня

@ Соня, чи зберігається він як розріджений Matrix? Спробуйте обмежити кількість одиничних значень, які ви обчислюєте ... можливо, просто подивіться на топ-10?
Зак

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