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?
źródło
Xtimes()
Xt_times()
Odpowiedzi:
Nie: PCA jest (obcięty) SVD na wyśrodkowanych danych (według średniej odejmowania według funkcji). Jeśli dane są już wyśrodkowane, te dwie klasy zrobią to samo.
W praktyce
TruncatedSVD
jest przydatny w przypadku dużych rzadkich zestawów danych, których nie można wyśrodkować bez gwałtownego wybuchu użycia pamięci.numpy.linalg.svd
iscipy.linalg.svd
oba polegają na LAPACK _GESDD opisanym tutaj: http://www.netlib.org/lapack/lug/node32.html (sterownik dzielenia i zdobywania)scipy.sparse.linalg.svds
polega na ARPACK do wykonania rozkładu wartości własnej XT. X lub X. XT (w zależności od kształtu danych) za pomocą metody iteracyjnej Arnoldi. Podręcznik użytkownika ARPACK w HTML ma niepoprawne formatowanie, które ukrywa szczegóły obliczeniowe, ale iteracja Arnoldi jest dobrze opisana na wikipedii: https://en.wikipedia.org/wiki/Arnoldi_iterationOto kod SVD opartego na ARPACK w scipy:
https://github.com/scipy/scipy/blob/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L1642 (wyszukaj ciąg „def svds” w przypadku zmiany wiersza w kodzie źródłowym ).
źródło