Як зробити SVD та PCA з великими даними?


29

У мене великий набір даних (близько 8 ГБ). Я хотів би використовувати машинне навчання для його аналізу. Отже, я думаю, що я повинен використовувати SVD, а потім PCA, щоб зменшити розмірність даних для ефективності. Однак MATLAB і Octave не можуть завантажити такий великий набір даних.

Які інструменти я можу використовувати для створення SVD з таким великим обсягом даних?


Привіт, ласкаво просимо до DS! Можливо, ви могли б трохи уточнити свій набір даних. Скільки у вас рядків і стовпців? Це може вплинути на можливі рішення.
S. Kolassa - Відновити Моніку

23711341 рядки та 8 стовпців. Я міг би спробувати видалити 1-2 стовпці. Вони, схоже, не пов'язані з моєю проблемою.
Девід С.

Слід відібрати рядки перед стовпцями. Чи є причина, що ви не можете вибирати випадкові вибірки рядків, щоб зменшити розмір даних? Я припускаю, що рядки тут пов’язані з користувачами чи що-небудь
cwharland,

Вибачте, якщо я не дав про себе зрозуміти. Моя мета - зробити PCA. Я думаю, що SVD на вибіркових даних не може допомогти мені зробити PCA, правда?
Девід С.

PCA зазвичай реалізується за допомогою обчислення SVD на коваріаційній матриці. Обчислення коваріаційної матриці є незручно паралельним завданням, тому вона повинна легко масштабуватися з кількістю записів.
Аноні-Мус

Відповіді:


41

Перш за все, зменшення розмірності застосовується, коли у вас є багато коваріантних розмірів і ви хочете зменшити розмір проблеми, обертаючи точки даних на нову ортогональну основу і беручи лише осі з найбільшою дисперсією. За допомогою 8 змінних (стовпців) ваш простір вже низькомірний, зменшення кількості змінних додатково навряд чи вирішить технічні проблеми з розміром пам'яті, але може сильно вплинути на якість набору даних. У вашому конкретному випадку більш перспективним є вивчення онлайн-навчанняметоди. Грубо кажучи, замість того, щоб працювати з усім набором даних, ці методи беруть частину з них (часто їх називають "міні-партіями") і будують модель поступово. (Мені особисто подобається трактувати слово "онлайн" як посилання на якийсь нескінченно довгий джерело даних з Інтернету, як канал каналу Twitter, де ви просто не можете завантажити весь набір даних відразу).

Але що робити, якщо ви дійсно хотіли застосувати техніку зменшення розмірності, як PCA, до набору даних, який не вписується в пам'ять? Зазвичай набір даних представлений у вигляді матриці даних X розміром n x m , де n - кількість спостережень (рядків) і m - кількість змінних (стовпців). Зазвичай проблеми з пам'яттю виникають лише з одного з цих двох номерів.

Занадто багато спостережень (n >> м)

Якщо у вас занадто багато спостережень , але кількість змінних від невеликої до помірної, ви можете будувати матрицю коваріації поступово . Дійсно, типовий PCA складається з побудови коваріаційної матриці розміром m x m та застосування до неї розкладання сингулярного значення. З m = 1000 змінних типу float64 матриця коваріації має розмір 1000 * 1000 * 8 ~ 8Mb, яка легко вписується в пам'ять і може використовуватися з SVD. Тож вам потрібно лише створити коваріаційну матрицю без завантаження всього набору даних у пам'ять - досить простежується завдання .

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

Забагато змінних (n << м)

З іншого боку, іноді, коли у вас занадто багато змінних , сама матриця коваріації не впишеться в пам'ять. Наприклад, якщо ви працюєте з зображеннями 640x480, кожне спостереження має 640 * 480 = 307200 змінних, що призводить до коваріаційної матриці 703Gb! Це точно не те, що ви хотіли б зберегти в пам’яті свого комп’ютера або навіть у пам’яті свого кластера. Тому нам потрібно зменшити розміри, не будуючи взагалі матриці коваріації.

Мій улюблений метод для цього - випадкова проекція . Якщо коротко, якщо у вас є набір даних X розміром n x m , ви можете помножити його на деяку розріджену випадкову матрицю R розміру m x kk << m ) та отримати нову матрицю X ' значно меншого розміру n x k з приблизно тими ж властивостями , що і оригінальний. Чому це працює? Ну, ви повинні знати, що PCA має на меті знайти набір ортогональних осей (основних компонентів) та спроектувати ваші дані на перший kїх. Виявляється, розріджені випадкові вектори майже ортогональні, і тому вони також можуть використовуватися як нова основа.

