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 iriszbiorze 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 prcompfunkcja 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 prcompfunkcja ma opcję domyślną center = TRUE. Wyłączenie tej opcji skutkuje następującymi komputerami dla niecentrowanych danych ( p.centeredpozostaje taki sam, gdy centerjest 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 prcompdo obliczenia komputera używa raczej metody zwanej metodą SVD niż rozkładu wartości własnej. Funkcja princompwykorzystuje 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 .