Jak przeprowadzić redukcję wymiarowości za pomocą PCA w R.


30

Mam duży zestaw danych i chcę przeprowadzić redukcję wymiarów.

Teraz wszędzie czytam, że mogę do tego użyć PCA. Jednak nadal nie wydaje mi się, co robić po obliczeniu / wykonaniu PCA. W R można to łatwo zrobić za pomocą polecenia princomp.

Ale co zrobić po obliczeniu PCA? Jeśli zdecydowałem, że chcę użyć pierwszych 100 głównych składników, w jaki sposób dokładnie zredukować zestaw danych?


To pytanie nie jest bardzo jasne (100 komputerów to zbiór danych o zmniejszonej wymiarowości), ale konkretnie na temat rekonstrukcji oryginalnych zmiennych (temat zaakceptowanej odpowiedzi) zobacz także: Jak odwrócić PCA i zrekonstruować oryginalne zmienne z kilku głównych komponentów?
ameba mówi Przywróć Monikę

Odpowiedzi:


35

Uważam, że to, o co pytasz, dotyczy obcinania danych przy użyciu mniejszej liczby głównych komponentów (PC). Myślę, że w przypadku takich operacji funkcja ta prcompjest bardziej ilustracyjna, ponieważ łatwiej jest zwizualizować mnożenie macierzy zastosowane w rekonstrukcji.

