Les pages 13 à 20 du didacticiel que vous avez publié fournissent une explication géométrique très intuitive de la façon dont PCA est utilisé pour la réduction de dimensionnalité.
La matrice 13x13 que vous mentionnez est probablement la matrice de «chargement» ou de «rotation» (je suppose que vos données d'origine comportaient 13 variables?) Qui peuvent être interprétées de deux manières (équivalentes):
Les colonnes (valeurs absolues des) de votre matrice de chargement décrivent dans quelle mesure chaque variable «contribue» proportionnellement à chaque composant.
La matrice de rotation fait pivoter vos données sur la base définie par votre matrice de rotation. Donc, si vous avez des données 2D et multipliez vos données par votre matrice de rotation, votre nouvel axe X sera le premier composant principal et le nouvel axe Y sera le deuxième composant principal.
EDIT: Cette question est souvent posée, donc je vais simplement présenter une explication visuelle détaillée de ce qui se passe lorsque nous utilisons l'ACP pour la réduction de la dimensionnalité.
Considérons un échantillon de 50 points générés à partir de y = x + bruit. Le premier composant principal se trouvera le long de la ligne y = x et le deuxième composant se trouvera le long de la ligne y = -x, comme indiqué ci-dessous.
Le rapport d'aspect gâche un peu, mais croyez-moi, les composants sont orthogonaux. L'application de PCA fera pivoter nos données afin que les composants deviennent les axes x et y:
Les données avant la transformation sont des cercles, les données après sont des croix. Dans cet exemple particulier, les données n'ont pas été tournées autant qu'elles ont été inversées sur la ligne y = -2x, mais nous aurions pu tout aussi facilement inverser l'axe y pour en faire une rotation sans perte de généralité comme décrit ici .
La majeure partie de la variance, c'est-à-dire les informations contenues dans les données, est répartie le long de la première composante principale (qui est représentée par l'axe des x après avoir transformé les données). Il y a une petite variation le long du deuxième composant (maintenant l'axe des y), mais nous pouvons supprimer ce composant entièrement sans perte significative d'informations . Donc, pour réduire cela de deux dimensions en 1, nous avons laissé la projection des données sur le premier composant principal décrire complètement nos données.
Nous pouvons récupérer partiellement nos données d'origine en les faisant pivoter (ok, en les projetant) sur les axes d'origine.
Les points bleu foncé sont les données "récupérées", tandis que les points vides sont les données d'origine. Comme vous pouvez le voir, nous avons perdu une partie des informations des données d'origine, en particulier la variance dans la direction de la deuxième composante principale. Mais à de nombreuses fins, cette description compressée (en utilisant la projection le long du premier composant principal) peut répondre à nos besoins.
Voici le code que j'ai utilisé pour générer cet exemple au cas où vous voudriez le répliquer vous-même. Si vous réduisez la variance de la composante de bruit sur la deuxième ligne, la quantité de données perdues par la transformation PCA diminuera également car les données convergeront vers la première composante principale:
set.seed(123)
y2 = x + rnorm(n,0,.2)
mydata = cbind(x,y2)
m2 = colMeans(mydata)
p2 = prcomp(mydata, center=F, scale=F)
reduced2= cbind(p2$x[,1], rep(0, nrow(p2$x)))
recovered = reduced2 %*% p2$rotation
plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Data with principal component vectors')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+abs(p2$rotation[1,1])
,y1=m2[2]+abs(p2$rotation[2,1])
, col='red')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+p2$rotation[1,2]
,y1=m2[2]+p2$rotation[2,2]
, col='blue')
plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Data after PCA transformation')
points(p2$x, col='black', pch=3)
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+abs(p2$rotation[1,1])
,y1=m2[2]+abs(p2$rotation[2,1])
, col='red')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+p2$rotation[1,2]
,y1=m2[2]+p2$rotation[2,2]
, col='blue')
arrows(x0=mean(p2$x[,1])
,y0=0
,x1=mean(p2$x[,1])
,y1=1
,col='blue'
)
arrows(x0=mean(p2$x[,1])
,y0=0
,x1=-1.5
,y1=0
,col='red'
)
lines(x=c(-1,1), y=c(2,-2), lty=2)
plot(p2$x, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='PCA dimensionality reduction')
points(reduced2, pch=20, col="blue")
for(i in 1:n){
lines(rbind(reduced2[i,], p2$x[i,]), col='blue')
}
plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Lossy data recovery after PCA transformation')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+abs(p2$rotation[1,1])
,y1=m2[2]+abs(p2$rotation[2,1])
, col='red')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+p2$rotation[1,2]
,y1=m2[2]+p2$rotation[2,2]
, col='blue')
for(i in 1:n){
lines(rbind(recovered[i,], mydata[i,]), col='blue')
}
points(recovered, col='blue', pch=20)