Comment effectuer une réduction de dimensionnalité avec PCA dans R


30

J'ai un grand ensemble de données et je veux effectuer une réduction de dimensionnalité.

Maintenant, partout où je lis, je peux utiliser PCA pour cela. Cependant, je ne semble toujours pas savoir quoi faire après le calcul / l'exécution de l'ACP. Dans R, cela se fait facilement avec la commande princomp.

Mais que faire après avoir calculé l'APC? Si j'ai décidé d'utiliser les premiers composants principaux, comment réduire exactement mon jeu de données?100


Cette question n'est pas très claire (100 PC sont votre ensemble de données de dimensionnalité réduite), mais spécifiquement sur la reconstruction des variables originales (le sujet de la réponse acceptée) voir aussi: Comment inverser l'ACP et reconstruire les variables originales à partir de plusieurs composants principaux?
amibe dit Réintégrer Monica

Réponses:


35

Je crois que ce que vous voulez dire dans votre question concerne la troncature des données en utilisant un plus petit nombre de composants principaux (PC). Pour de telles opérations, je pense que la fonction prcompest plus illustrative en ce sens qu'il est plus facile de visualiser la multiplication matricielle utilisée en reconstruction.

Tout d'abord, donnez un ensemble de données synthétiques Xt, vous effectuez l'ACP (en général, vous centrez les échantillons afin de décrire les PC liés à une matrice de covariance:

#Generate data
m=50
n=100
frac.gaps <- 0.5 # the fraction of data with NaNs
N.S.ratio <- 0.25 # the Noise to Signal ratio for adding noise to data

x <- (seq(m)*2*pi)/m
t <- (seq(n)*2*pi)/n

#True field
Xt <- 
 outer(sin(x), sin(t)) + 
 outer(sin(2.1*x), sin(2.1*t)) + 
 outer(sin(3.1*x), sin(3.1*t)) +
 outer(tanh(x), cos(t)) + 
 outer(tanh(2*x), cos(2.1*t)) + 
 outer(tanh(4*x), cos(0.1*t)) + 
 outer(tanh(2.4*x), cos(1.1*t)) + 
 tanh(outer(x, t, FUN="+")) + 
 tanh(outer(x, 2*t, FUN="+"))

Xt <- t(Xt)

#PCA
res <- prcomp(Xt, center = TRUE, scale = FALSE)
names(res)

Dans les résultats ou prcomp, vous pouvez voir les PC ( res$x), les valeurs propres ( res$sdev) donnant des informations sur la magnitude de chaque PC et les chargements ( res$rotation).

res$sdev
length(res$sdev)
res$rotation
dim(res$rotation)
res$x
dim(res$x)

En quadrillant les valeurs propres, vous obtenez la variance expliquée par chaque PC:

plot(cumsum(res$sdev^2/sum(res$sdev^2))) #cumulative explained variance

Enfin, vous pouvez créer une version tronquée de vos données en utilisant uniquement les principaux PC (importants):

pc.use <- 3 # explains 93% of variance
trunc <- res$x[,1:pc.use] %*% t(res$rotation[,1:pc.use])

#and add the center (and re-scale) back to data
if(res$scale != FALSE){
	trunc <- scale(trunc, center = FALSE , scale=1/res$scale)
}
if(res$center != FALSE){
    trunc <- scale(trunc, center = -1 * res$center, scale=FALSE)
}
dim(trunc); dim(Xt)

Vous pouvez voir que le résultat est une matrice de données légèrement plus lisse, avec des fonctionnalités à petite échelle filtrées:

RAN <- range(cbind(Xt, trunc))
BREAKS <- seq(RAN[1], RAN[2],,100)
COLS <- rainbow(length(BREAKS)-1)
par(mfcol=c(1,2), mar=c(1,1,2,1))
image(Xt, main="Original matrix", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()
image(trunc, main="Truncated matrix (3 PCs)", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()

entrez la description de l'image ici

Et voici une approche très basique que vous pouvez faire en dehors de la fonction prcomp:

#alternate approach
Xt.cen <- scale(Xt, center=TRUE, scale=FALSE)
C <- cov(Xt.cen, use="pair")
E <- svd(C)
A <- Xt.cen %*% E$u

#To remove units from principal components (A)
#function for the exponent of a matrix
"%^%" <- function(S, power)
     with(eigen(S), vectors %*% (values^power * t(vectors)))
Asc <- A %*% (diag(E$d) %^% -0.5) # scaled principal components

#Relationship between eigenvalues from both approaches
plot(res$sdev^2, E$d) #PCA via a covariance matrix - the eigenvalues now hold variance, not stdev
abline(0,1) # same results

Maintenant, décider quels PC conserver est une question distincte - une question qui m'intéressait il y a quelque temps . J'espère que ça t'as aidé.


2
Marc, vous n'avez pas besoin d'enregistrer le centre et l'échelle explicitement, prcompfait cela pour vous. Jetez un oeil à res$centeret res$scale. À mon humble avis, il est moins sujet aux erreurs de les utiliser (pas de différence accidentelle sur le centrage ou non / mise à l'échelle ou non entre l'appel explicite à scaleet l' prcompappel).
cbeleites prend en charge Monica le

1
Cette réponse doit être développée car elle ne répond pas aux questions du PO sur what to do after calculating the PCAou how do I reduce my dataset exactly? Étant donné que le PO a effectué une ACP sur son échantillon, sa question est de savoir quoi en faire et ce qui se passe réellement avec ce sous-échantillon; pas comment faire PCA. Nous pourrions aussi bien proposer de faire E <- eigen(cov(Sample)); A<- scale(scale=F, Sample) %*% E$vectorspour obtenir une autre façon d'obtenir les scores également (ce qui est en fait ce que fait princomp stats:::princomp.default).
usεr11852 dit Réintégrer Monic le

1
@ user11852 - la question fait spécifiquement référence à la réduction de l'ensemble de données (c'est-à-dire la troncature que j'ai démontrée ici). Je vais lui laisser le soin de décider si c'est ce qu'il cherchait ou non.
Marc dans la boite le

1
@Marc, merci pour la réponse. Je pense que je pourrais avoir besoin de prendre du recul et de tout relire à nouveau, car je suis coincé sur la façon dont l'une des réponses ci-dessus traite de la réduction de la dimensionnalité. Parce que comme vous le montrez, dim (trunc) = dim (Xt). Quel en fut l'avantage, les dimenions ne se réduisirent pas.
B_Miner

2
@B_Miner - Gardez à l'esprit que la troncature est utilisée pour se concentrer sur les principaux motifs des données et filtrer les motifs à petite échelle et le bruit. Les données tronquées ne sont pas plus petites en termes de dimensions, mais "plus propres". Cependant, la troncature réduit la quantité de données dans la mesure où la matrice entière peut être reconstruite avec seulement quelques vecteurs. Un bon exemple est l'utilisation de PCA pour la compression d'image, où un plus petit nombre de PC peut être utilisé pour reconstruire l'image. Ce sous-ensemble plus petit de vecteurs prend moins de mémoire, mais la reconstruction aura une certaine perte dans les détails à petite échelle.
Marc dans la loge du

3

Ces autres réponses sont très bonnes et détaillées, mais je me demande si vous posez réellement une question beaucoup plus fondamentale: que faites-vous une fois que vous avez vos PC?

Chaque PC devient simplement une nouvelle variable. Supposons que PC1 représente 60% de la variation totale et PC2 représente 30%. Comme cela représente 90% de la variation totale prise en compte, vous pouvez simplement prendre ces deux nouvelles variables (PC) comme une version simplifiée de vos variables d'origine. Cela signifie les adapter aux modèles, si c'est ce qui vous intéresse. Lorsque vient le temps d'interpréter vos résultats, vous le faites dans le contexte des variables d'origine qui sont corrélées avec chaque PC.

Désolé si j'ai sous-estimé la portée de la question!


2

Je crois que votre question initiale découle du fait que vous ne savez pas exactement ce que fait l'APC. L'analyse en composantes principales vous permet d'identifier le principal mode de variation de votre échantillon. Ces modes sont calculés empériquement comme les vecteurs propres de la matrice de covariance de votre échantillon (les «chargements»). Par la suite, ces vecteurs servent de nouveau "système de coordonnées" de votre échantillon lorsque vous projetez votre échantillon d'origine dans l'espace qu'ils définissent (les "scores"). La proportion de variation associée au ème vecteur propre / mode de variation / chargement / composant principal est égale à où est la dimensionnalité d'origine de votre échantillon (λ ii pp=784λλiΣk=1pλkpp=784dans ton cas). [N'oubliez pas que votre matrice de covariance n'est pas négative. Vous n'aurez pas de valeurs propres négatives .] Maintenant, par définition, les vecteurs propres sont orthogonaux entre eux. Cela signifie que leurs projections respectives sont également orthogonales et où, à l'origine, vous disposiez d'un grand échantillon de variables potentiellement corrélées, vous disposez maintenant d'un échantillon (espérons-le significativement) plus petit et linéairement indépendant (les «scores»). λ

Pratiquement avec PCA, vous utilisez les projections des PC (les «scores») comme données de substitution pour votre échantillon d'origine. Vous faites toute votre analyse sur les partitions, puis vous reconstruisez votre échantillon d'origine à l'aide des PC pour découvrir ce qui s'est passé sur votre espace d'origine (c'est essentiellement la régression du composant principal ). De toute évidence, si vous êtes capable d'interpréter de manière significative vos vecteurs propres ("chargements"), vous êtes alors dans une position encore meilleure: vous pouvez décrire ce qui arrive à votre échantillon dans le mode de variation présenté par ce chargement en faisant une inférence sur ce chargement directement et ne se soucie pas du tout de la reconstruction. :)

