Я понимаю связь между анализом главных компонентов и разложением по сингулярным значениям на алгебраическом / точном уровне. Мой вопрос о реализации 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()