І, звичайно, не потрібно множувати весь набір даних X на R - ви можете перевести кожне спостереження x в нову основу окремо або в міні-партії.

Існує також дещо схожий алгоритм, який називається Random SVD . Я не маю реального досвіду з цим, але ви можете знайти приклад коду з поясненнями тут .


Нижче наведено короткий контрольний список зменшення розмірності великих наборів даних:

  1. Якщо у вас не так багато вимірів (змінних), просто використовуйте онлайн-алгоритми навчання.
  2. Якщо спостережень багато, але помірна кількість змінних (коваріаційна матриця вписується в пам'ять), побудуйте матрицю поступово і використовуйте звичайний SVD.
  3. Якщо кількість змінних занадто велика, використовуйте алгоритми покрокових змін.

3
Загалом, мені подобається ваша відповідь, але вступне речення не зовсім правильне. PCA не підходить для багатьох розмірів з низькою дисперсією; швидше, він підходить для багатьох розмірів з корельованою дисперсією. Для даного набору даних дисперсія може бути високою у всіх вимірах, але поки існує висока коваріація, PCA все ще може призвести до значного зменшення розмірності.
богатрон

1
@bogatron: хороший улов, дякую. Насправді я мав на увазі велику / низьку дисперсію в деяких розмірах, можливо, не оригінальних. Наприклад, на цьому малюнку ці розміри визначаються двома стрілками, а не оригінальними осями х / у. PCA прагне знайти ці нові осі та сортує їх за значенням дисперсії вздовж кожної осі. У будь-якому випадку, як ви вказали, це було поганим формулюванням, тому я спробував переформулювати свою ідею. Сподіваюся, зараз це зрозуміліше.
дружина

Це для мене сенс. +1.
богарон

7

Не турбуйся.

Перше правило програмування - яке також стосується науки про дані: знайдіть все, що працює над невеликою тестовою проблемою.

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

крім того, ви не хочете застосовувати svd лише до 8 стовпців: ви застосовуєте його, коли у вас є багато стовпців.


1
+1, оскільки ви не хочете застосовувати svd лише до 8 стовпців: ви застосовуєте його, коли у вас є багато стовпців.
S. Kolassa - Відновіть Моніку

6

PCA зазвичай реалізується за допомогою обчислення SVD на коваріаційній матриці.

Обчислення матриці коваріації є незручно паралельним завданням, тому вона масштабує лінійну кількість записів і тривіально розподіляти на декількох машинах!

Просто зробіть один прохід над вашими даними, щоб обчислити засоби. Потім другий прохід для обчислення матриці коваріації. Це можна зробити за допомогою зменшення карт легко - по суті це те саме, що знову обчислити засоби. Сума термінів, як і в коваріації, тривіальна для паралелізації! Можливо, вам потрібно буде звернути увагу на числові дані лише підсумовуючи велику кількість подібної величини.

Все стає іншим, коли у вас величезна кількість змінних . Але в системі 8 Гб ви повинні мати змогу запускати PCA на пам’яті до 20 000 розмірів в пам'яті з бібліотеками BLAS. Але тоді ви можете зіткнутися з проблемою, що PCA вже не настільки надійний, оскільки він має занадто багато ступенів свободи. Іншими словами: це легко перетворюється. Я бачив рекомендацію мати принаймні 10 * d * d записів (або це було d ^ 3). Отже, для 10000 розмірів ви повинні мати принаймні мільярд записів (з 10000 розмірів ... це багато!), Щоб результат був статистично надійним.


1

Хоча ви, ймовірно, можете знайти деякі інструменти, які дозволять вам це робити на одній машині, ви потрапляєте у діапазон, де має сенс розглянути такі інструменти "великих даних", як Spark, особливо якщо ви думаєте, що набір даних може зрости. Spark має компонент MLlib, який підтримує PCA та SVD. Документація має приклади .



0

Я б рекомендував python, якщо ви ліниво оціните файл, у вас буде мізерний слід пам'яті, а numpy / scipy надасть вам доступ до всіх інструментів Octave / Matlab.

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