Initiation Matlab et Théorie Bayesienne

Ce TP a pour objectif de vous initier à l'environnement Matlab en travaillant sur un problème de reconnaissance de formes appliqué à des données biomédicales. Vous apprendrez à manipuler des données, à visualiser des distributions et à implémenter des classifieurs bayésiens simples pour la prédiction du diabète à partir de variables sélectionnées.

D'après le document Initiation Matlab et Théorie Bayesienne

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

Initiation Matlab et Théorie Bayesienne

Document source

Initiation Matlab et Théorie Bayesienne

Programming, Math, Biometrics · PDF · 4 pages

Afficher l'aperçu du document

Consulter le document original →

Ce TP a pour objectif de vous initier à l'environnement Matlab en travaillant sur un problème de reconnaissance de formes appliqué à des données biomédicales. Vous apprendrez à manipuler des données, à visualiser des distributions et à implémenter des classifieurs bayésiens simples pour la prédiction du diabète à partir de variables sélectionnées. Ce TP nécessite Matlab et des connaissances de base en statistiques et programmation.

Objectifs

  • Charger et manipuler des données biomédicales dans Matlab.
  • Visualiser des données par histogrammes et graphiques 2D.
  • Normaliser des variables et calculer des statistiques descriptives.
  • Implémenter un classifieur bayésien sous hypothèse d'indépendance et de variance égale.
  • Implémenter un classifieur bayésien général avec estimation empirique de la matrice de covariance.
  • Visualiser les fonctions de décision et comparer les résultats des deux classifieurs.

Prérequis et installation

  • Matlab installé (version non spécifiée, mais compatible avec les fonctions load, hist, plot, meshgrid, reshape, contour).
  • Fichier de données « pima.mat » contenant les variables xall, y et n.
  • Connaissances de base en statistiques (moyenne, variance, covariance) et en programmation Matlab.
  • Notions élémentaires sur les classifieurs bayésiens et la reconnaissance de formes.

Chargement et préparation des données

Dans cette première étape, vous allez charger les données biomédicales et extraire les variables d'intérêt pour l'étude.

  • Charger le fichier « pima.mat » dans Matlab avec la commande :
load('pima.mat')
  • Extraire les variables (2) concentration en glucose et (6) indice de masse corporelle :
xtemp = xall(:, [2 6]);

Cette matrice xtemp contient les données d'apprentissage pour les deux variables sélectionnées. Vous pourrez ainsi visualiser et analyser plus facilement les données.

Analyse exploratoire des données

Cette étape vise à mieux comprendre la distribution des données et la séparation des classes.

  • Visualiser les histogrammes des deux variables pour chaque classe (diabétique et non diabétique) :
figure;
for i = 1:2
    subplot(2,2,i)
    hist(xtemp(y == (-1)^(i+1), i))
    title(['Histogramme variable ' num2str(i) ' classe ' num2str((-1)^(i+1))])
end
  • Tracer les exemples en 2D, en coloriant différemment les classes :
figure;
plot(xtemp(y == -1,1), xtemp(y == -1,2), 'bo')
hold on
plot(xtemp(y == 1,1), xtemp(y == 1,2), 'r+')
xlabel('Concentration en glucose')
ylabel('Indice de masse corporelle')
legend('Non diabétique', 'Diabétique')
title('Visualisation des données en 2D')
hold off

Une bonne visualisation permet d'apprécier la séparation possible entre les classes et la pertinence des variables choisies.

Implémentation du classifieur bayésien avec indépendance et même variance

Vous allez ici coder un classifieur bayésien simple sous l'hypothèse que les variables sont indépendantes et ont la même variance pour toutes les classes.

  • Estimer les probabilités empiriques des classes :
Pw1 = sum(y == 1) / n;
Pw_1 = sum(y == -1) / n;
  • Normaliser les variables (centrer et réduire) en conservant moyenne et écart-type :
mu_all = mean(xtemp);
sigma_all = std(xtemp);
x = (xtemp - mu_all) ./ sigma_all;

La variance σ est ici égale à 1 car les données sont normalisées.

  • Calculer les moyennes µi de chaque classe :
