Qual è la differenza nel centrare (o decifrare) i tuoi dati per PCA? Ho sentito che semplifica la matematica o che impedisce al primo PC di essere dominato dai mezzi delle variabili, ma mi sento come se non fossi ancora riuscito a cogliere fermamente il concetto.
Ad esempio, la risposta principale qui In che modo il centraggio dei dati elimina l'intercettazione in regressione e PCA? descrive come il non centraggio trascinerebbe il primo PCA attraverso l'origine, piuttosto che l'asse principale della nuvola di punti. Sulla base della mia comprensione di come i PC sono ottenuti dagli autovettori della matrice di covarianza, non riesco a capire perché ciò accada.
Inoltre, i miei calcoli con e senza centratura sembrano avere poco senso.
Considera i fiori di setosa nel iris
set di dati in R. Ho calcolato gli autovettori e gli autovalori della matrice di covarianza del campione come segue.
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
Se centro prima il set di dati, ottengo esattamente gli stessi risultati. Ciò sembra abbastanza ovvio, poiché il centraggio non cambia affatto la matrice di covarianza.
df.centered <- scale(df,scale=F,center=T)
e.centered<- eigen(cov(df.centered))
e.centered
La prcomp
funzione si traduce esattamente in questa combinazione autovalore-autovettore, sia per il set di dati centrato che non centrato.
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
Tuttavia, la prcomp
funzione ha l'opzione predefinita center = TRUE
. La disabilitazione di questa opzione comporta i seguenti PC per i dati non centrati ( p.centered
rimane lo stesso quando center
è impostato su 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
Perché è diverso dai miei calcoli di autovettori sulla matrice di covarianza dei dati non centrati? Ha a che fare con il calcolo? Ho visto menzionato che prcomp
utilizza qualcosa chiamato il metodo SVD piuttosto che la decomposizione degli autovalori per calcolare il PC. La funzione princomp
utilizza quest'ultima, ma i suoi risultati sono identici a prcomp
. Il mio problema riguarda la risposta che ho descritto all'inizio di questo post?
EDIT: il problema è stato risolto dall'utile @ttnphns. Vedi il suo commento qui sotto, su questa domanda: cosa significa calcolare gli autovettori di una matrice di covarianza se i dati non sono stati centrati per primi? e in questa risposta: https://stats.stackexchange.com/a/22520/3277 . In breve: una matrice di covarianza implica implicitamente già il centraggio dei dati. PCA utilizza la composizione SVD o eigend dei dati centrati e la matrice di covarianza è quindi uguale a .
through the origin, rather than the main axis of the point cloud
. PCA perfora sempre l'origine. Se i dati erano centrati, origine = centroide.
Based on my understanding of how the PC's are obtained from the covariance matrix's eigenvectors...
Si prega di leggere i commenti nella risposta a cui si collega. Le covarianze implicano la centratura dei dati, l'APC "sulle covarianze" = l'APC sui dati centrati. Se non centrate le variabili originaliX
, il PCA basato su tali dati sarà = PCA sullaX'X/n [or n-1]
matrice. Vedi anche una panoramica importante: stats.stackexchange.com/a/22520/3277 .