O PCA calcula os vetores próprios da matriz de covariância ("eixos principais") e os classifica por seus valores próprios (quantidade de variação explicada). Os dados centralizados podem então ser projetados nesses eixos principais para produzir componentes principais ("pontuações"). Para fins de redução de dimensionalidade, é possível manter apenas um subconjunto de componentes principais e descartar o restante. (Veja aqui a introdução de um leigo ao PCA .)
Seja a matriz de dados com linhas (pontos de dados) colunas (variáveis ou recursos). Depois de se subtrair a média vector a partir de cada linha, obtemos o centrado matriz de dados . Seja a matriz de alguns vetores próprios que queremos usar; esses seriam os vetores próprios com os maiores valores próprios. Então a matriz das projeções de PCA ("pontuações") será simplesmente dada por . n×pnpXrawn×pnpμXVp×kkkn×kZ=XV
Isso é ilustrado na figura abaixo: a primeira subparcela mostra alguns dados centralizados (os mesmos dados que uso nas minhas animações no encadeamento vinculado) e suas projeções no primeiro eixo principal. A segunda subparcela mostra apenas os valores dessa projeção; a dimensionalidade foi reduzida de dois para um:
Para poder reconstruir as duas variáveis originais desse componente principal, podemos mapeá-lo de volta para as dimensões com . De fato, os valores de cada PC devem ser colocados no mesmo vetor usado para a projeção; compare as subparcelas 1 e 3. O resultado é dado por . Estou exibindo-o na terceira subtrama acima. Para obter a reconstrução final , precisamos adicionar o vetor médio a isso:pV⊤X^=ZV⊤=XVV⊤X^rawμ
PCA reconstruction=PC scores⋅Eigenvectors⊤+Mean
Observe que é possível ir diretamente do primeiro subparcela para o terceiro multiplicando pela matriz ; isso é chamado de matriz de projeção . Se todos os são utilizados vectores próprios, então representa a matriz identidade (sem redução de dimensionalidade é realizada, portanto, "reconstrução" é perfeito). Se apenas um subconjunto de autovetores for usado, não será identidade.XVV⊤pVV⊤
Isso funciona para um ponto arbitrário no espaço do PC; ele pode ser mapeado para o espaço original via .zx^=zV⊤
Descartar (remover) os principais PCs
Às vezes, alguém deseja descartar (remover) um ou alguns dos principais PCs e manter o restante, em vez de manter os PCs principais e descartar o restante (como acima). Nesse caso, todas as fórmulas permanecem exatamente iguais , mas deve consistir em todos os eixos principais, exceto os que se deseja descartar. Em outras palavras, sempre deve incluir todos os PCs que você deseja manter.VV
Advertência sobre PCA na correlação
Quando o PCA é feito na matriz de correlação (e não na matriz de covariância), os dados brutos não são centralizados apenas subtraindo mas também dimensionados dividindo cada coluna por seu desvio padrão . Nesse caso, para reconstruir os dados originais, é necessário redimensionar as colunas de com e somente depois adicionar novamente o vetor médio .XrawμσiX^σiμ
Exemplo de processamento de imagem
Este tópico geralmente aparece no contexto do processamento de imagens. Considere Lenna - uma das imagens padrão na literatura sobre processamento de imagens (siga os links para descobrir de onde vem). Abaixo, à esquerda, mostro a variante em escala de cinza dessa imagem (arquivo disponível aqui ).512×512
Podemos tratar essa imagem em escala de cinza como uma matriz de dados . Eu executo o PCA nele e computo usando os 50 primeiros componentes principais. O resultado é exibido à direita.512×512XrawX^raw
Revertendo SVD
O PCA está intimamente relacionado à decomposição de valor singular (SVD), consulte
Relação entre SVD e PCA. Como usar o SVD para executar o PCA? para mais detalhes. Se uma matriz for editada como SVD como e você selecionar um vetor dimensional que represente o ponto no espaço em "reduzido" de dimensões, para mapeá-lo de volta para dimensões, é necessário multiplicá-lo com .n×pXX=USV⊤kzUkpS⊤1:k,1:kV⊤:,1:k
Exemplos em R, Matlab, Python e Stata
Conduzirei o PCA com os dados da Fisher Iris e depois reconstruí-lo usando os dois primeiros componentes principais. Estou fazendo PCA na matriz de covariância, não na matriz de correlação, ou seja, não estou escalando as variáveis aqui. Mas ainda tenho que adicionar a média de volta. Alguns pacotes, como o Stata, cuidam disso através da sintaxe padrão. Agradecemos a @StasK e @Kodiologist por sua ajuda com o código.
Vamos verificar a reconstrução do primeiro ponto de dados, que é:
5.1 3.5 1.4 0.2
Matlab
load fisheriris
X = meas;
mu = mean(X);
[eigenvectors, scores] = pca(X);
nComp = 2;
Xhat = scores(:,1:nComp) * eigenvectors(:,1:nComp)';
Xhat = bsxfun(@plus, Xhat, mu);
Xhat(1,:)
Resultado:
5.083 3.5174 1.4032 0.21353
R
X = iris[,1:4]
mu = colMeans(X)
Xpca = prcomp(X)
nComp = 2
Xhat = Xpca$x[,1:nComp] %*% t(Xpca$rotation[,1:nComp])
Xhat = scale(Xhat, center = -mu, scale = FALSE)
Xhat[1,]
Resultado:
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.0830390 3.5174139 1.4032137 0.2135317
Para um exemplo R elaborado de reconstrução de imagens por PCA, veja também esta resposta .
Pitão
import numpy as np
import sklearn.datasets, sklearn.decomposition
X = sklearn.datasets.load_iris().data
mu = np.mean(X, axis=0)
pca = sklearn.decomposition.PCA()
pca.fit(X)
nComp = 2
Xhat = np.dot(pca.transform(X)[:,:nComp], pca.components_[:nComp,:])
Xhat += mu
print(Xhat[0,])
Resultado:
[ 5.08718247 3.51315614 1.4020428 0.21105556]
Observe que isso difere um pouco dos resultados em outros idiomas. Isso ocorre porque a versão do Python do conjunto de dados Iris contém erros .
Stata
webuse iris, clear
pca sep* pet*, components(2) covariance
predict _seplen _sepwid _petlen _petwid, fit
list in 1
iris seplen sepwid petlen petwid _seplen _sepwid _petlen _petwid
setosa 5.1 3.5 1.4 0.2 5.083039 3.517414 1.403214 .2135317