Я розумію взаємозв'язок між основним компонентним аналізом та сингулярним декомпозицією значення на алгебраїчному / точному рівні. Моє запитання щодо реалізації 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 T
Xtimes()
Xt_times()