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


12

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

Я читав, що можна просто взяти матрицю даних і обчислити замість , але це не працює для мене. Ну, я не зовсім впевнений, що розумію, що це означає, окрім того, що це повинна бути матриця замість (у моєму випадку ). Я читав про них у навчальних посібниках про власні інтерфейси, але жоден з них, здавалося, не пояснював це таким чином, що я дійсно міг це зрозуміти.DDD/nDD/nn×np×ppn

Якщо коротко, чи є простий алгоритмічний опис цього методу, щоб я міг його дотримуватися?


Те, що ви читаєте, є правильним. Матриця називається матрицею Грама. Його власні вектори є (масштабними) основними складовими. Його власні значення точно ідентичні, аж до коефіцієнта , власним значенням матриці коваріації . DD1/nDD/n
амеба

Відповіді:


10

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

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

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

Існують також ефективні методи обчислення часткового SVD, коли вам потрібно лише кілька ПК. Деякі з них є варіантами ітерації потужності. Алгоритм Ланцоса є одним із прикладів, що також пов'язані з частковими найменшими квадратами. Якщо ваша матриця величезна, вам, можливо, буде краще з приблизним методом. Існують також статистичні причини регуляризації PCA, коли це так.


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

1
Зацікавлений читач може ознайомитись з подальшими подробицями щодо виконання PCA через SVD: Зв'язок між SVD та PCA. Як використовувати SVD для виконання PCA?
амеба

10

Те, що ви зараз робите, є близьким, але вам потрібно переконатися, що ви помножите власні вектори (data . data.T) / linesліворуч на те data.T, щоб отримати власні вектори (data.T . data) / lines. Це іноді називають "трюком транспозиції".

Ось ще кілька деталей. Припустимо, у вас є матриця якій потрібно виконати PCA; для простоти, припустимо, що стовпці вже були нормалізовані, щоб мати нульове середнє, так що нам просто потрібно обчислити власні вектори матриці коваріації .А А Т АAAATA

Тепер якщо - матриця , з , то - дуже велика матриця. Отже, замість обчислення власних векторів , ми можемо хотіти обчислити власні вектори набагато меншої матриці - припускаючи, що ми можемо з'ясувати залежність між ними. Отже, як пов'язані власні вектори з власними векторами ?М × п п > > т Т п × п Т м × м Т Т ТAm×nn>>mATAn×nATAm×mAATATAAAT

Нехай - власний вектор з власним значенням . ПотімA A T λvAATλ

  • AATv=λv
  • AT(AATv)=AT(λv)
  • (ATA)(ATv)=λ(ATv)

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


1
Це звучить як "фокус ядра", застосований до PCA. en.wikipedia.org/wiki/Kernel_PCA Це дуже хороший спосіб обробки певних великих матриць.
Ґілеад

+1. Можливо, слід додати, що називається матрицею Грама. AA
амеба

8

Це виглядає так, як ви хочете, це алгоритм NIPALS для виконання PCA. Це дуже популярний алгоритм серед статистиків. Він має багато переваг:

  • Обчислювально дешевше, ніж SVD або методи власного значення розкладання, якщо потрібні лише перші кілька компонентів.
  • Загалом, більш скромні вимоги до зберігання, оскільки матриця коваріації ніколи не формується. Це дуже важлива властивість для дуже великих наборів даних.
  • Може обробляти відсутні дані в наборі даних (хоча це не проблема, оскільки ви маєте справу з зображеннями).

Опис
http://en.wikipedia.org/wiki/Non-linear_iterative_partial_least_squares

Алгоритм
Ось простий та чудовий опис алгоритму (у розділі 1.2)
http://stats4.eng.mcmaster.ca/w/mediafiles/mediawiki/f/f7/Section-Extra-Class-1.pdf

Не забудьте спочатку позначити середньомасштабну оцінку перед тим, як робити PCA, оскільки це чутливий до масштабу.


4

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

Згадавши про Python, дозвольте мені зазначити, що алгоритм реалізований у scikit-learn : клас PCA . Зокрема, він використовується в прикладі, що демонструє власні інтерфейси .

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