Найшвидший алгоритм PCA для об'ємних даних


11

Я хотів би виконати PCA на наборі даних, що складається приблизно з 40 000 зразків, кожен зразок має приблизно 10 000 функцій.

Використання функції Matlab princomp послідовно займає більше півгодини, після чого я вбиваю процес. Я хотів би знайти реалізацію / алгоритм, який працює менше ніж за 10 хвилин. Який би був найшвидший алгоритм? Скільки часу знадобиться двоядерний i7 / 4 ГБ Ram i7?


Так, ви праві, я повинен бути більш точним. Проходить більше півгодини, тоді я вирішив вбити процес. Я повинен зробити це хоча б десять разів, хіба було б добре, щоб щось працювало менше ніж за 10 хвилин
mellow

Наскільки розріджена ваша матриця?
Арнольд Ноймаєр

Відсоток нулів у матриці вище 80%
м'який

Перевірте також kernal-PCA.
meawoppl

Відповіді:


11

Перш за все, вам слід вказати, чи хочете ви всі компоненти чи найбільш значущі?

Позначимо матрицю причому - кількість зразків і розмірність. N MARN×MNM

Якщо ви хочете, щоб усі компоненти були класичним шляхом, це обчислити коваріаційну матрицю (яка має складність у часі ), а потім застосувати до неї SVD (додаткові ). З точки зору пам'яті це займе (ковариационная матриця + сингулярні вектори і значення формує прямокутний базис) або Гб в подвійній точності для конкретного . O ( N M 2 ) O ( M 3 ) O ( 2 M 2 ) 1,5 ACRM×MO(NM2)O(M3)O(2M2)1.5A

Ви можете застосувати SVD безпосередньо до матриці якщо нормалізувати кожен вимір до цього і взяти ліві особливі вектори. Однак практично я б очікував, що SVD матриці триватиме довше.AAA

Якщо вам потрібна лише частина (можливо, найбільш значущих) компонентів, ви можете застосувати ітераційний PCA . Наскільки мені відомо, всі ці алгоритми тісно пов'язані з процесом Ланцоса, таким чином, ви залежите від спектру і практично буде важко досягти точності SVD для отриманих векторів, і він погіршиться з кількістю сингулярного вектора.C


2

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

В Matlab див

допомогти svds


Так, здається, що ітераційні методи набагато швидші, якщо мені потрібні лише перші сто компонентів.
солодкий

Що стосується svds, я спробував поставити свою матрицю в розріджений формат і змінити функцію princomp, щоб поставити svds замість svd, і, на мій подив, на матрицю 2000 * 4000 (180 s замість 15s це зайняло набагато більше часу) ). Bizarre ...
mellow

1
Не потрібно переходити на рідкий формат. Крім того, вам потрібно зменшити кількість сингулярних векторів, які ви хочете обчислити. Для обчислення повного svd, svds не підходить.
Арнольд Ноймаєр

2
Також домінуючими для домінуючих режимів є новіші рандомізовані методи svd, як у stanford.edu/group/mmds/slides2010/Martinsson.pdf
Нік Алгер


1

Ви можете спробувати алгоритм Fast PCA, який заснований на ітераційному способі обчислення кількох власних векторів. Див., А. Шарма та К. К. Паліваль, Швидкий аналіз основних компонентів з використанням аналізу з фіксованою точкою, Листи розпізнавання візерунків, 28, 1151-1155, 2007 .

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