Analyse en composantes principales et apprentissage


(last modification date: October 10, 2017)
Version pdf de ce document
Version sans bandeaux

1 Rappels
2 ACP sur un groupe de bovins
3 Classement de caractères manuscrits

Contents

1 Rappels
2 ACP sur un groupe de bovins
 2.1 Présentation des données
 2.2 Valeurs propres de la matrice des corrélations
 2.3 Cercle des corrélations
 2.4 Étude d’une variable nominale supplémentaire
3 Classement de caractères manuscrits
 3.1 Présentation des données
 3.2 Classement par la méthode du plus proche voisin
 3.3 Prétraitement-compression des données par ACP
 3.4 Classement des données prétraitées

1 Rappels

Considérons un nuage ν de n points dans un espace E de dimension p. Lorsque E est de dimension élevée, on ne peut pas visualiser l’espace de points. Un des buts de l’analyse en composantes principales est alors de trouver le meilleur sous-espace H de E, de dimension h égale à 2 ou 3 par exemple, dans lequel on aura la meilleure représentation du nuage. En fait, l’analyse en composantes principales cherche à trouver le sous-espace H de dimension h sur lequel le nuage projeté du nuage ν aura la plus grande ”dispersion”.

Soit X la matrice où Xi,j, 1 i n, 1 j p est la valeur de la j-ème variable pour le i-ème point.

Notons (λ1 λp) le spectre de la matrice symétrique réelle Xt X et (⃗v
 1,,v⃗
  p) la base orthonormée de vecteurs propres associée.

Pour tout 1 h p, j=1hλ j est l’inertie du nuage de points ν par rapport au sous-espace H engendré par (⃗v
 1,,⃗v
 h) , et ∑
∑phj=1λj-
  i=1λi est le pourcentage d’inertie expliqué par le sous-espace H. Ce pourcentage d’inertie rend compte de la part de dispersion du nuage ν contenue dans le nuage projeté de ν sur H.

2 ACP sur un groupe de bovins

2.1 Présentation des données

Nous allons étudier dans cette partie la distribution des mesures de poids de différentes parties d’un groupe de 23 bovins1 (cf la table ci-dessous).

Les variables représentent:

  1. poids vif.
  2. poids de la carcasse.
  3. poids de la viande de première qualité.
  4. poids de la viande totale.
  5. poids du gras.
  6. poids des os.








BovinX1X2 X3 X4 X5 X6







1 39522435.179.1 6.014.9
2 41023231.973.4 8.716.4
3 40523330.776.5 7.016.5
4 40524030.475.3 8.716.0
5 39021731.976.5 7.815.7
6 41524332.177.4 7.118.5
7 39022932.178.4 4.617.0
8 40524031.176.5 8.215.3
9 42023432.476.0 7.216.8
10 39022333.877.0 6.216.8
11 41524730.775.5 8.416.1
12 40023431.777.6 5.718.7
13 40022428.273.511.015.5
14 39522929.474.5 9.316.1
15 39521929.772.8 8.718.5
16 39522428.573.7 8.717.3
17 40022328.573.1 9.117.7
18 40022427.873.212.214.6
19 40022126.572.313.214.5
20 41023325.972.311.116.6
21 40223427.172.110.417.5
22 40022326.870.313.516.2
23 40021325.870.412.117.5







On dispose d’une matrice poids de taille (23, 6) correspondant aux poids des 23 bovins selon les 6 critères (fichier poids.txt). On charge les données dans Scilab, après avoir sauvegardé localement le fichier par exemple sous le nom poids.txt, à l’aide de la commande

poids=fscanfMat("poids.txt")

L’analyse des données nous conduit tout d’abord à calculer les paramètres descriptifs élémentaires presentés dans le tableau ci dessous.






MoyenneÉcart-type Min Max





X1 401.6 8.2 390.0420.0
X2 228.8 8.7 213.0247.0
X3 29.9 2.6 25.8 35.1
X4 74.7 2.5 70.3 79.1
X5 8.9 2.4 4.6 13.5
X6 16.6 1.2 14.5 18.7





L’écart-type d’une suite de poids P1,,Pn est estimé par:

┌│ -------------------
│   1   ∑n
∘ ------    (Pi − P¯)2,
  n −  1 i=1
P = 1
n i=1nP i.

2.2 Valeurs propres de la matrice des corrélations

La matrice des corrélations nous donne une première idée des associations existant entre les différentes variables.








X1 X2 X3 X4 X5 X6







