Étude sur l’indice de masse corporelle
Ce TP a pour objectif de vous initier à l'environnement Matlab et à la théorie bayésienne à travers un problème biomédical concret : la prédiction du diabète chez des femmes amérindiennes Pimas. Vous apprendrez à manipuler des données, visualiser des distributions, et implémenter deux versions d'un classifieur bayésien.
D'après le document Étude sur l’indice de masse corporelle
Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.
Document source
Statistical Analysis in Pediatrics · PDF · 2 pages · 2021
Afficher l'aperçu du document
Ce TP a pour objectif de vous initier à l'environnement Matlab et à la théorie bayésienne à travers un problème biomédical concret : la prédiction du diabète chez des femmes amérindiennes Pimas. Vous apprendrez à manipuler des données, visualiser des distributions, et implémenter deux versions d'un classifieur bayésien. Ce travail nécessite Matlab et un fichier de données « pima.mat » contenant des mesures biomédicales.
Objectifs
- Charger et manipuler des données biomédicales dans Matlab.
- Visualiser des données par histogrammes et graphiques 2D.
- Implémenter un classifieur bayésien simple avec hypothèse d’indépendance et variance égale.
- Implémenter un classifieur bayésien général avec estimation de matrices de covariance.
- Comparer les fonctions de décision obtenues par les deux classifieurs.
Prérequis et installation
- Matlab installé (version compatible avec les fonctions load, hist, plot, meshgrid, reshape, contour).
- Fichier « pima.mat » contenant les variables : xall (709×8), y (709×1), n = 709.
- Connaissances de base en statistiques, notamment sur la normalisation, les moyennes, variances et covariances.
- Notions élémentaires de théorie bayésienne et classification.
Chargement et préparation des données
Dans cette étape, vous chargez les données et préparez la matrice d’apprentissage avec les variables choisies.
- Charger le fichier « pima.mat » avec la commande Matlab :
load('pima.mat')
xtemp = xall(:, [2 6]);
Un résultat correct est une matrice 709×2 contenant les deux variables sélectionnées.
Analyse exploratoire des données
Cette étape vise à visualiser la distribution des variables selon la classe (diabétique ou non) pour mieux comprendre le problème.
- Tracer des histogrammes pour chaque variable et chaque classe :
hist(xtemp(y == -1, 1)) % glucose non diabétique
hist(xtemp(y == 1, 1)) % glucose diabétique
hist(xtemp(y == -1, 2)) % IMC non diabétique
hist(xtemp(y == 1, 2)) % IMC diabétique
plot(xtemp(y == -1, 1), xtemp(y == -1, 2), 'bo') % non diabétiques en bleu
hold on
plot(xtemp(y == 1, 1), xtemp(y == 1, 2), 'ro') % diabétiques en rouge
hold off
Un bon résultat montre des histogrammes distincts selon la classe et un nuage de points 2D où les deux classes sont visibles avec des couleurs différentes.
Implémentation du classifieur bayésien simplifié
Vous implémentez ici un classifieur bayésien sous l’hypothèse que les variables sont indépendantes et ont la même variance (σ² = 1) pour toutes les classes.
- Estimer les probabilités empiriques P(wi) pour chaque classe :
Pw1 = sum(y == 1) / n;
Pw_1 = sum(y == -1) / n;
moyenne = mean(xtemp);
ecart_type = std(xtemp);
x = (xtemp - moyenne) ./ ecart_type;
mu1 = mean(x(y == 1, :));
mu_1 = mean(x(y == -1, :));[X1, X2] = meshgrid(linspace(min(x(:,1)), max(x(:,1)), 100), linspace(min(x(:,2)), max(x(:,2)), 100));
Xtest = [X1(:) X2(:)];
g1 = -0.5 * sum((Xtest - mu1).^2, 2) + log(Pw1);
g_1 = -0.5 * sum((Xtest - mu_1).^2, 2) + log(Pw_1);
f = g1 - g_1;
F = reshape(f, size(X1));
contour(X1, X2, F, [0 0], 'LineWidth', 2)
hold on
plot(x(y == -1, 1), x(y == -1, 2), 'bo')
plot(x(y == 1, 1), x(y == 1, 2), 'ro')
hold off
Un résultat correct montre une frontière de décision lisse séparant les deux classes sur le graphique.
Implémentation du classifieur bayésien général
Cette étape généralise le classifieur en estimant la matrice de covariance Σi pour chaque classe, sans hypothèse de variance égale ou indépendance.
- Estimer les probabilités empiriques P(ωi) :
Pw1 = sum(y == 1) / n;
Pw_1 = sum(y == -1) / n;
mu1 = mean(x(y == 1, :));
mu_1 = mean(x(y == -1, :));Sigma1 = cov(x(y == 1, :));
Sigma_1 = cov(x(y == -1, :));
invSigma1 = inv(Sigma1);
invSigma_1 = inv(Sigma_1);
detSigma1 = det(Sigma1);
detSigma_1 = det(Sigma_1);
diff1 = Xtest - mu1;
diff_1 = Xtest - mu_1;
g1 = -0.5 * sum((diff1 * invSigma1) .* diff1, 2) - 0.5 * log(detSigma1) + log(Pw1);
g_1 = -0.5 * sum((diff_1 * invSigma_1) .* diff_1, 2) - 0.5 * log(detSigma_1) + log(Pw_1);
f = g1 - g_1;
F = reshape(f, size(X1));
contour(X1, X2, F, [0 0], 'LineWidth', 2)
hold on
plot(x(y == -1, 1), x(y == -1, 2), 'bo')
plot(x(y == 1, 1), x(y == 1, 2), 'ro')
hold off
La différence avec le classifieur précédent réside dans la forme plus flexible de la frontière de décision, qui peut être non linéaire et mieux adaptée aux données.
Résultats attendus
- Visualisation claire des distributions des deux classes sur les histogrammes.
- Nuage de points 2D où les classes sont distinctes par couleur.
- Frontière de décision du classifieur bayésien simplifié sous forme d’une ligne droite ou quasi-linéaire.
- Frontière de décision du classifieur bayésien général plus complexe, pouvant être courbée, reflétant la covariance des variables.
- Probabilités empiriques P(wi) cohérentes avec la proportion des classes dans les données.
Pièges courants
- Ne pas normaliser les variables avant d’estimer les moyennes et covariances, ce qui fausse les calculs.
- Confondre les indices des classes (-1 et +1) lors de la sélection des données.
- Oublier de convertir la grille de test en matrice d’exemples avant le calcul des fonctions gi(x).
- Ne pas vérifier que les matrices de covariance sont inversibles avant de calculer leur inverse.
- Tracer la fonction de décision sans utiliser la fonction reshape, ce qui empêche une visualisation correcte.
- Interpréter une frontière de décision non linéaire comme une erreur alors qu’elle est attendue dans le cas général.
Commentaires
Aucun commentaire pour le moment. Posez la première question.