Разница между реализациями scikit-learn PCA и TruncatedSVD


12

Я понимаю связь между анализом главных компонентов и разложением по сингулярным значениям на алгебраическом / точном уровне. Мой вопрос о реализации scikit-learn .

Документация гласит: « [TruncatedSVD] очень похож на PCA, но работает непосредственно с векторами выборки, а не с ковариационной матрицей », что будет отражать алгебраическое различие между обоими подходами. Тем не менее, позже говорится: « Этот оценщик [TruncatedSVD] поддерживает два алгоритма: быстрый рандомизированный решатель SVD и« наивный »алгоритм, который использует ARPACK в качестве eigensolver для (X * XT) или (XT * X), ​​в зависимости от того, что больше эффективный . Что касается СПС, он говорит: «Линейное уменьшение размерности с использованием сингулярного значения Разложение данных для их проецирования ...». И реализация PCA поддерживает те же два решателя алгоритмов (рандомизированный и ARPACK) плюс еще один, LAPACK. Изучив код, я вижу, что как ARPACK, так и LAPACK в PCA и TruncatedSVD выполняют svd с образцами данных X, причем ARPACK может работать с разреженными матрицами (используя svds).

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

Второй вопрос: несмотря на то, что LAPACK и ARPACK используют scipy.linalg.svd (X) и scipy.linalg.svds (X), будучи образцом матрицы X, они вычисляют разложение по сингулярным значениям или разложение по собственным значениям или внутренне. Пока «рандомизированному» решателю не нужно вычислять произведение. (Это актуально в связи с численной стабильностью, см. Почему PCA данных с помощью SVD данных? ). Это верно?XTXXXT

Соответствующий код: линия 41A PCA. Усеченная линия SVD 137.


1
не могли бы вы добавить ссылку на код
seanv507

1
Дрейк - я думаю, что я согласен с вами в первом вопросе. Не понимаю второго. что вы имеете в виду «они вычисляют разложение по сингулярным числам или разложение по собственным значениям XT ∗ XXT ∗ X или X ∗ XTX ∗ XT внутри» - вы только что показали код, где все это делается с использованием SVD на X? - численные проблемы относятся к первой вычислительной ковариационной матрице (назовем ее C), а затем к нахождению собственных векторов C
seanv507

@ seanv507 Что касается 2 - й вопрос - я думаю , что scipy.linalg.svd (X) вычисляет СВД, делая собственные векторы-разложение или / и . То же самое для linalg.svds (X). Цитирую: «быстрый рандомизированный решатель SVD и« наивный »алгоритм, который использует ARPACK в качестве eigensolver для (X * XT) или (XT * X)». Смотрите также последнюю строку в docs.scipy.org/doc/scipy/reference/generated/… . Единственный способ понять первую цитату - это то, что рандомизированный алгоритм является единственным, который не вычисляет матрицу ковариации / граммXTXXXT
Дрейк

1
Я предполагаю, что подход ARPACK связан с чем-то вроде итерации Арнольди , так что он имеет дело только с матрично-векторными продуктами. (В принципе, такого рода итерационные методы не являются даже явным , просто парой подпрограмм и т . Д. Это характерно, например, для больших разреженных матриц в решателях PDE.)XXtimes()Xt_times()
GeoMatt22

@ 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 (в зависимости от формы данных) с помощью итерационного метода Арнольди. HTML-руководство пользователя ARPACK имеет неправильное форматирование, которое скрывает вычислительные детали, но итерация Арнольди хорошо описана в википедии: https://en.wikipedia.org/wiki/Arnoldi_iteration

Вот код для SVD на основе ARPACK в scipy:

https://github.com/scipy/scipy/blob/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L1642 (поиск строки «def svds» в случае изменения строки в исходном коде ).


2
Один может эффективно поддерживать разреженные данные (TruncatedSVD), другой - нет (PCA). Вот почему у нас есть 2 класса.
Огрисел

1
Если это причина, то я бы назвал их SVD и SparseSVD (или аналогичными), чтобы избежать путаницы.
Дрейк

2
Но люди хотят PCA, и они могут не знать, что PCA - это просто SVD на центрированных данных.
Огрисель

5
@ Drake Я не согласен с тем, что «процедуры разные (PCA использует ковариационную матрицу, а SVD использует матрицу данных)». PCA - это название типа анализа. Для этого можно использовать разные алгоритмы и реализации. EIG матрицы cov - это один метод, SVD матрицы центрированных данных - это другой метод, и затем EIG и SVD также могут выполняться различными методами. Не имеет значения - все это PCA.
говорит амеба: восстанови Монику

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