** L'analyse en composantes principales ** est une technique permettant de résumer un grand nombre de variables en un petit nombre de nouvelles variables. En d'autres termes, on peut dire que c'est une technique qui révèle la tendance générale et les caractéristiques individuelles en compressant les informations détenues par plusieurs variables, en synthétisant de nouvelles variables et en reconstruisant les données. Cette nouvelle variable est appelée le ** composant principal **.
Supposons que les résultats des tests de 5 matières, mathématiques, sciences, sciences sociales, anglais et japonais, soient pour 20 élèves par classe. Par conséquent, lorsque vous voulez connaître vos capacités académiques, vous regardez généralement le «score total». Exprimons les cinq sujets sous forme de variables $ x_ {1}, x_ {2}, x_ {3}, x_ {4}, x_ {5} $.
Points totaux= 1×x_{1} + 1×x_{2} + 1×x_{3} + 1×x_{4} + 1×x_{5}
J'ai volontairement écrit 1 $ × $, mais le score total est la somme des cinq sujets multipliée par le même poids de 1 $. Ce qui se passe ici, c'est que l'information qui avait à l'origine 5 sujets = 5 dimensions est résumée en 1 dimension appelée «capacité scolaire». La méthode d'examen de la capacité académique basée sur ce score total est basée sur l'idée que toute personne ayant des capacités académiques aura un bon score dans n'importe quelle matière. En d'autres termes, il y aura une corrélation entre chaque sujet.
Par conséquent, préparons des données factices pour 20 personnes dans une classe et voyons toutes les données pour le moment.
#Bibliothèque pour les calculs numériques et les opérations sur les blocs de données
import numpy as np
import pandas as pd
#Bibliothèque pour dessiner des graphiques
import matplotlib.pyplot as plt
%matplotlib inline
#Bibliothèque d'apprentissage automatique
import sklearn
from sklearn.decomposition import PCA
#Données de score de test pour 20 personnes
arr = np.array([[71,64,83,100,71], [34,48,67,57,68], [58,59,78,87,66], [41,51,70,60,72],
[69,56,74,81,66], [64,65,82,100,71], [16,45,63,7,59], [59,59,78,59,62],
[57,54,84,73,72], [46,54,71,43,62], [23,49,64,33,70], [39,48,71,29,66],
[46,55,68,42,61], [52,56,82,67,60], [39,53,78,52,72], [23,43,63,35,59],
[37,45,67,39,70], [52,51,74,65,69], [63,56,79,91,70], [39,49,73,64,60]])
#Convertir en bloc de données
df = pd.DataFrame(data = arr, columns = ['Math', 'Science', 'société', 'Anglais', 'langue nationale'])
#Importer la méthode de tracé de pandas
from pandas import plotting
#Dessinez un diagramme de dispersion
plotting.scatter_matrix(df, alpha=0.5, figsize=(8, 8))
plt.show()
Du code pandas.plotting.scatter_matrix (frame, alpha, figsize)
qui dessine un diagramme de dispersion, l'argument ʻalpha est la transparence de la couleur du dessin (0 à 1), et
figsize` est la taille du dessin (largeur, hauteur). ) Est spécifié en pouces.
Que diriez-vous. Par exemple, vous pouvez voir une distribution linéaire qui monte vers la droite, comme les sciences et les mathématiques. Les scores en sciences plus élevés ont tendance à avoir des scores en mathématiques plus élevés, ce qui signifie qu'il existe une corrélation entre les données. Si tel est le cas, l'idée de l '** analyse en composantes principales ** est que les informations peuvent être compressées de manière plus compacte.
Le but de l'analyse en composantes principales est de compresser les données sans perdre autant d'informations que possible. Nous voulons minimiser la perte d'informations causée par la réduction du nombre de dimensions, en d'autres termes, nous recherchons une nouvelle variable qui maximise la quantité initiale d'informations. Maintenant, confirmons que l'analyse des composants principaux est effectivement effectuée dans ces étapes.
Tout d'abord, définissez le vecteur de 5 sujets = 5 variables comme suit.
x = \left(
\begin{array}{ccc}
x_{1} \\
x_{2} \\
x_{3} \\
x_{4} \\
x_{5}
\end{array}
\right)
** Calcul de la première composante principale ** La composante principale est définie comme "la valeur de chaque composante avec un coefficient ajouté à chaque variable" comme suit.
z_{1} = w_{11}x_{1} + w_{12}x_{2} + w_{13}x_{3} + w_{14}x_{4} + w_{15}x_{5} = w_{1}· X
Si $ w_ {1} $ sur le côté droit est représenté par un vecteur, ce sera comme suit, mais dans l'exemple précédent de total de points, $ 1 $ était tout inclus ici.
w_{1} = \left(
\begin{array}{ccc}
w_{11} \\
w_{12} \\
w_{13} \\
w_{14} \\
w_{15}
\end{array}
\right)
Ensuite, quel type de $ w_ {1} $ doit être recherché est "$ w_ {1} $ qui maximise la quantité d'informations". Quelle est cette quantité d'informations? Dans l'analyse en composantes principales, «information = dispersion». La dispersion est le degré de distribution des données, mais pourquoi la quantité d'informations est-elle importante lorsque la distribution est importante? C'est juste une analogie, mais disons que tout le monde a obtenu un score parfait de 10 sur un quiz très simple à la fin du cours. En d'autres termes, la distribution est de 0 $, mais dans ce cas, il n'y a pas d'information qui caractérise l'individu. Par contre, si la dispersion est raisonnable comme dans les 5 sujets de l'exemple, on peut évaluer que, par exemple, 90 points ou plus est bon et 20 points n'est pas bon. C'est pourquoi on peut dire que "distribution maximale = information maximale".
Cependant, même si la dispersion est maximale, elle peut en fait être aussi grande que vous le souhaitez. Si vous multipliez toutes les valeurs de $ w_ {1} $ à $ w_ {5} $ par 100, alors $ z_ {1} $ sera également multiplié par 100 et la distribution sera multipliée par 10 000. Ce n'est pas que vous puissiez le rendre infiniment grand, mais ce que vous voulez savoir, c'est le rapport de poids pour chaque sujet. Je veux savoir quel genre de ratio la quantité d'informations sera la plus importante. Alors gardez la taille constante.
\|w_{1}\| = 1
Trouvez $ w_ {1} $ qui maximise la quantité d'informations $ V [z_ {1}] $ sous une certaine règle selon laquelle l'ajout de tous les poids donne $ 1 $. En d'autres termes, si vous découvrez dans quelle direction et dans quel rapport la quantité d'informations est maximisée, cela s'appelle le ** premier composant principal **. Cela se répète.
** Calcul de la deuxième composante principale ** Cependant, je sais déjà que la quantité maximale d'informations est $ w_ {1} $, donc j'aimerais trouver un autre type de méthode de pondération de $ w_ {1} $ qui maximise la quantité d'informations. .. Par conséquent, je veux que $ w_ {2} $ soit tourné dans une direction différente de $ w_ {1} $, donc j'ajouterai une condition.
\|w_{2}\| = 1, w_{2}\perp{w_{1}}
La condition est que $ w_ {2} $ soit orthogonal à $ w_ {1} $. Maintenant $ w_ {2} $ a un autre type d'information que $ w_ {1} $. Ensuite, quand il est $ w_ {3} $, faites une condition qu'il soit orthogonal à la fois à $ w_ {1} $ et $ w_ {2} $, et quand il est $ w_ {4} $, faites une condition qui ... En répétant tout en ajoutant, ce qui suit peut être obtenu.
\left(
\begin{array}{ccc}
z_{1} \\
\vdots \\
z_{5}
\end{array}
\right)
= \left(
\begin{array}{cccc}
w_{11} & \ldots & w_{15} \\
\vdots & \ddots & \vdots \\
w_{51} & \ldots & w_{55}
\end{array}
\right)x
z=Wx
** L'analyse principale ** utilise ces formules pour compresser des dizaines de milliers ou des centaines de milliers de dimensions de données en centaines de dimensions afin que l'information d'origine reste autant que possible. En d'autres termes, la kème composante principale est la direction dans laquelle la variation des données est la kème la plus grande. En passant, les poids $ w_ {1}, w_ {2}, w_ {3}, w_ {4}, w_ {5} $ de chaque variable sont également appelés ** charge du composant principal **. Donc, enfin, en utilisant scikit-learn de la bibliothèque de machine learning, ce ** composant principal $ z_ {1} $ ** et ** composant principal charge $ w_ {1}, w_ {2}, w_ { Trouvez 3}, w_ {4}, w_ {5} $ **.
#Créer une instance du modèle
pca = PCA()
#Créer un modèle basé sur les données
pca.fit(df)
#Appliquer les données au modèle
values = pca.transform(df)
L'analyse en composantes principales est appelée analyse en composantes principales en anglais, elle est donc abrégée en PCA.
Tout d'abord, ➀ créez une instance qui sert de modèle pour le modèle, et ➁ transmettez les données à cette instance avec la fonction fit
pour générer le modèle. ➂ Il y a 3 étapes: si vous appliquez à nouveau les données à ce modèle, le score pour chaque composante principale sera calculé.
C'est difficile à voir, alors je vais le convertir en un bloc de données.
df_pca = pd.DataFrame(data = values,
columns = ["Composant principal{}".format(x+1) for x in range(len(df.columns))])
De la 1ère composante principale à la 5e composante principale, chaque élève a 5 points. Ce score est appelé le ** score de la composante principale **. Étant donné que l'original comprend 5 sujets et 5 dimensions, le composant principal est également le plus 5 dimensions.
#Calculer le taux de cotisation du modèle pca
ev_ratio = pca.explained_variance_ratio_
#Convertir la contribution en bloc de données
df_evr = pd.DataFrame(data = ev_ratio,
columns = ['Taux de cotisation'],
index = ["Composant principal{}".format(x+1) for x in range(len(df.columns))])
Le taux de cotisation est un indice montrant le pouvoir explicatif de chaque composante principale. La valeur de 0 $ ≤ c ≤ 1 $ est prise parce que le rapport de la quantité d'informations que les données ont à l'origine = la distribution des principaux composants = le pourcentage de la quantité d'informations. Quoi qu'il en soit, le premier élément principal a la plus grande quantité d'informations, l'autre plus grande quantité d'informations est recherchée, et le deuxième plus grand est ..., donc le taux de cotisation est le plus élevé dans le premier élément principal et diminue dans l'ordre. La somme de toutes les contributions est de 1 $. Vous pouvez le voir en créant un graphique appelé ** Taux de contribution cumulé **.
#Accumuler le taux de cotisation
cc_ratio = np.cumsum(ev_ratio)
#Concaténer 0
cc_ratio = np.hstack([0, cc_ratio])
#Dessinez un graphique
plt.plot(cc_ratio, "-o")
plt.xlabel("Composant principal")
plt.ylabel("Taux de cotisation cumulé")
plt.grid()
plt.show()
Puisque le taux de cotisation du premier élément principal à lui seul dépasse 90%, j'estime que le deuxième élément principal et au-delà ne sont pas nécessaires, mais ce n'est pas toujours le cas.
#Calculer la dispersion des composants principaux
eigen_value = pca.explained_variance_
pd.DataFrame(eigen_value,
columns = ["Distribué"],
index = ["Composant principal{}".format(x+1) for x in range(len(df.columns))])
Vous pouvez voir que l'ampleur de la dispersion reflète le taux de cotisation. La dispersion du premier composant principal est extrêmement plus grande que celle des autres composants principaux, et il contient une grande quantité d'informations.
#Calculer la charge du composant principal
eigen_vector = pca.components_
#Convertir en bloc de données
pd.DataFrame(eigen_vector,
columns = [df.columns],
index = ["Composant principal{}".format(x+1) for x in range(len(df.columns))])
Que signifie le composant principal? ** 1er composant principal **: Les 5 sujets sont marqués d'un signe moins C'est comme inverser le total des points, et le fait est que les données sont le plus dispersées selon qu'elles sont toutes élevées ou toutes faibles. Puisqu'il y a un moins, plus le score total est élevé, plus le score du composant principal est petit. Parmi eux, le coefficient anglais est particulièrement élevé, c'est-à-dire que même si le score anglais est légèrement différent, le score de la composante principale sera significativement différent. ** Deuxième composante principale **: anglais / japonais est négatif et grand, et mathématiques / sciences est positif et grand. Plus le score en mathématiques / sciences est élevé, plus le score de la composante principale est élevé et plus le score de l'anglais / japonais est bas, plus le score de la composante principale est élevé. Pour ainsi dire, les données sont dispersées dans le sens de la science ou des arts libéraux, et plus il y a de gens qui sont bons dans les matières scientifiques et pas bons dans les matières des arts libéraux, plus le score de la composante principale est élevé. ** Troisième composante principale **: La langue nationale est exceptionnelle et négative. En d'autres termes, les données sont dispersées dans le sens de savoir si vous parlez ou non la langue nationale, et plus le score de la langue nationale est élevé, plus le score de la composante principale est petit.
En résumé, le score total est-il élevé ou faible dans la direction dans laquelle les données sont le plus dispersées (** 1ère composante principale )? La prochaine ( 2e composante principale ) est plus proche du système littéraire ou du système scientifique, et la direction avec la prochaine plus grande variation ( 3e composante principale **) est de savoir si vous pouvez ou non parler japonais. Il semble que les données soient dispersées. Cette analyse montre que si vous utilisez ces trois composants principaux, vous pouvez obtenir les informations les plus riches de la compression tridimensionnelle.
À la fin, en quoi le classement des capacités académiques de l'étudiant diffère-t-il entre le score total, qui est simplement la somme des scores des cinq matières, et le score de la première composante principale, qui représente 90% de la quantité d'informations pour les cinq matières? J'aimerais confirmer.
##Créer un classement par score total
#Calculer le total des points
sum = np.sum(np.array(df), axis=1)
#Convertir en un tableau bidimensionnel 20x1
sum.reshape(len(sum), 1)
#Convertir en bloc de données
df_sum = pd.DataFrame(sum,
columns = ['Points totaux'],
index = ["ID{}".format(x+1) for x in range(len(df.index))])
#Tri décroissant
df_sum_rank = df_sum.sort_values('Points totaux', ascending=False)
##Créer un classement par score du premier composant principal
#Extraire le composant 1
df_PC1 = df_pca["Composant principal 1"]
#Convertir en tableau
pc1 = np.array(df_PC1)
#Convertir en un tableau bidimensionnel 20x1
pc1 = pc1.reshape(len(pc1), 1)
#Donnez une pièce d'identité
df_pca = pd.DataFrame(pc1,
columns = ['Composant principal 1'],
index = ["ID{}".format(x+1) for x in range(len(df.index))])
#Tri croissant
df_pca_rank = df_pca.sort_values('Composant principal 1')
La ** 1ère composante principale ** est de savoir si le score total est élevé ou faible, de sorte que les classements du groupe supérieur et du groupe inférieur sont les mêmes. En attendant, la classe moyenne est un peu différente, mais j'ai trouvé que le sentiment du score total, «Je pense que les personnes ayant des capacités académiques peuvent faire n'importe quelle matière», est généralement approprié.
Maintenant, dans la section suivante, je voudrais démêler davantage le mécanisme de calcul de l'analyse en composantes principales sans utiliser scicit-learn.