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:
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 :pV⊤X^=ZV⊤=XVV⊤X^rawμ
PCA reconstruction=PC scores⋅Eigenvectors⊤+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ść.XVV⊤pVV⊤
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
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=USV⊤kzUkpS⊤1: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