En général, qu'est-ce que vous "après avoir calculé l'APC" dépend de la cible de votre analyse. PCA vous donne juste un sous-échantillon linéairement indépendant de vos données qui est optimal selon un critère de reconstruction RSS. Vous pouvez l'utiliser pour la classification, la régression, ou les deux, ou comme je l'ai mentionné, vous souhaiterez peut-être reconnaître des modes de variations orthogonaux significatifs dans votre échantillon.

Un commentaire : Je pense que la meilleure façon naïve de décider du nombre de composants à retenir est de baser votre estimation sur un certain seuil de variation d'échantillon que vous souhaitez conserver dans votre échantillon de dimensionnalité réduite plutôt que sur un certain nombre arbitraire par exemple. 3, 100, 200. Comme l'explique l'utilisateur4959, vous pouvez vérifier cette variation cumulative en vérifiant le champ correspondant de la liste sous le $loadingschamp dans l'objet de liste produit par princomp.


1
Comme vous mentionnez la régression du composant principal, dans R qui est fourni par le package pls. En ce qui concerne le nombre de composants à conserver, je ne vois aucun avantage réel à décider du% de variance par rapport à non. des composants (peut-être parce que je travaille avec des données qui ont des niveaux de bruit très différents. Comme le mentionne @ Marc-in-the-box, il existe de nombreuses approches différentes pour déterminer un nombre approprié de PC, et la stratégie va ( devrait) dépendre à la fois du type de données et du type d'analyse de données qui doit suivre
cbeleites prend en charge Monica

J'ai dit de façon naïve ; pas de parcelles d'éboulis, pas de valeur propre moyenne, pas de diagramme log-valeur propre, pas de test de corrélation partielle. Pas de cadre probabiliste pour votre modèle. Parce que ce n'est pas ce que le PO demande. (Je n'ai pas mentionné le plspaquet d'ailleurs princomp {stats}). Il y a un net avantage à utiliser% de sperme. variance sur un seul nombre arbitraire: vous connaissez la qualité de votre reconstruction. Si vous voulez juste faire du dim. réduction aux dimensions ( < , étant la dimensionnalité de votre échantillon d'origine) c'est bien aussi mais vous ne connaissez pas vraiment la qualité de votre réduction de dimensionnalité. K D DKKDD
usεr11852 dit Réintégrer Monic le

