Analyse Discriminante

Analyse Discriminante - Étude de la base Iris Cette section détaille l'application de l'analyse factorielle discriminante (AFD ou LDA) sur le jeu de données classique des iris de Fisher. Présentation des données La base de données des iris contient 150 individus répartis de manière équilibrée en trois classes (espèces florales : setosa, versicolor et virginica), soit 50 individus par classe.

D'après le document Analyse Discriminante

Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.

Analyse Discriminante

Document source

Analyse Discriminante

Programming, Math, Statistics · PPTX · 10 pages · 2019

Consulter le document original →

Analyse Discriminante - Étude de la base Iris

Cette section détaille l'application de l'analyse factorielle discriminante (AFD ou LDA) sur le jeu de données classique des iris de Fisher.

Présentation des données

La base de données des iris contient 150 individus répartis de manière équilibrée en trois classes (espèces florales : setosa, versicolor et virginica), soit 50 individus par classe. Quatre variables quantitatives sont mesurées en centimètres pour chaque fleur :

  1. Longueur du sépale
  2. Largeur du sépale
  3. Longueur du pétale
  4. Largeur du pétale

Modélisation et projection avec R

Le code fourni dans le document source utilise le langage R et la fonction lda (qui nécessite la librairie MASS). Une matrice de nuages de points est d'abord générée pour observer la séparabilité des classes.

Voici le code corrigé et fonctionnel. Dans le document source, la commande de traçage des axes discriminants contenait une erreur de frappe (iris$Sp au lieu de iris$Species) et faisait appel à une variable m (les centres des classes) qui n'était pas calculée. Ces éléments ont été réparés ici :

# Chargement de la librairie nécessaire
library(MASS)

# 1. Visualisation initiale des données croisées
plot(iris[1:4], pch=20, col=c("red", "green", "blue")[as.numeric(iris$Species)])

# 2. Apprentissage du modèle
res = lda(Species ~ ., data=iris)
print(res)

# 3. Calcul des prédictions (scores et coordonnées sur les axes)
res.pred = predict(res)

# 4. Projection des individus sur les deux axes discriminants (LD1 et LD2)
# Correction : 'iris$Sp' devient 'iris$Species'
plot(res.pred$x[,1], res.pred$x[,2], bg=as.numeric(iris$Species), pch=21,  
     main="Analyse factorielle discriminante sur les données Iris", 
     xlab="Premier axe discriminant", ylab="Second axe discriminant", 
     cex.lab=1.5, cex.main=2)

# Reconstruction des centres des classes 'm' pour l'affichage
m = predict(res, newdata=data.frame(res$means))$x
points(m[,1], m[,2], pch=15, bg=1:3, cex=2, col=1:3)

Interprétation des résultats du modèle lda :

  • Prior probabilities of groups : Les probabilités a priori sont d'un tiers (0.333) pour chaque classe, confirmant que les classes sont parfaitement équilibrées.
  • Group means : Les centres de gravité de chaque classe dans l'espace d'origine.
  • Coefficients of linear discriminants : Les poids des variables pour la construction des axes discriminants (LD1 et LD2).
  • Proportion of trace : L'axe LD1 capte 99.12% (0.9912) du pouvoir discriminant, tandis que LD2 n'en capte que 0.88% (0.0088). L'essentiel de la séparation se fait donc sur le premier axe.

Prédiction d'une nouvelle observation

Le document propose de classer une nouvelle fleur ayant les coordonnées suivantes :

  • Longueur du sépale = 4.5
  • Largeur du sépale = 3
  • Longueur du pétale = 1.5
  • Largeur du pétale = 0.2

Le modèle calcule un score d'appartenance (classification de Fisher) pour chaque espèce à l'aide d'une fonction linéaire. La formule générale pour une classe est : Score = (Coeff_1 × Var_1) + (Coeff_2 × Var_2) + (Coeff_3 × Var_3) + (Coeff_4 × Var_4) + Constante

Calculons ces scores de manière exacte en utilisant les coefficients donnés dans l'exemple :

1. Calcul pour la classe Setosa :

  • Score_Setosa = (2.35 × 4.5) + (2.35 × 3) + (-1.64 × 1.5) + (-1.73 × 0.2) - 86.3
  • Score_Setosa = 10.575 + 7.05 - 2.46 - 0.346 - 86.3
  • Score_Setosa = 14.819 - 86.3 = -71.481 (Le document source affiche -71.48, ce qui correspond à un arrondi correct à deux décimales).