X1 1.0000 0.6914-0.0329-0.0585 0.0820 0.0820
X2 0.6914 1.0000 0.2837 0.3903-0.3363 0.0917
X3-0.0329 0.2837 1.0000 0.8948-0.8773 0.0348
X4-0.0585 0.3903 0.8948 1.0000-0.9016 0.0032
X5 0.0820 -0.3363-0.8773-0.9016 1.0000-0.3368
X6 0.0820 0.0917 0.0348 0.0032-0.3368 1.0000







La matrice de corrélations est obtenue en exécutant la fonction MatCor=correlation(poids) ( correlation).

Cette fonction fait appel à la fonction covariance.

Calculons les valeurs propres de la matrice des corrélations et intéressons nous aux pourcentages d’inertie.





AxeValeur propre InertieInertie cumulée




1 2.9914 49.90% 49.90%
2 1.6125 26.90% 76.80%
3 1.0387 17.30% 94.10%
4 0.2487 4.10% 98.20%
5 0.0758 1.30% 99.50%
6 0.0329 0.50% 100.00%





PIC

Figure 1: Éboulis des valeurs propres

Les valeurs propres sont calculées sur la matrice de corrélation avec la fonction valprop.

L’inertie expliquée par la i-ème composante principale, qui est associée à la i-ème plus grande valeur propre, est calculée avec la formule: ∑p-λi---
  j=1 λj.

Question 1 Analyser le résultat obtenu.

2.3 Cercle des corrélations

Les vecteurs propres sont calculés sur la matrice de corrélation avec la fonction [valpr,vectpr]=vectprop(MatCor) (vectprop.sce) qui renvoie les valeurs propres rangées dans l’ordre décroissant et les vecteurs propres associées.








⃗v
 1 ⃗v
 2 ⃗v
 3 v⃗
 4 ⃗v
 5 ⃗v
 6







X1 0.063 0.743 0.060 0.597 0.283-0.063
X2 0.304 0.609 0.117-0.643-0.331 0.019
X3 0.534-0.164 0.137 0.461-0.646 0.200
X4 0.548-0.138 0.176-0.130 0.595 0.528
X5-0.552 0.147 0.172 0.032-0.193 0.778
X6 0.120 0.100-0.950 0.007-0.040 0.266







Les coordonnées, calculées à partir de la matrice des données, des variables dans le système orthonormée des composantes principales normalisées sont obtenues avec la fonction V=acpvar(poids) acpvar.sce.

Cette fonction fait appel à la fonction reduire qui permet de centrer et de normer une matrice de données de telle sorte que la moyenne de chaque variable soit nulle et que son écart-type soit égal à 1.

Cela nous permet de représenter le cercle des corrélations dans le plan formé par les deux composantes principales. Pour représenter le cercle des corrélations sur les axes i-j, on utilise la fonction cercle(V,i,j) (cercle).

Question 2 Tracer le cercle des corrélations du plan factoriel 1-2. Commenter.

2.4 Étude d’une variable nominale supplémentaire

Les données proviennent de deux races Charolais ou Zébu.

Nous obtenons, à partir de la matrice des données, les coordonnées des individus dans la base orthonormée des vecteurs propres de la matrice des corrélations avec la fonction acpindiv (acpindiv(poids)).

Le programme representation(acpindiv(poids),race,i,j) (representation) permet de visualiser la variable nominale supplémentaire race dans le plan factoriel i-j.

Question 3 En déduire une méthode de classement d’un bovin en zébu ou charolais basée sur l’observations des variables caractérisant le bovin.

3 Classement de caractères manuscrits

3.1 Présentation des données

La reconnaissance de caractères manuscrits par un système automatisé est un problème aux multiples applications: reconnaissance des codes postales, création de petit système mobile de saisie de texte (par exemple, pour les ordinateurs de poche), numérisation de documents manuscrits, ...

Les méthodes les plus performantes pour reconnaître un caractère manuscrit sont basées sur des méthodes d’apprentissage statistique: leur principe commun est de fonder leur prédiction sur la comparaison de l’image du caractère manuscrit à classer à d’autres images de caractères manuscrits pour lesquels la nature du caractère est connue. Typiquement, si une image arrive et qu’elle est très similaire à l’image de nombreux ’1’ de notre base d’apprentissage, l’algorithme classera l’image dans la catégorie ’1’.