Po pierwsze, podaj syntetyczny zestaw danych, Xtwykonujesz PCA (zazwyczaj wyśrodkowujesz próbki w celu opisania komputerów związanych z macierzą kowariancji:

#Generate data
m=50
n=100
frac.gaps <- 0.5 # the fraction of data with NaNs
N.S.ratio <- 0.25 # the Noise to Signal ratio for adding noise to data

x <- (seq(m)*2*pi)/m
t <- (seq(n)*2*pi)/n

#True field
Xt <- 
 outer(sin(x), sin(t)) + 
 outer(sin(2.1*x), sin(2.1*t)) + 
 outer(sin(3.1*x), sin(3.1*t)) +
 outer(tanh(x), cos(t)) + 
 outer(tanh(2*x), cos(2.1*t)) + 
 outer(tanh(4*x), cos(0.1*t)) + 
 outer(tanh(2.4*x), cos(1.1*t)) + 
 tanh(outer(x, t, FUN="+")) + 
 tanh(outer(x, 2*t, FUN="+"))

Xt <- t(Xt)

#PCA
res <- prcomp(Xt, center = TRUE, scale = FALSE)
names(res)

W wynikach lub prcompmożesz zobaczyć PC ( res$x), wartości własne ( res$sdev) podające informacje o wielkości każdego PC i ładunkach ( res$rotation).

res$sdev
length(res$sdev)
res$rotation
dim(res$rotation)
res$x
dim(res$x)

Kwadrat wartości własnych daje wariancję wyjaśnioną przez każdy komputer:

plot(cumsum(res$sdev^2/sum(res$sdev^2))) #cumulative explained variance

Wreszcie możesz utworzyć skróconą wersję swoich danych, używając tylko wiodących (ważnych) komputerów:

pc.use <- 3 # explains 93% of variance
trunc <- res$x[,1:pc.use] %*% t(res$rotation[,1:pc.use])

#and add the center (and re-scale) back to data
if(res$scale != FALSE){
	trunc <- scale(trunc, center = FALSE , scale=1/res$scale)
}
if(res$center != FALSE){
    trunc <- scale(trunc, center = -1 * res$center, scale=FALSE)
}
dim(trunc); dim(Xt)

Widać, że wynikiem jest nieco gładsza matryca danych, z filtrowanymi funkcjami małej skali:

RAN <- range(cbind(Xt, trunc))
BREAKS <- seq(RAN[1], RAN[2],,100)
COLS <- rainbow(length(BREAKS)-1)
par(mfcol=c(1,2), mar=c(1,1,2,1))
image(Xt, main="Original matrix", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()
image(trunc, main="Truncated matrix (3 PCs)", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()

wprowadź opis zdjęcia tutaj

A oto bardzo podstawowe podejście, które możesz wykonać poza funkcją prcomp:

#alternate approach
Xt.cen <- scale(Xt, center=TRUE, scale=FALSE)
C <- cov(Xt.cen, use="pair")
E <- svd(C)
A <- Xt.cen %*% E$u

#To remove units from principal components (A)
#function for the exponent of a matrix
"%^%" <- function(S, power)
     with(eigen(S), vectors %*% (values^power * t(vectors)))
Asc <- A %*% (diag(E$d) %^% -0.5) # scaled principal components

#Relationship between eigenvalues from both approaches
plot(res$sdev^2, E$d) #PCA via a covariance matrix - the eigenvalues now hold variance, not stdev
abline(0,1) # same results

Teraz decyzja, które komputery zachować, to osobne pytanie - które interesowało mnie już dawno temu . Mam nadzieję, że to pomaga.


2
Marc, nie musisz wyraźnie rejestrować centrum i skalować, prcomprobi to za Ciebie. Spójrz na res$centeri res$scale. IMHO korzysta z nich mniej podatnie na błędy (brak przypadkowej różnicy w wyśrodkowaniu, nieskalowaniu lub nie między jawnym połączeniem scalea prcomppołączeniem).
cbeleites obsługuje Monikę

1
Ta odpowiedź wymaga rozszerzenia, ponieważ nie odpowiada na pytania PO dotyczące what to do after calculating the PCAlub how do I reduce my dataset exactly? Biorąc pod uwagę, że OP przeprowadził PCA na swojej próbce, jego pytanie dotyczy tego, co z tym zrobić i co faktycznie dzieje się z tymi podpróbkami; nie jak zrobić PCA. E <- eigen(cov(Sample)); A<- scale(scale=F, Sample) %*% E$vectorsRównie dobrze moglibyśmy zaproponować zrobienie, aby uzyskać jeszcze jeden sposób na uzyskanie wyników (co właściwie robi Princomp stats:::princomp.default).
usεr11852 mówi: Przywróć Monic

1
@ użytkownik11852 - pytanie odnosi się konkretnie do zmniejszenia zbioru danych (tj. obcięcia, które tutaj wykazałem). Pozostawię mu decyzję, czy tego właśnie szuka.
Marc w pudełku

1
@Marc, dziękuję za odpowiedź. Myślę, że być może będę musiał cofnąć się i ponownie przeczytać wszystko, ponieważ utknąłem na tym, jak każda z powyższych odpowiedzi radzi sobie z redukcją wymiarowości. Ponieważ, jak pokazano, dim (trunc) = dim (Xt). Co z tego wynikało, wymiary nie uległy zmniejszeniu.
B_Miner

2
@B_Miner - Pamiętaj, że obcinanie służy do skupienia się na głównych wzorcach w danych oraz do filtrowania wzorców i szumów na małą skalę. Obcięte dane nie są mniejsze pod względem wymiarów, ale „czystsze”. Jednak obcięcie zmniejsza ilość danych, ponieważ całą matrycę można odtworzyć za pomocą zaledwie kilku wektorów. Dobrym przykładem jest użycie PCA do kompresji obrazu, gdzie do odtworzenia obrazu można użyć mniejszej liczby komputerów. Ten mniejszy podzbiór wektorów zajmuje mniej pamięci, ale rekonstrukcja spowoduje pewną utratę szczegółów w małej skali.
Marc w pudełku

3

Te inne odpowiedzi są bardzo dobre i szczegółowe, ale zastanawiam się, czy rzeczywiście zadajesz o wiele bardziej podstawowe pytanie: co robisz, gdy masz komputery?

Każdy komputer staje się po prostu nową zmienną. Powiedzmy, że PC1 stanowi 60% całkowitej odmiany, a PC2 stanowi 30%. Ponieważ stanowi to 90% całkowitej uwzględnionej zmiany, możesz po prostu wziąć te dwie nowe zmienne (PC) jako uproszczoną wersję oryginalnych zmiennych. Oznacza to dopasowanie ich do modeli, jeśli jesteś tym zainteresowany. Kiedy przychodzi czas na interpretację wyników, robisz to w kontekście oryginalnych zmiennych, które są skorelowane z każdym komputerem.

Przepraszam, jeśli nie doceniłem zakresu pytania!


2

jaλjaΣk=1pλkpp=784w Twoim przypadku). [Pamiętaj, ponieważ twoja macierz kowariancji jest nieujemna. Zdecydowanie nie będziesz mieć ujemnych wartości własnychλ.] Teraz z definicji wektory własne są do siebie ortogonalne. Oznacza to, że ich odpowiednie prognozy są również ortogonalne i tam, gdzie pierwotnie miałeś dużą potencjalnie skorelowaną próbkę zmiennych, teraz masz (miejmy nadzieję znacznie) mniejszą liniowo niezależną próbkę („wyniki”).

Praktycznie z PCA używasz projekcji komputerów („wyników”) jako danych zastępczych dla oryginalnej próbki. Wykonujesz całą analizę wyników, a następnie rekonstruujesz oryginalną próbkę z powrotem za pomocą komputerów PC, aby dowiedzieć się, co się wydarzyło na twojej pierwotnej przestrzeni (to w zasadzie główna regresja składników ). Oczywiście, jeśli jesteś w stanie zinterpretować swoje wektory własne („ładunki”), to znajdujesz się w jeszcze lepszej sytuacji: możesz opisać, co dzieje się z twoją próbką w trybie zmienności przedstawionym przez to ładowanie, wnioskując bezpośrednio o tym ładowaniu i w ogóle nie zależy na odbudowie. :)

Ogólnie rzecz biorąc, co „po obliczeniu PCA” zależy od celu analizy. PCA zapewnia tylko liniowo niezależną podpróbkę danych, która jest optymalna według kryterium rekonstrukcji RSS. Możesz użyć go do klasyfikacji, regresji, lub obu, lub, jak wspomniałem, możesz chcieć rozpoznać znaczące ortogonalne tryby zmian w twojej próbce.

Komentarz : Myślę, że najlepszym naiwnym sposobem decydowania o liczbie składników do zachowania jest oparcie szacunku na pewnym progu zmienności próbki, który chciałbyś zachować w próbce o zmniejszonej wymiarowości, a nie tylko na pewnej dowolnej liczbie, np. 3, 100, 200. Jak wyjaśniono w user4959, można sprawdzić zmienność skumulowaną, sprawdzając odpowiednie pole listy pod $loadingspolem w utworzonym obiekcie listy princomp.


1
Jak wspomniałeś Regresja głównych składników, w R, które jest dostarczane przez pakiet pls. Jeśli chodzi o liczbę komponentów do zachowania, nie widzę żadnej realnej przewagi w decydowaniu o% wariancji nad nie. komponentów (być może dlatego, że pracuję z danymi, które mają bardzo różne poziomy hałasu. Jak wspomina @ Marc-in-the-box, istnieje wiele różnych podejść do określenia odpowiedniej liczby komputerów PC, a strategia będzie ( powinno) zależeć zarówno od typu danych, jak i od rodzaju analizy danych, która ma nastąpić.
cbeleites obsługuje Monikę

Powiedziałem naiwnie ; brak wykresów piargowych, brak średniej wartości własnej, brak logarytmicznej wartości własnej, brak testu częściowej korelacji. Brak probabilistycznych ram dla twojego modelu. Ponieważ nie o to prosi OP. ( Swoją plsdrogą nie wspomniałem o pakiecie princomp {stats}). Istnieje wyraźna zaleta używania% spermy. wariancja w stosunku do jednego dowolnego numeru: znasz jakość swojej rekonstrukcji. Jeśli chcesz po prostu przyciemnić. redukcja doK. wymiary (K. < re, rejest to Twoja pierwotna wymiarowość próbki), to też dobrze, ale tak naprawdę nie znasz jakości zmniejszenia wymiarów.
usεr11852 mówi: Przywróć Monic

1
tak, to naiwne. Nie zgadzam się z tym, że ustalenie arbitralnego procentu wyjaśnionej wariancji ma nieodłączną przewagę nad jakimkolwiek innym arbitralnym punktem odcięcia. Ale i tak nie warto o to walczyć, ponieważ a) OP nigdy nie prosiło o radę na temat wyboru nie. komputerów, które należy zachować i b) Uważam, że zgadzamy się, że należy mimo to przeprowadzić odpowiednią kontrolę modelu PCA.
cbeleites wspiera Monikę

Nie ma problemu; i tak był to tylko komentarz, który napisałem przed moją odpowiedzią. (Odłożę mój komentarz na ostatnią chwilę, ponieważ myślę, że to raczej
kłopotliwe

0

After doing the PCA then you may select the first two components and plot.. You can see the variation of the components using a scree plot in R. Also using summary function with loadings=T you can fins the variation of features with the components.

You can also look at this http://www.statmethods.net/advstats/factor.html and http://statmath.wu.ac.at/~hornik/QFS1/principal_component-vignette.pdf

Try to think what you want. You can interpret lots of things from PCA analysis.

Best Abhik

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.