Різниця між впровадженнями наукових програм PCA і TruncatedSVD


12

Я розумію взаємозв'язок між основним компонентним аналізом та сингулярним декомпозицією значення на алгебраїчному / точному рівні. Моє запитання щодо реалізації scikit-learn .

Документація говорить: " [усіченийSVD] дуже схожий на PCA, але працює на вибіркових векторах безпосередньо, а не на коваріаційній матриці. ", Що відображало б алгебраїчну різницю між обома підходами. Однак пізніше йдеться: " Цей оцінювач [усіченийSVD] підтримує два алгоритми: швидкий рандомізований розв'язувач SVD та" наївний "алгоритм, який використовує ARPACK як власний рішальник (X * XT) або (XT * X), ​​залежно від того, що більше ефективний ". Щодо PCA, він говорить: "Лінійне зменшення розмірності за допомогою сингулярного декомпозиції значення для проектування його ...". І реалізація PCA підтримує ті ж два алгоритми (рандомізовані та ARPACK) рішення та ще один, LAPACK. Заглянувши в код, я бачу, що і ARPACK, і LAPACK, і в PCA, і в TruncatedSVD роблять svd на вибіркові дані X, ARPACK може працювати з розрідженими матрицями (використовуючи svds).

Таким чином, окрім різних атрибутів та методів, і що PCA може додатково робити точне декомпозицію єдиного значення за допомогою LAPACK, PCA та TruncatedSVD-реалізацій scikit-learn, схоже, абсолютно такий самий алгоритм. Перше запитання: чи правильно це?

Друге питання: незважаючи на те, що LAPACK і ARPACK використовують scipy.linalg.svd (X) і scipy.linalg.svds (X), будучи X вибірковою матрицею, вони обчислюють розкладання сингулярного значення або власне-розкладання або внутрішньо. У той час як "рандомізований" вирішувач не потребує обчислення продукту. (Це актуально у зв'язку з чисельною стабільністю, див. Чому PCA даних за допомогою SVD даних? ). Це правильно?X X TXTXXXT

Відповідний код: Рядок PCA 415. Урізана лінія VRD 137.


1
ви можете додати посилання на код
seanv507

1
Дрейк - Я думаю, що я погоджуюся з вами на першому Q. не розумію другого. що ви маєте на увазі "вони обчислюють сингулярне розкладання значення або власне розкладання XT ∗ XXT ∗ X або X ∗ XTX ∗ XT внутрішньо" - ви щойно показали код, де це робиться за допомогою SVD на X? - Числові питання стосуються спочатку обчислювальної матриці коваріації (називаємо це С), а потім знаходження власних векторів C
seanv507

XTXXXT

1
Я б здогадався, що підхід ARPACK пов'язаний з чимось на зразок ітерації Арнольді , тому він повинен робити лише векторні продукти матриці. (В принципі, подібні ітераційні методи навіть не є явним , просто парою процедур і . Це звичайно для великих розріджених матриць, наприклад, у XXtimes()Xt_times()
розв'язках

@ GeoMatt22 Чи можете ви детальніше розглянути свій коментар? Ви маєте на увазі, що підходи ARPACK або LAPACK не страждають від числових нестабільності, оскільки їм не потрібно обчислювати коваріаційну матрицю?
Дрейк

Відповіді:


13

Реалізації PCA та TruncatedSVD scikit-learn, схоже, точно такий же алгоритм.

Ні: PCA є (усіченим) SVD за централізованими даними (за середньою субстракцією за ознакою). Якщо дані вже по центру, ці два класи будуть робити те саме.

На практиці TruncatedSVDце корисно для великих розріджених наборів даних, які неможливо відцентрувати без вибуху використання пам'яті.

  • numpy.linalg.svdі scipy.linalg.svdобидва покладаються на LAPACK _GESDD, описаний тут: http://www.netlib.org/lapack/lug/node32.html (розділити та підкорити драйвер)

  • scipy.sparse.linalg.svdsпокладається на ARPACK, щоб зробити власне значення декомпозиції XT. Х або Х. XT (залежно від форми даних) методом ітерації Арнольді. Посібник користувача ARPACK для HTML має розбите форматування, яке приховує обчислювальні дані, але ітерація Arnoldi добре описана у wikipedia: https://en.wikipedia.org/wiki/Arnoldi_iteration

Ось код для ARDACK на основі SVD в scipy:

https://github.com/scipy/scipy/blob/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L1642 (пошук рядка для "def svds" у разі зміни рядка у вихідному коді ).


2
Один може ефективно підтримувати розріджені дані (усіченіSVD), а інші не можуть (PCA). Ось чому ми маємо 2 класи.
ogrisel

1
Якщо це причина, то я б назвав їх SVD та SparseSVD (або подібними), щоб уникнути плутанини.
Дрейк

2
Але люди хочуть PCA, і вони можуть не знати, що PCA - це просто SVD за централізованими даними.
ogrisel

5
@drake Я не погоджуюся, що "процедури різні (PCA використовує коваріаційну матрицю, а SVD використовує матрицю даних)". PCA - це назва типу аналізу. Для цього можна використовувати різні алгоритми та реалізації. EIG cov матриці - це один метод, SVD з централізованою матрицею даних - інший метод, і тоді EIG і SVD можуть бути виконані також різними методами. Не має значення - все це PCA.
амеба

1
@amoeba Дякую за уточнення / виправлення термінології. Те, що ви говорите, має для мене більше сенсу, враховуючи, що SVD та EIG є алгебраїчними теоремами / методами з ширшим розмахом, ніж PCA
Дрейк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.