Jaką różnicę ma centrowanie (lub odznaczanie) danych w przypadku PCA? Słyszałem, że ułatwia to matematykę lub zapobiega zdominowaniu pierwszego komputera przez zmienne, ale wydaje mi się, że nie byłem jeszcze w stanie zrozumieć tej koncepcji.
Na przykład najlepsza odpowiedź tutaj W jaki sposób centrowanie danych pozbywa się przechwytywania w regresji i PCA? opisuje, w jaki sposób nie centrowanie pociągnęłoby pierwszą PCA przez początek, a nie główną oś chmury punktów. W oparciu o moje zrozumienie, w jaki sposób komputery PC są uzyskiwane z wektorów własnych macierzy kowariancji, nie rozumiem, dlaczego tak się stało.
Co więcej, moje własne obliczenia z centrowaniem i bez centrowania wydają się nie mieć sensu.
Rozważ kwiaty setosa w iris
zbiorze danych w R. Obliczyłem wektory własne i wartości własne macierzy kowariancji próbki w następujący sposób.
data(iris)
df <- iris[iris$Species=='setosa',1:4]
e <- eigen(cov(df))
> e
$values
[1] 0.236455690 0.036918732 0.026796399 0.009033261
$vectors
[,1] [,2] [,3] [,4]
[1,] -0.66907840 0.5978840 0.4399628 -0.03607712
[2,] -0.73414783 -0.6206734 -0.2746075 -0.01955027
[3,] -0.09654390 0.4900556 -0.8324495 -0.23990129
[4,] -0.06356359 0.1309379 -0.1950675 0.96992969
Jeśli najpierw wyśrodkuję zestaw danych, otrzymam dokładnie takie same wyniki. Wydaje się to dość oczywiste, ponieważ centrowanie w ogóle nie zmienia matrycy kowariancji.
df.centered <- scale(df,scale=F,center=T)
e.centered<- eigen(cov(df.centered))
e.centered
Ta prcomp
funkcja daje dokładnie tę kombinację wartości własnej i wektora własnego, zarówno dla wyśrodkowanego, jak i niecentrowanego zestawu danych.
p<-prcomp(df)
p.centered <- prcomp(df.centered)
Standard deviations:
[1] 0.48626710 0.19214248 0.16369606 0.09504347
Rotation:
PC1 PC2 PC3 PC4
Sepal.Length -0.66907840 0.5978840 0.4399628 -0.03607712
Sepal.Width -0.73414783 -0.6206734 -0.2746075 -0.01955027
Petal.Length -0.09654390 0.4900556 -0.8324495 -0.23990129
Petal.Width -0.06356359 0.1309379 -0.1950675 0.96992969
Jednak prcomp
funkcja ma opcję domyślną center = TRUE
. Wyłączenie tej opcji skutkuje następującymi komputerami dla niecentrowanych danych ( p.centered
pozostaje taki sam, gdy center
jest ustawiony na false):
p.uncentered <- prcomp(df,center=F)
> p.uncentered
Standard deviations:
[1] 6.32674700 0.22455945 0.16369617 0.09766703
Rotation:
PC1 PC2 PC3 PC4
Sepal.Length -0.8010073 0.40303704 0.4410167 0.03811461
Sepal.Width -0.5498408 -0.78739486 -0.2753323 -0.04331888
Petal.Length -0.2334487 0.46456598 -0.8317440 -0.19463332
Petal.Width -0.0395488 0.04182015 -0.1946750 0.97917752
Dlaczego różni się to od moich własnych obliczeń wektora własnego na macierzy kowariancji niecentrowanych danych? Czy ma to związek z obliczeniami? Widziałem wspomniane, że prcomp
do obliczenia komputera używa raczej metody zwanej metodą SVD niż rozkładu wartości własnej. Funkcja princomp
wykorzystuje to drugie, ale jej wyniki są identyczne prcomp
. Czy mój problem dotyczy odpowiedzi opisanej na początku tego postu?
through the origin, rather than the main axis of the point cloud
. PCA zawsze przebija pochodzenie. Jeśli dane były wyśrodkowane, pochodzenie = środek ciężkości.
Based on my understanding of how the PC's are obtained from the covariance matrix's eigenvectors...
Przeczytaj komentarze w odpowiedzi, do której prowadzi link. Kowariancje oznaczają centrowanie danych, PCA „na kowariancjach” = PCA na danych ześrodkowanych. Jeśli nie wyśrodkujesz oryginalnych zmiennychX
, PCA na podstawie takich danych będzie = PCA naX'X/n [or n-1]
macierzy. Zobacz także ważny przegląd: stats.stackexchange.com/a/22520/3277 .