To pytanie dotyczy skutecznego sposobu obliczania głównych składników.
Wiele tekstów na temat liniowego PCA opowiada się za dekompozycją danych w liczbie pojedynczej . Oznacza to, że jeśli mamy dane i chcemy zastąpić zmienne (jego kolumny ) głównymi składnikami, wykonujemy SVD: , wartości osobliwe (pierwiastki kwadratowe wartości własnych) zajmujące główną przekątną , prawe wektory własne są ortogonalną macierzą obrotu zmiennych osi w komponenty osi, lewe wektory własne \ bf U są podobne do \ bf V , tylko dla przypadków. Następnie możemy obliczyć wartości składników jako \ bf C = XV = US .
Innym sposobem wykonania PCA zmiennych jest dekompozycja macierzy kwadratowej (tzn. może być korelacją lub kowariancją itp. Między zmiennymi). Rozkład może być rozkładem własnym lub rozkładem liczby pojedynczej: przy kwadratowej symetrycznej dodatniej macierzy półfinałowej dadzą ten sam wynik z wartościami własnymi jak przekątna , i jak opisano wcześniej. Wartości składników będą wynosić .
Moje pytanie: jeśli data jest dużą macierzą, a liczba przypadków jest (co często jest przypadkiem) znacznie większa niż liczba zmiennych, to oczekuje się, że sposób (1) będzie znacznie wolniejszy niż sposób (2 ), ponieważ sposób (1) stosuje dość drogi algorytm (taki jak SVD) do dużej matrycy; oblicza i przechowuje ogromną macierz której tak naprawdę nie potrzebujemy w naszym przypadku (PCA zmiennych). Jeśli tak, to dlaczego tak wiele podręczników wydaje się popierać lub po prostu wymieniać tylko sposób (1)? Może jest wydajny i czegoś mi brakuje?
źródło
R
svd
Joliffe, Principal component analysis, 2nd ed.
rzeczywistości Joliffe opisuje oba sposoby, ale w głównym rozdziale na temat PCA mówi o sposobie 1, o ile pamiętam.Odpowiedzi:
Oto moje 2ct na ten temat
Wykład chemometryczny, w którym po raz pierwszy nauczyłem się PCA, wykorzystywał rozwiązanie (2), ale nie był zorientowany numerycznie, a mój wykład liczbowy był jedynie wstępem i nie omawiałem SVD, o ile pamiętam.
Jeśli dobrze rozumiem Holmes: Fast SVD dla macierzy wielkoskalowych , twój pomysł został wykorzystany do uzyskania obliczeniowego szybkiego SVD długich matryc.
Oznaczałoby to, że dobra implementacja SVD może wewnętrznie następować (2), jeśli napotka odpowiednie matryce (nie wiem, czy są jeszcze lepsze możliwości). Oznaczałoby to, że w przypadku implementacji wysokiego poziomu lepiej jest użyć SVD (1) i pozostawić BLAS-owi sprawdzenie, jakiego algorytmu użyć wewnętrznie.
Szybka praktyczna kontrola: Wydaje się, że svd OpenBLAS nie robi tego rozróżnienia na matrycy 5e4 x 100,
svd (X, nu = 0)
przyjmuje medianę 3,5 s, asvd (crossprod (X), nu = 0)
zajmuje 54 ms (wywoływane z R za pomocąmicrobenchmark
).Kwadrat wartości własnych jest oczywiście szybki, a do tego wyniki obu wywołań są równoważne.
aktualizacja: spójrz na Wu, W .; Massart, D. i de Jong, S .: Algorytmy jądra PCA dla szerokich danych. Część I: Teoria i algorytmy, Chemometrics and Intelligent Laboratory Systems, 36, 165 - 172 (1997). DOI: http://dx.doi.org/10.1016/S0169-7439(97)00010-5
W tym artykule omówiono liczbowe i obliczeniowe właściwości 4 różnych algorytmów PCA: SVD, rozkład własny (EVD), NIPALS i POWER.
Są one powiązane w następujący sposób:
Kontekst artykułu to szeroki i działają one na X X ' (jądro PCA) - jest to sytuacja odwrotna do tej, o którą pytasz. Aby odpowiedzieć na pytanie dotyczące długiego zachowania macierzy, musisz wymienić znaczenie „jądra” i „klasycznego”.X(30×500) XX′
Nic dziwnego, że EVD i SVD zmieniają miejsca w zależności od tego, czy stosowane są algorytmy klasyczne, czy jądra. W kontekście tego pytania oznacza to, że jedno lub drugie może być lepsze w zależności od kształtu matrycy.
Ale z ich dyskusji na temat „klasycznego” SVD i EVD jasno wynika, że rozkład jest bardzo powszechnym sposobem obliczania PCA. Nie określają jednak, który algorytm SVD jest używany, poza tym, że używają funkcji Matlaba .X′X
svd ()
źródło
svd (X'X)
na długie matryce.)microbenchmark(X <- matrix(rnorm(5e6), ncol=100), Y <- t(X), svd(X), svd(Y), control=list(order="inorder"), times = 5)
może być również interesujące.SVD jest wolniejsze, ale często jest uważane za preferowaną metodę ze względu na wyższą dokładność numeryczną.
Oto, co napisano w pomocy
pca()
funkcji MATLAB :Ostatnie zdanie podkreśla zasadniczy kompromis między dokładnością prędkości, jaki ma tutaj miejsce.
uzyskiwanie identycznych wyników:
Powinienem dodać, że często z przyjemnością zignorujesz tę potencjalną [małą] utratę precyzji i raczej zastosuję szybszą metodę.
źródło
eig()
podejścia? (Czytelnicy skorzystają: istnieje punkt kompromisu między szybkością a stabilnością. Jak można zdecydować w konkretnej praktycznej sytuacji?)3 0 -3.3307e-16
eigen w spss zwróciło mi3 0 0
. Wygląda na to, że funkcja ma jakąś wbudowaną i ustaloną wartość tolerancji, powyżej której zeruje. W tym przykładzie funkcja wyglądała tak, jakby zhakować węzeł niestabilności numerycznej poprzez wyzerowanie zarówno niewielkich wartości własnych, „0”, jak i „-16”.