mu1 = mean(x(y == 1, :));
mu_1 = mean(x(y == -1, :));
  • Préparer une grille de points pour visualiser la fonction de décision :
[X1, X2] = meshgrid(linspace(min(x(:,1)), max(x(:,1)), 100), linspace(min(x(:,2)), max(x(:,2)), 100));
Xtest = [X1(:) X2(:)];
  • Calculer les fonctions gi(x) pour chaque classe (avec variance 1) :
g1 = -0.5 * sum((Xtest - mu1).^2, 2) + log(Pw1);
g_1 = -0.5 * sum((Xtest - mu_1).^2, 2) + log(Pw_1);
  • Calculer la fonction de prédiction f(x) = g1(x) – g-1(x) :
f = g1 - g_1;
  • Réorganiser les valeurs prédites en grille :
F = reshape(f, size(X1));
  • Visualiser la fonction de prédiction avec un contour :
figure;
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), 'r+')
xlabel('Variable 1 normalisée')
ylabel('Variable 2 normalisée')
title('Fonction de prédiction du classifieur bayésien (indépendance, même variance)')
legend('Frontière de décision', 'Non diabétique', 'Diabétique')
hold off

Cette étape permet de visualiser la frontière de décision sous l'hypothèse simplifiée.

Implémentation du classifieur bayésien général

Dans cette étape, vous allez coder le classifieur bayésien sans hypothèse restrictive sur la matrice de covariance.

  • Estimer les probabilités empiriques des classes :
Pw1 = sum(y == 1) / n;
Pw_1 = sum(y == -1) / n;
  • Calculer les moyennes µi de chaque classe :
mu1 = mean(x(y == 1, :));
mu_1 = mean(x(y == -1, :));
  • Estimer les matrices de covariance Σi de chaque classe :
Sigma1 = cov(x(y == 1, :));
Sigma_1 = cov(x(y == -1, :));

La matrice de covariance Σ est estimée empiriquement par la fonction cov.

  • Calculer les fonctions gi(x) pour chaque classe et chaque exemple de test :
invSigma1 = inv(Sigma1);
invSigma_1 = inv(Sigma_1);
detSigma1 = det(Sigma1);
detSigma_1 = det(Sigma_1);

g1 = -0.5 * sum((Xtest - mu1) * invSigma1 .* (Xtest - mu1), 2) - 0.5 * log(detSigma1) + log(Pw1);
g_1 = -0.5 * sum((Xtest - mu_1) * invSigma_1 .* (Xtest - mu_1), 2) - 0.5 * log(detSigma_1) + log(Pw_1);
  • Calculer la fonction de prédiction f(x) = g1(x) – g-1(x) :
f = g1 - g_1;
  • Réorganiser les valeurs prédites en grille :
F = reshape(f, size(X1));
  • Visualiser la fonction de prédiction avec un contour :
figure;
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), 'r+')
xlabel('Variable 1 normalisée')
ylabel('Variable 2 normalisée')
title('Fonction de prédiction du classifieur bayésien général')
legend('Frontière de décision', 'Non diabétique', 'Diabétique')
hold off

Comparez cette frontière avec celle obtenue précédemment. La différence illustre l'impact de la prise en compte des covariances entre variables.

Résultats attendus

Vous devez obtenir :

  • Des histogrammes montrant des distributions différentes pour chaque classe sur les variables glucose et IMC.
  • Une visualisation 2D des données avec une séparation visible entre diabétiques et non diabétiques.
  • Une frontière de décision sous forme de contour dans l'espace des variables normalisées pour le classifieur bayésien simple.
  • Une frontière de décision différente, généralement plus précise, pour le classifieur bayésien général prenant en compte la covariance.

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 les grilles de test en matrice d'exemples avant calcul des fonctions gi(x).
  • Ne pas vérifier que les matrices de covariance sont inversibles avant de calculer leur inverse.
  • Mal interpréter la fonction de prédiction f(x) : la frontière de décision correspond au niveau zéro.
  • Ne pas utiliser la fonction reshape pour remettre les résultats sous forme de grille, rendant la visualisation impossible.

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