1
oui, c'est naïf. Je ne suis pas d'accord que la définition d'un% arbitraire de la variance expliquée a un avantage intrinsèque de tout autre seuil arbitraire. Mais cela ne vaut pas la peine de se battre à ce sujet car a) le PO n'a jamais demandé conseil pour choisir le non. des PC à conserver et b) Je pense que nous convenons qu'une inspection appropriée du modèle PCA devrait être effectuée de toute façon.
cbeleites prend en charge Monica le

Aucun problème; c'était seulement un commentaire que j'ai fait avant ma réponse de toute façon. (Je mettrai mon paragraphe de commentaire en dernier car je pense que cela laisse perplexe plutôt que clarifie ce que je veux dire)
usεr11852 dit Reinstate Monic

0

Après avoir fait l'ACP, vous pouvez sélectionner les deux premiers composants et tracer .. Vous pouvez voir la variation des composants en utilisant un tracé d'éboulis en R. En utilisant également la fonction récapitulative avec les chargements = T, vous pouvez ailerons la variation des caractéristiques avec les composants.

Vous pouvez également consulter ce http://www.statmethods.net/advstats/factor.html et http://statmath.wu.ac.at/~hornik/QFS1/principal_component-vignette.pdf

Essayez de penser à ce que vous voulez. Vous pouvez interpréter beaucoup de choses à partir de l'analyse PCA.

Meilleur Abhik

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.