Jak odwrócić PCA i zrekonstruować oryginalne zmienne z kilku głównych składników?

113

Do zmniejszenia wymiarów można zastosować analizę głównych składników (PCA). Po przeprowadzeniu takiej redukcji wymiarowości, w jaki sposób można w przybliżeniu zrekonstruować oryginalne zmienne / cechy z niewielkiej liczby głównych składników?

Alternatywnie, w jaki sposób można usunąć lub odrzucić kilka głównych składników z danych?

Innymi słowy, jak odwrócić PCA?


Biorąc pod uwagę, że PCA jest ściśle związane z rozkładem wartości osobliwych (SVD), to samo pytanie można zadać w następujący sposób: jak odwrócić SVD?

ameba
źródło
10
Publikuję ten wątek z pytaniami i odpowiedziami, ponieważ mam dość patrzenia na dziesiątki pytań i nie mogę ich zamknąć jako duplikatów, ponieważ nie mamy kanonicznego wątku na ten temat. Istnieje kilka podobnych wątków z przyzwoitymi odpowiedziami, ale wszystkie wydają się mieć poważne ograniczenia, takie jak np. Skupianie się wyłącznie na R.
Ameba
4
Doceniam wysiłek - myślę, że istnieje pilna potrzeba zebrania razem informacji na temat PCA, tego, co robi, czego nie robi, w jednym lub kilku wątkach wysokiej jakości. Cieszę się, że podjąłeś się tego, aby to zrobić!
Sycorax,
1
Nie jestem przekonany, że ta kanoniczna odpowiedź „oczyszczenie” służy swojemu celowi. Mamy tutaj doskonałe ogólne pytanie i odpowiedź, ale każde z pytań zawierało pewne subtelności dotyczące PCA w praktyce, które zostały tutaj utracone. Zasadniczo wziąłeś na siebie wszystkie pytania, zrobiłeś na nich PCA i odrzuciłeś dolne główne elementy, w których czasami bogate i ważne szczegóły są ukryte. Co więcej, wróciłeś do podręcznika Notacja Algebry Liniowej, która właśnie sprawia, że ​​PCA jest nieprzejrzyste dla wielu ludzi, zamiast używania lingua franca przypadkowych statystyk, którym jest R.
Thomas Browne
1
@Thomas Thanks. Myślę, że mamy spór, chętnie rozmawiamy o tym na czacie lub w Meta. Bardzo krótko: (1) Być może lepiej odpowiedzieć na każde pytanie indywidualnie, ale trudna rzeczywistość jest taka, że ​​tak się nie dzieje. Wiele pytań pozostaje bez odpowiedzi, tak jak twoje prawdopodobnie. (2) Społeczność tutaj zdecydowanie preferuje ogólne odpowiedzi przydatne dla wielu osób; możesz sprawdzić, jakie odpowiedzi są najbardziej uprzywilejowane. (3) Zgadzam się na matematykę, ale dlatego podałem tutaj kod R! (4) Nie zgadzam się na temat lingua franca; osobiście nie znam R.
ameby
@amoeba Obawiam się, że nie wiem, jak znaleźć wspomniany czat, ponieważ nigdy wcześniej nie uczestniczyłem w meta dyskusjach.
Thomas Browne,

Odpowiedzi:

147

PCA oblicza wektory własne macierzy kowariancji („główne osie”) i sortuje je według ich wartości własnych (ilość wyjaśnionej wariancji). Wyśrodkowane dane można następnie rzutować na te główne osie, aby uzyskać główne składowe („wyniki”). W celu zmniejszenia wymiarów można zachować tylko podzbiór głównych składników, a resztę odrzucić. (Zobacz tutaj dla laika wprowadzenie do PCA .)

Niech będzie macierzą danych z wierszami (punktami danych) kolumnami (zmiennymi lub cechami). Po odjęciu średnią wektor z każdego rzędu, otrzymujemy wyśrodkowany macierzy danych . Niech będzie macierz niektórych wektorów własnych, które chcemy użyć; te będą najczęściej być wektory z największych wartości własnych. Wtedy macierz projekcji PCA („wyniki”) zostanie po prostu podana przez .Xrawn×pnpμXVp×kkkn×kZ=XV

