Я понимаю связь между анализом главных компонентов и разложением по сингулярным значениям на алгебраическом / точном уровне. Мой вопрос о реализации 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 данных? ). Это верно?
Соответствующий код: линия 41A PCA. Усеченная линия SVD 137.
источник
Xtimes()
Xt_times()
Ответы:
Нет: 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» в случае изменения строки в исходном коде ).
источник