2. Calcul pour la classe Versicolor :

  • Score_Versicolor = (1.56 × 4.5) + (0.7 × 3) + (0.52 × 1.5) + (0.64 × 0.2) - 72.85
  • Score_Versicolor = 7.02 + 2.1 + 0.78 + 0.128 - 72.85
  • Score_Versicolor = 10.028 - 72.85 = -62.822 (Le document source affiche -62.82, ce qui correspond à un arrondi correct à deux décimales).

3. Calcul pour la classe Virginica :

  • Score_Virginica = (1.24 × 4.5) + (0.36 × 3) + (1.27 × 1.5) + (2.1 × 0.2) - 104.36
  • Score_Virginica = 5.58 + 1.08 + 1.905 + 0.42 - 104.36
  • Score_Virginica = 8.985 - 104.36 = -95.375 (Le document source affiche -95.37. D'un point de vue purement mathématique, -95.375 s'arrondit généralement à -95.38, mais nous comprenons que la source a tronqué le dernier chiffre).

Conclusion : On affecte l'individu à la classe qui maximise ce score. Les valeurs étant négatives, la valeur maximale est la plus proche de zéro. Ici, -62.822 > -71.481 > -95.375. La nouvelle fleur appartient donc à la classe Versicolor.

Implémentation équivalente en Python

Les dernières diapositives mentionnent une implémentation avec Python, mais le code source n'est pas fourni sous format texte. Voici le code Python (utilisant la librairie scikit-learn) qui accomplit exactement les mêmes tâches que le script R présenté plus haut : apprentissage, prédiction et projection.

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 1. Chargement des données
iris = load_iris()
X = iris.data
y = iris.target

# 2. Création et ajustement du modèle LDA
lda = LinearDiscriminantAnalysis()
X_lda = lda.fit_transform(X, y)

# 3. Prédiction sur une nouvelle observation (4.5, 3.0, 1.5, 0.2)
nouvelle_fleur = [[4.5, 3.0, 1.5, 0.2]]
prediction = lda.predict(nouvelle_fleur)
print(f"Classe prédite : {iris.target_names[prediction][0]}")

# 4. Projection sur les axes discriminants
plt.figure(figsize=(8, 6))
scatter = plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y, cmap='brg', edgecolor='k', s=50)
plt.title('Analyse factorielle discriminante sur les données Iris')
plt.xlabel('Premier axe discriminant (LD1)')
plt.ylabel('Second axe discriminant (LD2)')
plt.legend(handles=scatter.legend_elements()[0], labels=list(iris.target_names))
plt.show()

Méthode

Face à un exercice d'Analyse Discriminante, voici la marche à suivre :

  1. Vérifier les hypothèses et les données a priori : Identifiez les probabilités a priori. Si le jeu de données est équilibré (comme ici avec 1/3 pour chaque classe), les seuils de décision ne seront pas biaisés par la taille des classes.
  2. Analyser la trace (Proportion of trace) : Regardez les valeurs associées aux axes discriminants (LD1, LD2, etc.). Cela vous indique combien de dimensions sont réellement nécessaires pour séparer vos classes. Si le premier axe concentre 99% de l'information (comme dans cet exemple), projeter les données sur une seule dimension pourrait suffire.
  3. Appliquer les fonctions de classification : Pour prédire la classe d'un nouvel individu, ne vous laissez pas déconcerter par des scores négatifs. Calculez rigoureusement le produit matriciel (ou la somme pondérée) avec l'ordonnée à l'origine. Identifiez ensuite la valeur algébrique la plus élevée (la plus proche de 0 ou la plus grande du côté positif).
  4. Méfiance face au code brut : Soyez capable de repérer les variables manquantes (comme m dans le code R) ou les fautes de frappe de syntaxe, et corrigez-les mentalement ou sur votre copie pour démontrer votre compréhension de l'outil informatique sous-jacent.

Partager

Commentaires

Aucun commentaire pour le moment. Posez la première question.

Les commentaires sont relus avant publication. Votre e-mail n'est jamais affiché.

← Toutes les révisions