Jest to zilustrowane na poniższym rysunku: pierwsza podgrupa pokazuje niektóre wyśrodkowane dane (te same dane, których używam w moich animacjach w połączonym wątku) i ich rzuty na pierwszej osi głównej. Drugi wykres podrzędny pokazuje tylko wartości tego rzutu; wymiarowość została zmniejszona z dwóch do jednego:

wprowadź opis zdjęcia tutaj

Aby móc zrekonstruować oryginalne dwie zmienne z tego jednego głównego składnika, możemy odwzorować go z powrotem do wymiarów pomocą . Rzeczywiście, wartości każdego komputera powinny być umieszczone na tym samym wektorze, co używany do projekcji; porównaj podploty 1 i 3. Wynik jest następnie podawany przez . Wyświetlam to na trzeciej podplocie powyżej. Aby uzyskać ostateczną rekonstrukcję , musimy dodać do tego średni wektor :pVX^=ZV=XVVX^rawμ

PCA reconstruction=PC scoresEigenvectors+Mean

Zauważ, że można przejść bezpośrednio z pierwszej podploty do trzeciej, mnożąc przez matrix; nazywa się to macierzą projekcji . Jeśli wszystkie stosuje się wektory, a jest macierzą tożsamości (nie odbywa się redukcja wymiarów, a tym samym „przebudowa” jest doskonały). Jeśli używany jest tylko podzbiór wektorów własnych, nie jest to tożsamość.XVVpVV

Działa to dla dowolnego punktu przestrzeni komputera; można go zmapować do oryginalnej przestrzeni za pomocą .zx^=zV

Odrzucanie (usuwanie) wiodących komputerów

Czasami ktoś chce odrzucić (usunąć) jeden lub kilka wiodących komputerów i zatrzymać resztę, zamiast zatrzymywać wiodące komputery i odrzucać pozostałe (jak wyżej). W takim przypadku wszystkie formuły pozostają dokładnie takie same , ale powinien składać się ze wszystkich głównych osi, z wyjątkiem tych, które chce się odrzucić. Innymi słowy, powinien zawsze obejmować wszystkie komputery, które chce się zachować.VV

Zastrzeżenie dotyczące PCA dotyczące korelacji

Kiedy PCA jest wykonywane na macierzy korelacji (a nie na macierzy kowariancji), surowe dane są nie tylko wyśrodkowane przez odjęcie ale także skalowane przez podzielenie każdej kolumny przez jej odchylenie standardowe . W tym przypadku, aby zrekonstruować oryginalne dane, należy przeskalować kolumny pomocą a dopiero potem dodać z powrotem wektor średni .XrawμσiX^σiμ


Przykład przetwarzania obrazu

Ten temat często pojawia się w kontekście przetwarzania obrazu. Zastanów się nad Lenną - jednym ze standardowych obrazów w literaturze poświęconej przetwarzaniu obrazów (skorzystaj z linków, aby dowiedzieć się, skąd pochodzi). Poniżej po lewej stronie wyświetlam wariant w skali szarości tego obrazu (plik dostępny tutaj ).512×512

Dwie wersje obrazu Lenna w skali szarości.  Ten po prawej jest ziarnisty, ale zdecydowanie rozpoznawalny.

Możemy potraktować ten obraz w skali szarości jako macierz danych . Wykonuję na nim PCA i obliczam przy użyciu pierwszych 50 głównych składników. Wynik jest wyświetlany po prawej stronie.512×512XrawX^raw


Cofanie SVD

PCA jest bardzo ściśle związana z rozkładem wartości osobliwych (SVD), patrz Relacja między SVD a PCA. Jak korzystać z SVD do wykonywania PCA? po więcej szczegółów. Jeśli macierz macierz jest edytowana SVD jako i jeden wybiera wymiarowy wektor który reprezentuje punkt w „zmniejszonej” przestrzeni z wymiarów, a następnie odwzorować go z powrotem do wymiarów należy go pomnożyć przez .n×pXX=USVkzUkpS1:k,1:kV:,1:k


Przykłady w R, Matlab, Python i Stata

