Une explication intuitive de l’analyse en compostante princiaple est donnée en image dans l’article de wikipédia :
La théorie derrière est liée à la décomposition en valeur singulière illustrée ici pour la compressin d’image.
On va montrer le lien avec avec les différentes de R.
Avec la fonction pca
, on peut faire l’analyse en composantes principales :
library("e1071")
library(MASS)
pca=prcomp(iris[,1:4])
Pour voir ce qu’il y a dans les résultats de l’analyse, on peut afficher les objets :
str(pca)
## List of 5
## $ sdev : num [1:4] 2.056 0.493 0.28 0.154
## $ rotation: num [1:4, 1:4] 0.3614 -0.0845 0.8567 0.3583 -0.6566 ...
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
## .. ..$ : chr [1:4] "PC1" "PC2" "PC3" "PC4"
## $ center : Named num [1:4] 5.84 3.06 3.76 1.2
## ..- attr(*, "names")= chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
## $ scale : logi FALSE
## $ x : num [1:150, 1:4] -2.68 -2.71 -2.89 -2.75 -2.73 ...
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : NULL
## .. ..$ : chr [1:4] "PC1" "PC2" "PC3" "PC4"
## - attr(*, "class")= chr "prcomp"
Ainsi, comme on a souvent l’habitude, on peut afficher les données projetées sur les 2 premières directions principales :
plot(pca$x[,1],pca$x[,2])
Il est à noter que les points sont projetés indépendamment de leurs classes. S’il y a des relations particulières entre les caractéristiques des variables et les classes, on pourrait voir que grâce à l’analyse en composantes princiaples, les projections permettent de mieux distinguer les classes sur les 2 premières directions principales :
plot(pca$x[,1],pca$x[,2],col = iris[,5])
Cela permet ainsi la réduction de dimension. En effet, on peut visuellement distinguer deux frontières selon l’axe 1 pour distinguer les trois classes.
Si on réalise une décomposition en valeur singulières sur les données centrées, on verra que les résultats sont équivalents à l’analyse en composantes principales :
iris_c <- sweep(iris[,1:4], 2, colMeans(iris[,1:4]), "-")
s=svd(iris_c)
#s=svd(iris[,1:4])
str(s)
## List of 3
## $ d: num [1:4] 25.1 6.01 3.41 1.88
## $ u: num [1:150, 1:4] -0.107 -0.108 -0.115 -0.109 -0.109 ...
## $ v: num [1:4, 1:4] 0.3614 -0.0845 0.8567 0.3583 -0.6566 ...
Dans U, on trouve les mêmes projections X :
plot(s$u[, 1], s$u[, 2], col = iris[,5], xlab = "U1", ylab = "U2")
Dans V, on trouve la matrice de rotation :
s$v[1:4, 1:4]
## [,1] [,2] [,3] [,4]
## [1,] 0.36138659 -0.65658877 0.58202985 0.3154872
## [2,] -0.08452251 -0.73016143 -0.59791083 -0.3197231
## [3,] 0.85667061 0.17337266 -0.07623608 -0.4798390
## [4,] 0.35828920 0.07548102 -0.54583143 0.7536574
pca$rotation
## PC1 PC2 PC3 PC4
## Sepal.Length 0.36138659 -0.65658877 0.58202985 0.3154872
## Sepal.Width -0.08452251 -0.73016143 -0.59791083 -0.3197231
## Petal.Length 0.85667061 0.17337266 -0.07623608 -0.4798390
## Petal.Width 0.35828920 0.07548102 -0.54583143 0.7536574
Les écarts-types dans l’ACP sont proportionnels aux valeurs singulières :
(s$d)/(pca$sdev)
## [1] 12.20656 12.20656 12.20656 12.20656
Le coefficient de proportionnalité vient du fait que l’estimateur de la variance dans l’ACP est un estimateur non-biaisé, avec le facteur 1/(nrow(iris)-1)
.
(s$d)^2/(pca$sdev)^2
## [1] 149 149 149 149
Copyright © 2016 Kezhan SHI All rights reserved.