Застосовуйте PCA на дуже великій розрідженій матриці


16

Я виконую завдання з класифікації тексту за допомогою R і отримую документ-термінну матрицю розміром 22490 на 120 000 (лише 4 мільйони ненульових записів, менше 1% записів). Тепер я хочу зменшити розмірність, використовуючи PCA (аналіз основних компонентів). На жаль, R не може впоратися з цією величезною матрицею, тому я зберігаю цю розріджену матрицю у файлі "Формат ринку матриць", сподіваючись використовувати деякі інші методи для PCA.

Тож чи міг би хтось дати мені підказки щодо корисних бібліотек (незалежно від мови програмування), який міг би легко зробити PCA з цією масштабною матрицею або зробити власний PCA самостійно, іншими словами, спершу обчислити матрицю коваріації, і потім обчислюють власні значення та власні вектори для матриці коваріації .

Що я хочу - це обчислити всі ПК (120 000) і вибрати лише верхні N ПК, на які припадає 90% дисперсії . Очевидно, що в цьому випадку я повинен дати поріг апріорі, щоб встановити деякі дуже крихітні значення дисперсії до 0 (в коваріаційній матриці), інакше матриця коваріації не буде розрідженою і її розмір складе 120 000 на 120 000, тобто неможливо впоратися з однією єдиною машиною. Крім того, навантаження (власні вектори) будуть надзвичайно великими, і їх слід зберігати в розрідженому форматі.

Дуже дякую за будь-яку допомогу!

Примітка: я використовую машину з 24 ГБ оперативної пам’яті та 8 процесорних ядер.


Наскільки розріджена матриця? Як ви використовуєте отриманий SVD? Якщо вам потрібна лише її частина, ви, ймовірно, могли б визначити її набагато дешевше.
Арнольд Ноймаєр

@ArnoldNeumaier Вибачте, я забув додати розріджену інформацію. Я оновив публікацію разом із повною ідеєю.
Ensom Hodder

кожен із запропонованих у відповідях SLEPc, mahout та irlba здається підходящим для вашої проблеми.
Арнольд Ноймаєр

1
Чому ви хочете обчислити всі 120 кб? Здається, що ви просто хочете тих, хто становить 90% дисперсії, що має бути набагато дешевше для обчислення.
Джед Браун

@JedBrown Hey Jed, ти абсолютно прав! Мене цікавлять лише ті, хто складає 90% дисперсії, а також відповідні власні вектори (для подальшої трансформації тестового набору даних). Чи можете ви, будь ласка, повідомити про ваші дешевші методи ?
Ensom Hodder

Відповіді:


4

Я пропоную пакет irlba - він дає практично ті ж результати, що і svd, але ви можете визначити меншу кількість сингулярних значень для вирішення. Приклад використання малих матриць для вирішення призу Netflix можна знайти тут: http://bigcomputing.blogspot.de/2011/05/bryan-lewiss-vignette-on-irlba-for-svd.html


Дякуємо за ваші коментарі. Насправді я вчора переглядав це відео, а також спробував пакет irlba , але здавалося, що його можна використовувати лише для обчислення кількох сингулярних значень. Однак, як зазначено у публікації, я хочу обчислити ВСІ особливі значення (120 000), щоб вибрати відповідну кількість ПК відповідно до відхилень, на які вони припадають. У цьому випадку, я думаю, irlba вже не підходить.
Ensom Hodder

Чи можете ви використовувати результати SVD аналогічно PCA? Чи не потрібно вам центрувати дані перед тим, як робити SVD, щоб виконати PCA?
Зак

@Zach - SVD є основним алгоритмом PCA (див. Prcomp - stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ). Центрування даних також є стандартною процедурою перед піддаванням PCA, хоча існує велика кількість варіантів залежно від вашого питання (наприклад, можуть застосовуватися також різні типи масштабування).
Марк у коробці

Наскільки велика угода, якщо я не центую дані перед SVD? У мене розріджена матриця, яка вписується в пам'ять, але центрування зробить її щільною і занадто великою, щоб вписатися в пам'ять.
Зак

@Zach - Це дійсно залежить від того, як ви хочете співвіднести свої зразки один з одним. Якщо ви не можете працювати з централізованими даними через обмеження пам’яті, то, мабуть, рішення було прийнято саме для вас. Як правило, дані центрування мають PCA працювати на коваріаційній матриці зразків, тоді як центрирування та масштабування даних має PCA працювати на кореляційній матриці. Для більш детального ознайомлення з цими рішеннями ви можете поставити запитання на сайті stats.stackexchange.com або переглянути наявні відповіді щодо PCA.
Марк у коробці

8

Я пропоную використовувати SLEPc для обчислення часткового SVD. Докладніше див. Розділ 4 Посібника користувача та довідкові сторінки SVD .


1
Оскільки він хоче PCA, він повинен центрувати дані перед обчисленням SVD. Це призведе до руйнування рідкості. Чи є спосіб, який SLEPc вміщує для цього?
dranxo

3
Це просто рідкісний + низький ранг. SLEPc не потребує матричних записів, а лише лінійний оператор, який можна застосувати як розріджену матрицю плюс корекцію.
Джед Браун

2

Я голосую за маху, що також добре для інших завдань НЛП / ТА та виконує карту / зменшення.


Так, ви маєте рацію, mahout точно в моїй дорожній карті. Але я вважаю за краще заздалегідь створити прототип з деякими "простими" (я вважаю) методами.
Ensom Hodder

1

Я б запропонував використовувати інкрементальне розмежування сингулярного значення, якого в літературі багато. Наприклад:

  • технічні звіти марки Меттью 1 та 2 досить прості у дотриманні
  • Магістерська робота Кріса Бейкера , його програмне забезпечення IncPACK та його пізніша робота про інкрементальний метод SVD
  • Бунк і Нільсен опублікували найбільш ранній відомий документ
  • Документи Холла щодо оновлення задач 1 та 2 власного значення
  • Послідовний аналіз Кархунена-Льова Леві та ін., Що в основному те саме

Усі ці підходи зводяться до наступного:

  • почніть з невеликого набору даних
  • якось обчислити SVD (цей крок є тривіальним для однієї матриці стовпців)
  • повторити до кінця:
    • додати новий набір даних
    • використовувати існуючі правила SVD та оновлення для обчислення SVD нового набору даних

N


0

Ще можна використовувати Р.

Revolution Rце збірка R, яка обробляє набори даних, що перевищують оперативну пам'ять. Використовуйте функцію princomp.

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

Ви можете безкоштовно завантажити повнофункціональну версію Academic, поставивши галочку "Я - академічний".

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