Le "Machine Learning For Hackers" d'O'Reilly dit que chaque composant principal représente un pourcentage de la variance. J'ai cité la partie pertinente de la page ci-dessous (chapitre 8, p.207). S'adressant à un autre expert, ils ont convenu qu'il s'agissait du pourcentage.
Cependant, les 24 composants totalisent 133,2095%. Comment est-ce possible?
Après nous être convaincus que nous pouvons utiliser PCA, comment faisons-nous cela dans R? Encore une fois, c'est un endroit où R brille: l'intégralité de PCA peut être effectuée en une seule ligne de code. Nous utilisons la fonction princomp pour exécuter PCA:
pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])
Si nous tapons simplement pca dans R, nous verrons un bref résumé des principaux composants:
Call: princomp(x = date.stock.matrix[, 2:ncol(date.stock.matrix)]) Standard deviations: Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 29.1001249 20.4403404 12.6726924 11.4636450 8.4963820 8.1969345 5.5438308 Comp.8 Comp.9 Comp.10 Comp.11 Comp.12 Comp.13 Comp.14 5.1300931 4.7786752 4.2575099 3.3050931 2.6197715 2.4986181 2.1746125 Comp.15 Comp.16 Comp.17 Comp.18 Comp.19 Comp.20 Comp.21 1.9469475 1.8706240 1.6984043 1.6344116 1.2327471 1.1280913 0.9877634 Comp.22 Comp.23 Comp.24 0.8583681 0.7390626 0.4347983 24 variables and 2366 observations.
Dans ce résumé, les écarts-types nous indiquent dans quelle mesure la variance de l'ensemble de données est expliquée par les différentes composantes principales. La première composante, appelée Comp.1, représente 29% de la variance, tandis que la composante suivante représente 20%. À la fin, la dernière composante, Comp.24, représente moins de 1% de la variance. Cela suggère que nous pouvons en apprendre beaucoup sur nos données en examinant simplement le premier composant principal.
[Le code et les données peuvent être trouvés sur github .]
Standard deviations
est légèrement décalée. Étant donné que les écarts-types sont en fait des écarts-types, nous devons les mettre au carré pour voir quelle proportion de la variance chaque composant représente. La première composante représenterait pour cent de la variance totale.R
logiciel lui-même. Trouver cette erreur était une bonne prise (j'espère que vous avez trouvé gratifiant de découvrir ce qui se passe vraiment avec PCA)!Réponses:
Utilisez
summary.princomp
pour voir la "Proportion de variance" et la "Proportion cumulée".la source
sqrt(pca$sdev[1]/sum(pca$sdev))
(grosso modosqrt(29.1/133.2)
) donne 0,4673904.sdev
implique que vous regardez l' écart-type , c'est-à-dire la racine carrée de la variance (ou , en utilisant la notation de ma réponse), ce qui devrait expliquer la différence. Essayezplutôt.pca$sdev[1]^2/sum(pca$sdev^2)
stats:::print.summary.princomp
vous montre qu'il équerre lesdev
composant, ce quistats:::princomp.default
montresqrt
la valeur propre.Ils devraient totaliser100 %.
La variance totale d'une variable aléatoire X à variables avec matrice de covariance Σ est définie comme t r ( Σ ) = σ 11 + σ 22 + ⋯ + σ p p .p X Σ
Or, la trace d'une matrice symétrique est la somme de ses valeurs propres Ainsi, la variance totale est t r ( Σ ) = λ 1 + ⋯ + λ p si nous utilisons λ i pour désigner les valeurs propres de Σ . Notez que λ p ≥ 0 puisque les matrices de covariance sont semi-définies positives , de sorte que la variance totale n'est pas négative.λ1≥λ2≥…≥λp.
Mais les principales composantes sont données par , où e i est le i : e vecteur propre (normalisé pour avoir une longueur 1 ), correspondant à la valeur propre λ i . Sa variance est V a r ( e i X ) = e ′ i Σ e i = λ i e ′ i e i = λ i et donc les k premières composantes principales constituent ( λeiX ei i 1 λi
la source
Voici du code R pour compléter les réponses précédentes (
pca[["sdev"]]
est généralement écritpca$sdev
, mais il provoque un mauvais formatage dans l'extrait ci-dessous).Ainsi, comme le souligne @Max, travailler avec la variance au lieu de l'écart-type et ne pas oublier de diviser par la variance totale résout le problème.
la source