Przeprowadzę PCA na danych Fisher Iris, a następnie zrekonstruuję je przy użyciu dwóch pierwszych głównych elementów. Wykonuję PCA na macierzy kowariancji, a nie na macierzy korelacji, tj. Nie skaluję tutaj zmiennych. Ale nadal muszę dodać średnią z powrotem. Niektóre pakiety, takie jak Stata, zajmują się tym poprzez standardową składnię. Dzięki @StasK i @Kodiologist za pomoc w kodzie.

Sprawdzimy rekonstrukcję pierwszego punktu danych, czyli:

5.1        3.5         1.4        0.2

Matlab

load fisheriris
X = meas;
mu = mean(X);

[eigenvectors, scores] = pca(X);

nComp = 2;
Xhat = scores(:,1:nComp) * eigenvectors(:,1:nComp)';
Xhat = bsxfun(@plus, Xhat, mu);

Xhat(1,:)

Wynik:

5.083      3.5174      1.4032     0.21353

R

X = iris[,1:4]
mu = colMeans(X)

Xpca = prcomp(X)

nComp = 2
Xhat = Xpca$x[,1:nComp] %*% t(Xpca$rotation[,1:nComp])
Xhat = scale(Xhat, center = -mu, scale = FALSE)

Xhat[1,]

Wynik:

Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   5.0830390    3.5174139    1.4032137    0.2135317

Dla opracowanego przykładu R rekonstrukcji obrazów PCA zobacz także tę odpowiedź .

Pyton

import numpy as np
import sklearn.datasets, sklearn.decomposition

X = sklearn.datasets.load_iris().data
mu = np.mean(X, axis=0)

pca = sklearn.decomposition.PCA()
pca.fit(X)

nComp = 2
Xhat = np.dot(pca.transform(X)[:,:nComp], pca.components_[:nComp,:])
Xhat += mu

print(Xhat[0,])

Wynik:

[ 5.08718247  3.51315614  1.4020428   0.21105556]

Pamiętaj, że różni się to nieco od wyników w innych językach. Jest tak, ponieważ wersja zestawu danych Iris w Pythonie zawiera błędy .

Stata

webuse iris, clear
pca sep* pet*, components(2) covariance
predict _seplen _sepwid _petlen _petwid, fit
list in 1

  iris   seplen   sepwid   petlen   petwid    _seplen    _sepwid    _petlen    _petwid  
setosa      5.1      3.5      1.4      0.2   5.083039   3.517414   1.403214   .2135317  
ameba
źródło
1
W MATLAB możesz pobrać mu ze standardowych wyjść PCA, a także podać liczbę komponentów na wejściach.
Aksakal,
2
@Aksakal Starałem się, aby wszystkie trzy fragmenty kodu były jak najbardziej podobne (i tak jasne), jak to możliwe; w szczególności chciałem obliczyć ręcznie przed wywołaniem pca (), a także uruchomić PCA ze wszystkimi składnikami i używać tylko składników podczas wykonywania iloczynu między wynikami i wektorami własnymi. Zmodyfikowałem kod Pythona, aby był zgodny z tym samym wzorcem. μnComp
ameba
3
Usunęłbym wszystko z odpowiedzi niezwiązanej z bezpośrednią odpowiedzią na pytanie, takie jak obraz i przetwarzanie obrazu tej uroczej dziewczyny. Jeśli ktoś nie jest zainteresowany zdjęciami, utrudnia to konsumpcję. Pamiętaj, że ktokolwiek zadaje pytanie, jest już głęboko zdezorientowany.
Aksakal,
5
Lenna jest tak samo standardowym zestawem danych jak tęczówka.
StasK,
2
@amoeba Mówiłem o rozmiarze, głębi bitowej, a nawet czarnych pikselach na granicy. Nie mam ostatecznej wersji http://www.ece.rice.edu/~wakin/images/ : „Wygląda na to, że dostępnych jest wiele wersji obrazu testowego Lena (aka„ Lenna ”). Problem ten został zauważony przez Shapiro w swoim zerowym drzewku z 1993 roku, i to pozostaje zaskakująco prawdziwe dzisiaj ”
Laurent Duval