Les données considérées ici proviennent de la base MNIST (http://yann.lecun.com/exdb/mnist/) sur laquelle des milliers de chercheurs ont travaillé. Elle est constituée de 70 000 chiffres manuscrits au format 28 pixels par 28 pixels où chaque pixel est représenté par un niveau de gris allant de 1 à 256 (i.e. un chiffre manuscrit est donc un vecteur de {1,, 256}28×28).


PIC

PIC

Figure 2: A gauche: exemple de caractères manuscrits 28×28. A droite: Zoom sur le premier caractère manuscrit 28 × 28. Ce caractère manuscrit appartient à la classe ’5’. (Notez que curieusement zoomer sur une image d’un caractère manuscrit ne le rend pas plus lisible)

Dans ce TP, pour limiter le temps de calcul et la mémoire nécessaire, nous ne considérons que 800 chiffres manuscrits (que des ’3’ et des ’5’): 400 chiffres manuscrits seront utilisés pour apprendre, i.e. calibrer l’algorithme. Ces 400 chiffres manuscrits et la classe (’3’ ou ’5’) qui leur est associée constituent l’ensemble d’apprentissage. Les 400 autres chiffres manuscrits seront uniquement utilisés pour évaluer la qualité des algorithmes. Ces 400 caractères manuscrits constituent donc l’ensemble de test.

On dispose d’une matrice de taille (800, 1 + (28 × 28)) correspondant aux poids des 800 caractères manuscrits où

On charge les données dans Scilab, après avoir sauvegardé localement les fichiers chiffres3.txt et chiffres5.txt contenant les ’3’ et les ’5’, à l’aide des commandes:

chiffres3=fscanfMat("chiffres3.txt");  
chiffres5=fscanfMat("chiffres5.txt");  
n=200;  
chiffres=[chiffres3(1:n,:);chiffres5(1:n,:);chiffres3(n+1:2*n,:);chiffres5(n+1:2*n,:)];

En cas de message d’erreur concernant la taille de la pile, on peut augmenter la taille maximale de cette dernière à l’aide de la commande stacksize(new_size).

3.2 Classement par la méthode du plus proche voisin

On considère l’algorithme du plus proche voisin pour la distance euclidienne entre les vecteurs de 28×28 que sont les images de caractères manuscrits.

La fonction classe(EnsTest,EnsApprentissage) (nearest.sce) permet de classer les données de test en appliquant l’algorithme du plus proche voisin basé sur l’ensemble d’apprentissage EnsApprentissage. Elle renvoie le taux des données de l’ensemble EnsTest ayant été mal classées par la méthode. Les ensembles d’apprentissage et de test sont respectivement composés des 200 premiers chiffres et des 200 derniers.

chiffres_sans_label=chiffres(:,2:$);  
EnsApprentissage=chiffres(1:2*n,:);  
EnsTest=chiffres(2*n+1:4*n,:);  
p = classe(EnsTest,EnsApprentissage);

Question 4 Quel est le pourcentage de caractères manuscrits de l’ensemble de test mal classés par l’algorithme du plus proche voisin. Critiquer la méthode utilisée.

3.3 Prétraitement-compression des données par ACP

La matrice des covariances est obtenue en exécutant la fonction covariance(chiffres_sans_label). Les valeurs propres sont calculées sur la matrice de covariance avec la fonction

MatCov=covariance(chiffres_sans_label);  
[valpr, vectpr]=vectprop(MatCov);

Question 5 Analyser l’éboulis des valeurs propres. Combien de composantes doivent être conservées pour avoir plus de 95% de l’inertie. (On pourra utiliser le code ’sum(A(1:k))’ qui permet de faire la somme des k premiers éléments d’un vecteur A.)

La fonction [M_proj] = projection(M, vectpr, k) (projection.sce) renvoie la projection de la matrice M sur les k premiers vecteurs propres.

Question 6 Afficher les images associées aux directions principales choisies à la question précédente. Pour quelles valeurs de k, les composantes principales contiennent-elles suffisamment d’informations pour que le chiffre soit toujours aussi reconnaissable par l’oeil humain?

Pour afficher les images associées aux directions principales choisies à la question précédente, on pourra utiliser la fonction show_mat.sce et le code suivant

[chiffres_sans_label_proj] = projection(chiffres_sans_label, vectpr, k);  
i=4;  
show_mat(chiffres_sans_label(i,:)); show_mat(chiffres_sans_label_proj(i,:), [1,0]);  
i=n+4;  
show_mat(chiffres_sans_label(i,:)); show_mat(chiffres_sans_label_proj(i,:), [1,0]);

3.4 Classement des données prétraitées

Question 7 Appliquer l’algorithme du plus proche voisin pour les différentes valeurs de k (c’est-à-dire, lorsque la distance euclidienne utilisée est celle sur les vecteurs composés par les k composantes principales). Au vu des résultats sur l’ensemble test, comment choisir k pour avoir les meilleurs résultats? Quelle est l’inertie contenue par ces composantes? Commenter. En pratique, nous ne connaissons pas l’ensemble test. Comment peut-on choisir k en pratique?