Rozumiem związek między analizą głównych składników a rozkładem wartości osobliwych na poziomie algebraicznym / dokładnym. Moje pytanie dotyczy implementacji scikit-learn .
Dokumentacja mówi: „ [TruncatedSVD] jest bardzo podobny do PCA, ale działa bezpośrednio na przykładowe wektory, zamiast na macierz kowariancji. ”, Co odzwierciedlałoby różnicę algebraiczną między obydwoma podejściami. Jednak później mówi: „ Ten estymator [TruncatedSVD] obsługuje dwa algorytmy: szybki randomizowany solver SVD i„ naiwny ”algorytm, który wykorzystuje ARPACK jako eigensolver na (X * XT) lub (XT * X), w zależności od tego, co jest bardziej wydajny. ”. W odniesieniu do PCA, mówi: „Liniowa redukcja wymiarów za pomocą dekompozycji danych w liczbie pojedynczej w celu jej projekcji ...”. A implementacja PCA obsługuje te same dwa algorytmy (randomizowane i ARPACK) oraz jeden inny, LAPACK. Patrząc na kod, widzę, że zarówno ARPACK, jak i LAPACK w PCA i TruncatedSVD robią svd na przykładowych danych X, ARPACK jest w stanie poradzić sobie z rzadkimi macierzami (używając svds).
Oprócz różnych atrybutów i metod, a PCA może dodatkowo dokonać dokładnego pełnego rozkładu pojedynczej wartości za pomocą LAPACK, PCA i TruncatedSVD implementacje scikit-learning wydają się być dokładnie tym samym algorytmem. Pierwsze pytanie: czy to prawda?
Drugie pytanie: mimo że LAPACK i ARPACK używają scipy.linalg.svd (X) i scipy.linalg.svds (X), będąc macierzą próbki X, obliczają rozkład wartości pojedynczej lub rozkład własny lub wewnętrznie. Podczas gdy „losowy” solver nie musi obliczać produktu. (Jest to istotne w związku ze stabilnością liczbową, patrz Dlaczego PCA danych za pomocą SVD danych? ). Czy to jest poprawne?
Xtimes()
Xt_times()