Que diferença faz a centralização (ou remoção do significado) de seus dados para o PCA? Ouvi dizer que isso facilita a matemática ou impede que o primeiro PC seja dominado pelos meios das variáveis, mas sinto que ainda não fui capaz de entender o conceito com firmeza.
Por exemplo, a principal resposta aqui Como a centralização dos dados se livra da interceptação na regressão e no PCA? descreve como a não centralização puxaria o primeiro PCA através da origem, em vez do eixo principal da nuvem de pontos. Com base no meu entendimento de como os PCs são obtidos a partir dos vetores próprios da matriz de covariâncias, não consigo entender por que isso aconteceria.
Além disso, meus próprios cálculos com e sem centralização parecem fazer pouco sentido.
Considere as flores setosa no iris
conjunto de dados em R. Eu calculei os vetores próprios e os valores próprios da matriz de covariância da amostra da seguinte maneira.
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 eu centralizar o conjunto de dados primeiro, obtenho exatamente os mesmos resultados. Isso parece bastante óbvio, uma vez que a centralização não altera a matriz de covariância.
df.centered <- scale(df,scale=F,center=T)
e.centered<- eigen(cov(df.centered))
e.centered
A prcomp
função resulta exatamente nessa combinação de valor próprio e vetor próprio, para o conjunto de dados centralizado e não centralizado.
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
No entanto, a prcomp
função tem a opção padrão center = TRUE
. Desativar esta opção resulta nos seguintes PCs para os dados não centrados ( p.centered
permanece o mesmo quando center
definido como falso):
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
Por que isso é diferente dos meus próprios cálculos de vetor próprio na matriz de covariância dos dados não centrados? Isso tem a ver com o cálculo? Já mencionei que prcomp
usa algo chamado método SVD em vez da decomposição de autovalor para calcular os PCs. A função princomp
usa o último, mas seus resultados são idênticos a prcomp
. Meu problema está relacionado à resposta que descrevi na parte superior desta postagem?
EDIT: O problema foi resolvido pelo útil @ttnphns. Veja seu comentário abaixo, sobre esta questão: O que significa calcular vetores próprios de uma matriz de covariância se os dados não foram centralizados primeiro? e nesta resposta: https://stats.stackexchange.com/a/22520/3277 . Em resumo: uma matriz de covariância já implica implicitamente a centralização dos dados. O PCA usa SVD ou composição automática dos dados centralizados , e a matriz de covariância é então igual a .
Based on my understanding of how the PC's are obtained from the covariance matrix's eigenvectors...
Por favor, leia os comentários na resposta para a qual você vincula. Covariâncias implicam centralização de dados, PCA "em covariâncias" = PCA em dados centralizados. Se você não centralizar as variáveis originaisX
, o PCA com base nesses dados será = PCA naX'X/n [or n-1]
matriz. Consulte também uma visão geral importante: stats.stackexchange.com/a/22520/3277 .through the origin, rather than the main axis of the point cloud
. O PCA sempre perfura a origem. Se os dados foram centralizados, origem = centróide.Respostas:
Como você se observou e explicado por @ttnphns nos comentários, a matriz de covariância computacional realiza implicitamente a centralização: variância, por definição, é o desvio médio quadrático da média . Dados centralizados e não centralizados terão matrizes de covariância idênticas. Portanto, se pelo PCA entendermos o procedimento a seguir: centralização não fará nenhuma diferença.
E, portanto, você está certo ao observar que essa não é uma formulação muito precisa.
Quando as pessoas falam sobre "PCA em dados não centralizados", elas significam que, em vez da matriz de covariância, a decomposição do eigen é realizada na matriz . Se estiver centralizado, será exatamente a matriz de covariância. Se não, então não. Portanto, se por PCA entendermos o seguinte procedimento:X⊤X/(n−1) X
a centralização é muito importante e tem o efeito descrito e ilustrado por @ttnphns em Como a centralização dos dados se livra da interceptação na regressão e no PCA?
Pode parecer estranho até mencionar esse procedimento "estranho", no entanto, considere que o PCA pode ser muito convenientemente executado por meio da decomposição de valor singular (SVD) da matriz de dados si. Descrevo isso em detalhes aqui: Relação entre SVD e PCA. Como usar o SVD para executar o PCA? Nesse caso, o procedimento é o seguinte:X
Se estiver centralizado, isso será equivalente ao PCA padrão feito via matriz de covariância. Mas, se não, é equivalente ao PCA "não centralizado", conforme descrito acima. Como o SVD é uma maneira muito comum e muito conveniente de executar o PCA, na prática, pode ser muito importante lembrar de centralizar os dados antes de chamar a função. Eu certamente tive minha parcela de bugs por ter esquecido de fazê-lo.X
svd
fonte
X'X/(n-1)
e não da matriz SSCPX'X
- seria no exemplo do svd, mostrando a equivalência, decompor emX/sqrt(n-1)
vez deX
(como você atualmente fala). [É claro que a diferença está apenas na parte da escala (valores próprios) e não nos vetores próprios, mas acho que é melhor didaticamente.] Meu segundo ponto seria lembrar que, assim que a centralizaçãoX
não ocorre, a correção de Besseln-1
se torna desnecessária,n
é bem vindo.