init: import TPs

This commit is contained in:
Laureηt 2023-05-29 16:43:44 +02:00
commit eac4c5b650
Signed by: Laurent
SSH key fingerprint: SHA256:kZEpW8cMJ54PDeCvOhzreNr4FSh6R13CMGH/POoO8DI
62 changed files with 1056 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 987 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 977 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,002 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 991 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,011 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 966 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 989 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,013 KiB

BIN
TP1/Quizz_GroupeIJ/ishihara-6.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,013 KiB

BIN
TP1/Quizz_GroupeIJ/ishihara-7.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,000 KiB

BIN
TP1/Quizz_GroupeIJ/ishihara-8.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,013 KiB

BIN
TP1/Quizz_GroupeIJ/ishihara-9.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,006 KiB

69
TP1/exercice_1.m Executable file
View file

@ -0,0 +1,69 @@
clear;
close all;
taille_ecran = get(0,'ScreenSize');
L = taille_ecran(3);
H = taille_ecran(4);
figure('Name','Separation des canaux RVB','Position',[0,0,0.67*L,0.67*H]);
figure('Name','Nuage de pixels dans le repere RVB','Position',[0.67*L,0,0.33*L,0.45*H]);
% Lecture et affichage d'une image RVB :
I = imread('ishihara-0.png');
figure(1); % Premiere fenetre d'affichage
subplot(2,2,1); % La fenetre comporte 2 lignes et 2 colonnes
imagesc(I);
axis off;
axis equal;
title('Image RVB','FontSize',20);
% Decoupage de l'image en trois canaux et conversion en doubles :
R = double(I(:,:,1));
V = double(I(:,:,2));
B = double(I(:,:,3));
% Affichage du canal R :
colormap gray; % Pour afficher les images en niveaux de gris
subplot(2,2,2);
imagesc(R);
axis off;
axis equal;
title('Canal R','FontSize',20);
% Affichage du canal V :
subplot(2,2,3);
imagesc(V);
axis off;
axis equal;
title('Canal V','FontSize',20);
% Affichage du canal B :
subplot(2,2,4);
imagesc(B);
axis off;
axis equal;
title('Canal B','FontSize',20);
% Affichage du nuage de pixels dans le repere RVB :
figure(2); % Deuxieme fenetre d'affichage
plot3(R,V,B,'b.');
axis equal;
xlabel('R');
ylabel('V');
zlabel('B');
rotate3d;
close all;
% Matrice des donnees :
X = [R(:) V(:) B(:)]; % Les trois canaux sont vectorises et concatenes
% Matrice des données centrées :
X_c = X - mean(X);
% Matrice de variance/covariance :
Sigma = X_c.' * X_c / length(X_c);
% Coefficients de correlation lineaire :
coeffs = [ Sigma(2, 1)/Sigma(1, 1)/Sigma(2, 2), Sigma(3, 2)/Sigma(2, 2)/Sigma(3, 3), Sigma(3, 1)/Sigma(1, 1)/Sigma(3,3) ]
% Proportions de contraste :
contrasts = coeffs.^2/sum(coeffs.^2)

98
TP1/exercice_2.m Executable file
View file

@ -0,0 +1,98 @@
clear;
close all;
taille_ecran = get(0,'ScreenSize');
L = taille_ecran(3);
H = taille_ecran(4);
% figure('Name','Separation des canaux RVB','Position',[0,0,0.67*L,0.67*H]);
% figure('Name','Nuage de pixels dans le repere RVB','Position',[0.67*L,0,0.33*L,0.45*H]);
% Lecture et affichage d'une image RVB :
I = imread('Quizz_GroupeIJ/ishihara-20.png');
figure(1); % Premiere fenetre d'affichage
% subplot(2,2,1); % La fenetre comporte 2 lignes et 2 colonnes
% imagesc(I);
% axis off;
% axis equal;
% title('Image RVB','FontSize',20);
% Decoupage de l'image en trois canaux et conversion en doubles :
R = double(I(:,:,1));
V = double(I(:,:,2));
B = double(I(:,:,3));
% % Affichage du canal R :
% colormap gray; % Pour afficher les images en niveaux de gris
% subplot(2,2,2);
% imagesc(R);
% axis off;
% axis equal;
% title('Canal R','FontSize',20);
% % Affichage du canal V :
% subplot(2,2,3);
% imagesc(V);
% axis off;
% axis equal;
% title('Canal V','FontSize',20);
% % Affichage du canal B :
% subplot(2,2,4);
% imagesc(B);
% axis off;
% axis equal;
% title('Canal B','FontSize',20);
% % Affichage du nuage de pixels dans le repere RVB :
% figure(2); % Deuxieme fenetre d'affichage
% plot3(R,V,B,'b.');
% axis equal;
% xlabel('R');
% ylabel('V');
% zlabel('B');
% rotate3d;
% Matrice des donnees :
X = [R(:) V(:) B(:)]; % Les trois canaux sont vectorises et concatenes
% Matrice des données centrées :
X_c = X - mean(X);
% Matrice de variance/covariance :
Sigma = X_c.' * X_c / length(X_c);
% Calcul des couples propres :
[Vect_p, Diag_p] = eig(Sigma);
Val_p = diag(Diag_p);
% On trie les couples propres :
[Val_p, ind] = sort(Val_p, "descend");
Vect_p = Vect_p(ind, ind);
% On choisit la composante principale si besoin (changer l'entier de circshift) :
Val_p = circshift(Val_p, 1);
Vect_p = circshift(Vect_p, 1);
% On calcule C :
C = X_c * Vect_p;
% On reshape pour avoir une image :
Image = reshape(C, size(I));
% On affiche l'image :
colormap gray;
imagesc(Image);
axis off;
axis equal;
% Matrice des données centrées :
C_c = C - mean(C);
% Matrice de variance/covariance :
Sigma2 = C_c.' * C_c / length(C_c);
% Coefficients de correlation lineaire :
coeffs = [ Sigma2(2, 1)/Sigma2(1, 1)/Sigma2(2, 2), Sigma2(3, 2)/Sigma2(2, 2)/Sigma2(3, 3), Sigma2(3, 1)/Sigma2(1, 1)/Sigma2(3,3) ]
% Proportions de contraste :
contrasts = coeffs.^2/sum(coeffs.^2)

BIN
TP1/ishihara-0.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,003 KiB

BIN
TP1/memento_Matlab.pdf Executable file

Binary file not shown.

BIN
TP1/sujet_TP1_AD.pdf Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/ImSG1.mat Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/ImSG2.mat Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/ImSG3.mat Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/ImSG4.mat Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/ImSG5.mat Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/ImSG6.mat Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/ImSG7.mat Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/SG1.mat Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/SG2.mat Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/SG3.mat Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/SG4.mat Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/SG5.mat Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/SG6.mat Executable file

Binary file not shown.

BIN
TP2/Data_Exo_2/SG7.mat Executable file

Binary file not shown.

24
TP2/MV.m Executable file
View file

@ -0,0 +1,24 @@
function [F_1_chapeau,F_2_chapeau,a_chapeau] = MV(xy_donnees_bruitees,x_F_aleatoire,y_F_aleatoire,a_aleatoire)
n = size(xy_donnees_bruitees,2);
nb_tirages = length(a_aleatoire);
sommes_ecarts_carres = [];
for k = 1:nb_tirages
x_F_1_test = x_F_aleatoire(1,k);
y_F_1_test = y_F_aleatoire(1,k);
P_i_F_1_test = [x_F_1_test;y_F_1_test]*ones(1,n)-xy_donnees_bruitees;
distances_P_i_F_1_test = sqrt(sum(P_i_F_1_test.*P_i_F_1_test));
x_F_2_test = x_F_aleatoire(2,k);
y_F_2_test = y_F_aleatoire(2,k);
P_i_F_2_test = [x_F_2_test;y_F_2_test]*ones(1,n)-xy_donnees_bruitees;
distances_P_i_F_2_test = sqrt(sum(P_i_F_2_test.*P_i_F_2_test));
a_test = a_aleatoire(k);
ecarts_test = distances_P_i_F_1_test+distances_P_i_F_2_test-2*a_test;
sommes_ecarts_carres = [sommes_ecarts_carres sum(ecarts_test.*ecarts_test)];
end
[E_min,indice_min] = min(sommes_ecarts_carres);
F_1_chapeau = [x_F_aleatoire(1,indice_min) ; y_F_aleatoire(1,indice_min)];
F_2_chapeau = [x_F_aleatoire(2,indice_min) ; y_F_aleatoire(2,indice_min)];
a_chapeau = a_aleatoire(1,indice_min);

7
TP2/affichage_ellipse.m Executable file
View file

@ -0,0 +1,7 @@
function affichage_ellipse(C,theta_0,a,b,theta_points_ellipse,motif)
xy_points_ellipse = [a*cos(theta_points_ellipse) ; b*sin(theta_points_ellipse)];
R = [cos(theta_0) -sin(theta_0) ; sin(theta_0) cos(theta_0)];
xy_points_ellipse = R*xy_points_ellipse+C*ones(1,length(theta_points_ellipse));
plot([xy_points_ellipse(1,:) xy_points_ellipse(1,1)],[xy_points_ellipse(2,:) xy_points_ellipse(2,1)],motif,'LineWidth',2);

16
TP2/conversion.m Executable file
View file

@ -0,0 +1,16 @@
function [C,theta_0,a,b] = conversion(p)
C = -inv([2*p(1) p(2) ; p(2) 2*p(3)])*[p(4) ; p(5)];
g = p(6)+p(1)*C(1)*C(1)+p(2)*C(1)*C(2)+p(3)*C(2)*C(2)+p(4)*C(1)+p(5)*C(2);
theta_0 = 1/2*atan(p(2)/(p(1)-p(3)));
cos_theta_0 = cos(theta_0);
sin_theta_0 = sin(theta_0);
a = sqrt(abs(g/(p(1)*cos_theta_0*cos_theta_0+p(2)*sin_theta_0*cos_theta_0+p(3)*sin_theta_0*sin_theta_0)));
b = sqrt(abs(g/(p(1)*sin_theta_0*sin_theta_0-p(2)*sin_theta_0*cos_theta_0+p(3)*cos_theta_0*cos_theta_0)));
if b>a
theta_0 = theta_0+pi/2;
aux = a;
a = b;
b = aux;
end

50
TP2/donnees.m Executable file
View file

@ -0,0 +1,50 @@
clear;
close all;
taille_ecran = get(0,'ScreenSize');
L = taille_ecran(3);
H = taille_ecran(4);
figure('Name','Simulation des donnees','Position',[0.33*L,0,0.67*L,H]);
% Parametres de l'ellipse :
taille = 20;
c = 2*taille/5*(rand+0.25);
a = 2*taille/5*(rand+1);
if a<c
aux = a;
a = c;
c = aux;
end
b = sqrt(a^2-c^2);
C = (taille-a)*(2*rand(2,1)-1);
theta_0 = 2*pi*rand;
% Affichage de l'ellipse :
nb_points_ellipse = 100;
deux_pi = 2*pi;
theta_points_ellipse = deux_pi/nb_points_ellipse:deux_pi/nb_points_ellipse:deux_pi;
affichage_ellipse(C,theta_0,a,b,theta_points_ellipse,'g-');
hx = xlabel('$x$','FontSize',20);
set(hx,'Interpreter','Latex');
hy = ylabel('$y$','FontSize',20);
set(hy,'Interpreter','Latex');
axis equal;
hold on;
% Foyers :
R = [cos(theta_0) -sin(theta_0) ; sin(theta_0) cos(theta_0)];
F_1 = R*[c ; 0]+C;
F_2 = R*[-c ; 0]+C;
% Calcul et affichage des donnees bruitees :
n = 200;
theta_donnees_bruitees = 2*pi*rand(1,n)+2*pi*rand;
xy_donnees_bruitees = [a*cos(theta_donnees_bruitees) ; b*sin(theta_donnees_bruitees)];
xy_donnees_bruitees = R*xy_donnees_bruitees+C*ones(1,n);
sigma = 1;
xy_donnees_bruitees = xy_donnees_bruitees+sigma*randn(2,n);
plot(xy_donnees_bruitees(1,:),xy_donnees_bruitees(2,:),'k*');
echelle = [-taille taille -taille taille];
axis(echelle);
lg = legend('Ellipse','Donnees bruitees','Location','Best');
set(lg,'FontSize',15);

54
TP2/exercice_1.m Executable file
View file

@ -0,0 +1,54 @@
clear;
close all;
donnees;
pause
maximum_vraisemblance;
pause
% Estimation des parametres par les moindres carres ordinaires :
x = xy_donnees_bruitees(1, :)';
y = xy_donnees_bruitees(2, :)';
Beta_chapeau = MCO2(x, y);
[C_chapeau, theta_0_chapeau, a_chapeau, b_chapeau] = conversion(Beta_chapeau);
% Affichage de l'ellipse estimee par MCO :
affichage_ellipse(C_chapeau, theta_0_chapeau, a_chapeau, b_chapeau, theta_points_ellipse, 'r-');
lg = legend('Ellipse', 'Donnees bruitees', 'Estimation par MV', 'Estimation par MCO', 'Location', 'Best');
set(lg,'FontSize', 15);
% Calcul du score de l'ellipse estimee par MCO :
R_chapeau = [cos(theta_0_chapeau) -sin(theta_0_chapeau) ; sin(theta_0_chapeau) cos(theta_0_chapeau)];
c_chapeau = sqrt(a_chapeau * a_chapeau - b_chapeau * b_chapeau);
F_1_chapeau = R_chapeau * [c_chapeau ; 0] + C_chapeau;
F_2_chapeau = R_chapeau * [-c_chapeau ; 0] + C_chapeau;
fprintf('Score de l''estimation par MCO = %.3f\n', score(F_1, F_2, a, F_1_chapeau, F_2_chapeau, a_chapeau));
function Beta_chapeau = MCO(x, y)
B = zeros(length(x)+1,1);
B(length(B)) = 1;
on = ones(length(x), 1);
A = [ x.^2 x.*y y.^2 x y on ; 1 0 1 0 0 0 ];
Beta_chapeau = A \ B;
end
function Beta_chapeau = MCO2(x, y)
on = ones(length(x), 1);
B = -x.^2;
A = [ x.*y y.^2-x.^2 x y on ];
X_tild = A \ B;
Beta_chapeau = [ 1 - X_tild(2) ; X_tild ];
end

20
TP2/exercice_2.m Executable file
View file

@ -0,0 +1,20 @@
clear;
close all;
load Data_Exo_2/SG7.mat
B = log(DataMod(:));
A = [ -Data(:) ones(size(Data(:))) ];
param = A \ B;
load Data_Exo_2/ImSG7.mat
original = ( -log(ImMod) + param(2) ) / param(1);
imshow(I)
title("image de base")
figure
imshow(original)
title("image calculée")
RMSE = mean(mean(sqrt((original - I).^2)))

23
TP2/exercice_3.m Executable file
View file

@ -0,0 +1,23 @@
clear;
close all;
load Data_Exo_2/SG1.mat
B = log(DataMod(:));
A = [ -Data(:) ones(size(Data(:))) ];
C = [ A B ];
[U, S , V] = svd(C);
param = [ V(1,3) V(2,3) ] / -V(3,3);
load Data_Exo_2/ImSG1.mat
original = ( -log(ImMod) + param(2) ) / param(1);
imshow(I)
title("image de base")
figure
imshow(original)
title("image calculée")
RMSE = mean(mean(sqrt((original - I).^2)))

30
TP2/maximum_vraisemblance.m Executable file
View file

@ -0,0 +1,30 @@
% Definition des intervalles pour les tirages aleatoires :
x_min = min(xy_donnees_bruitees(1,:));
x_max = max(xy_donnees_bruitees(1,:));
delta_x = x_max-x_min;
y_min = min(xy_donnees_bruitees(2,:));
y_max = max(xy_donnees_bruitees(2,:));
delta_y = y_max-y_min;
a_max = sqrt(delta_x^2+delta_y^2)/2;
% Tirage de valeurs aleatoires pour les parametres :
nb_tirages = 10000;
x_F_aleatoire = x_min+(x_max-x_min)*rand(2,nb_tirages);
y_F_aleatoire = y_min+(y_max-y_min)*rand(2,nb_tirages);
a_aleatoire = a_max*rand(1,nb_tirages);
% Estimation des parametres par le maximum de vraisemblance :
[F_1_chapeau,F_2_chapeau,a_chapeau] = MV(xy_donnees_bruitees,x_F_aleatoire,y_F_aleatoire,a_aleatoire);
C_chapeau = (F_1_chapeau+F_2_chapeau)/2;
F_2_chapeau_F_1_chapeau = F_1_chapeau-F_2_chapeau;
theta_0_chapeau = atan(F_2_chapeau_F_1_chapeau(2)/F_2_chapeau_F_1_chapeau(1));
c_chapeau = sqrt(F_2_chapeau_F_1_chapeau(1)^2+F_2_chapeau_F_1_chapeau(2)^2)/2;
b_chapeau = sqrt(a_chapeau*a_chapeau-c_chapeau*c_chapeau);
% Affichage de l'ellipse estimee par MV :
affichage_ellipse(C_chapeau,theta_0_chapeau,a_chapeau,b_chapeau,theta_points_ellipse,'b-');
lg = legend('Ellipse','Donnees bruitees','Estimation par MV','Location','Best');
set(lg,'FontSize',15);
% Calcul du score de l'ellipse estimee par MV :
fprintf('Score de l''estimation par MV = %.3f\n',score(F_1,F_2,a,F_1_chapeau,F_2_chapeau,a_chapeau));

24
TP2/score.m Executable file
View file

@ -0,0 +1,24 @@
function resultat = score(F_1,F_2,a,F_1_estime,F_2_estime,a_estime)
a_max = max(a,a_estime);
x_min = min([F_1(1),F_2(1),F_1_estime(1),F_2_estime(1)])-a_max;
x_max = max([F_1(1),F_2(1),F_1_estime(1),F_2_estime(1)])+a_max;
y_min = min([F_1(2),F_2(2),F_1_estime(2),F_2_estime(2)])-a_max;
y_max = max([F_1(2),F_2(2),F_1_estime(2),F_2_estime(2)])+a_max;
pas_echantillonnage = 0.25;
[X,Y] = meshgrid(x_min:pas_echantillonnage:x_max,y_min:pas_echantillonnage:y_max);
distance_P_F_1 = sqrt((X-F_1(1)).*(X-F_1(1))+(Y-F_1(2)).*(Y-F_1(2)));
distance_P_F_2 = sqrt((X-F_2(1)).*(X-F_2(1))+(Y-F_2(2)).*(Y-F_2(2)));
distance_P_F_1_estime = sqrt((X-F_1_estime(1)).*(X-F_1_estime(1))+(Y-F_1_estime(2)).*(Y-F_1_estime(2)));
distance_P_F_2_estime = sqrt((X-F_2_estime(1)).*(X-F_2_estime(1))+(Y-F_2_estime(2)).*(Y-F_2_estime(2)));
indices_union = find(distance_P_F_1+distance_P_F_2<2*a | distance_P_F_1_estime+distance_P_F_2_estime<2*a_estime);
indices_intersection = find(distance_P_F_1+distance_P_F_2<2*a & distance_P_F_1_estime+distance_P_F_2_estime<2*a_estime);
union = length(indices_union(:));
intersection = length(indices_intersection(:));
resultat = intersection/union;

BIN
TP2/sujet_TP2_AD_etu.pdf Executable file

Binary file not shown.

BIN
TP3/donnees.mat Executable file

Binary file not shown.

12
TP3/estimation_mu_Sigma.m Executable file
View file

@ -0,0 +1,12 @@
function [mu, sigma] = estimation_mu_Sigma(X)
mu = mean(X);
X_c = X - mu;
sigma = X_c.' * X_c / length(X);
mu = mu.';
end

2
TP3/estimation_mu_Sigma.m~ Executable file
View file

@ -0,0 +1,2 @@
function [mu, sigma] = estimation_mu_Sigma(X)

67
TP3/exercice_1.m Executable file
View file

@ -0,0 +1,67 @@
%--------------------------------------------------------------------------
% ENSEEIHT - 1SN - Analyse de données
% TP3 - Classification bayésienne
% exercice_1.m
%--------------------------------------------------------------------------
clear
close all
clc
% Chargement des données
load donnees
%% Calcul des vecteurs de moyenne des images de fleurs
% Couleur moyenne de chaque image de pensée (fonction moyenne à coder)
X_pensees = single(zeros(nb_images_pensees,2));
for i = 1:nb_images_pensees
im = eval(['pe' num2str(i)]);
X_pensees(i,:) = moyenne(im);
end
% Couleur moyenne de chaque image d'oeillet (fonction moyenne à coder)
X_oeillets = single(zeros(nb_images_oeillets,2));
for i = 1:nb_images_oeillets
im = eval(['oe' num2str(i)]);
X_oeillets(i,:) = moyenne(im);
end
% Couleur moyenne de chaque image de chrysanthème (fonction moyenne à coder)
X_chrysanthemes = single(zeros(nb_images_chrysanthemes,2));
for i = 1:nb_images_chrysanthemes
im = eval(['ch' num2str(i)]);
X_chrysanthemes(i,:) = moyenne(im);
end
%% Affichage des couleurs moyennes des images de fleurs
% Vecteur r et v pour les axes
pas = 0.0025;
r = 0.35:pas:0.60;
v = 0.2:pas:0.45;
nb_r = length(r);
nb_v = length(v);
figure('Name','Couleurs moyennes des images',...
'Position',[0.1*L,0.1*H,0.5*L,0.8*H])
hold on
plot(X_pensees(:,1),X_pensees(:,2),'r*','MarkerSize',10,'LineWidth',2)
plot(X_oeillets(:,1),X_oeillets(:,2),'go','MarkerSize',10,'LineWidth',2)
plot(X_chrysanthemes(:,1),X_chrysanthemes(:,2),'b+','MarkerSize',10,'LineWidth',2)
grid on
axis equal ij
axis([r(1) r(end) v(1) v(end)])
hx = xlabel('$\bar{r}$','FontSize',20);
set(hx,'Interpreter','Latex')
hy = ylabel('$\bar{v}$','FontSize',20);
set(hy,'Interpreter','Latex')
legend('Pensées','Oeillets','Chrysanthèmes','Location','Best')
view(-90,90)
title('Couleurs moyennes des images','FontSize',20)
clear ch* hx hy i* oe* pas pe*
save resultats_ex1

99
TP3/exercice_2.m Executable file
View file

@ -0,0 +1,99 @@
%--------------------------------------------------------------------------
% ENSEEIHT - 1SN - Analyse de données
% TP3 - Classification bayésienne
% exercice_2.m
%--------------------------------------------------------------------------
clear
close all
clc
% Chargement des données de l'exercice 1
load resultats_ex1
azimuth = -72;
elevation = 42;
%% Estimation pour les pensées
% Estimation des paramètres de la loi normale (fonction estimation_mu_Sigma à coder)
[mu_pensees, Sigma_pensees] = estimation_mu_Sigma(X_pensees);
% Valeurs de la loi normale sur la grille
[V_pensees, denominateur_classe_pensees] = vraisemblance(r, v, mu_pensees, Sigma_pensees, -1);
% Représentation 3D de la loi normale
figure('Name','Vraisemblance de la classe "pensées"',...
'Position',[0.05*L,0.1*H,0.3*L,0.6*H])
hold on
surface(r,v,V_pensees,'EdgeColor',[.85 .65 .65],'FaceColor','none')
axis([r(1) r(end) v(1) v(end)])
view(azimuth,elevation)
rotate3d on
% Superposition des données d'apprentissage de la classe "pensées"
plot(X_pensees(:,1),X_pensees(:,2),'r*','MarkerSize',10,'LineWidth',2)
grid on
hx = xlabel('$\bar{r}$','FontSize',20);
set(hx,'Interpreter','Latex')
hy = ylabel('$\bar{v}$','FontSize',20);
set(hy,'Interpreter','Latex')
title('Estimation pour les pensees','FontSize',20)
legend('Vraisemblance empirique','Donnees d''apprentissage','Location','Best')
%% Estimation pour les oeillets
% Estimation des paramètres de la loi normale (fonction estimation_mu_Sigma à coder)
[mu_oeillets, Sigma_oeillets] = estimation_mu_Sigma(X_oeillets);
% Valeurs de la loi normale sur la grille
[V_oeillets, denominateur_classe_oeillets] = vraisemblance(r, v, mu_oeillets, Sigma_oeillets, -1);
% Représentation 3D de la loi normale
figure('Name','Vraisemblance de la classe "oeillets"',...
'Position',[0.35*L,0.1*H,0.3*L,0.6*H])
hold on
surface(r,v,V_oeillets,'EdgeColor',[.65 .85 .65],'FaceColor','none')
axis([r(1) r(end) v(1) v(end)])
view(azimuth,elevation)
rotate3d on
% Trace des données d'apprentissage de la classe "oeillets"
plot(X_oeillets(:,1),X_oeillets(:,2),'go','MarkerSize',10,'LineWidth',2)
grid on
hx = xlabel('$\bar{r}$','FontSize',20);
set(hx,'Interpreter','Latex')
hy = ylabel('$\bar{v}$','FontSize',20);
set(hy,'Interpreter','Latex')
title('Estimation pour les oeillets','FontSize',20)
legend('Vraisemblance empirique','Données d''apprentissage','Location','Best')
%% Estimation pour les chrysanthèmes
% Estimation des paramètres de la loi normale (fonction estimation_mu_Sigma à coder)
[mu_chrysanthemes, Sigma_chrysanthemes] = estimation_mu_Sigma(X_chrysanthemes);
% Valeurs de la loi normale sur la grille
[V_chrysanthemes, denominateur_classe_chrysanthemes] = vraisemblance(r, v, mu_chrysanthemes, Sigma_chrysanthemes, -1);
% Représentation 3D de la loi normale
figure('Name','Vraisemblance de la classe "chrysanthèmes"',...
'Position',[0.65*L,0.1*H,0.3*L,0.6*H])
hold on
surface(r,v,V_chrysanthemes,'EdgeColor',[.65 .65 .85],'FaceColor','none')
axis([r(1) r(end) v(1) v(end)])
view(azimuth,elevation)
rotate3d on
% Trace des données d'apprentissage de la classe "chrysanthèmes"
plot(X_chrysanthemes(:,1),X_chrysanthemes(:,2),'b+','MarkerSize',10,'LineWidth',2)
grid on
hx = xlabel('$\bar{r}$','FontSize',20);
set(hx,'Interpreter','Latex')
hy = ylabel('$\bar{v}$','FontSize',20);
set(hy,'Interpreter','Latex')
title('Estimation pour les chrysanthèmes','FontSize',20)
legend('Vraisemblance empirique','Données d''apprentissage','Location','Best')
clear azimuth elevation hx hy i j r_i x_centre
save resultats_ex2

65
TP3/exercice_3.m Executable file
View file

@ -0,0 +1,65 @@
%--------------------------------------------------------------------------
% ENSEEIHT - 1SN - Analyse de données
% TP3 - Classification bayésienne
% exercice_3.m
%--------------------------------------------------------------------------
clear
close all
clc
% Chargement des données de l'exercice 2
load resultats_ex2
%% Classifieur par maximum de vraisemblance
% code_classe est la matrice contenant des 1 pour les chrysanthemes
% 2 pour les oeillets
% 3 pour les pensees
% l'attribution de 1,2 ou 3 correspond au maximum des trois vraisemblances
V_full = cat(3, V_chrysanthemes, V_oeillets, V_pensees);
[~, code_classe] = max(V_full, [], 3);
%% Affichage des classes
figure('Name','Classification par maximum de vraisemblance',...
'Position',[0.25*L,0.1*H,0.5*L,0.8*H])
axis equal ij
axis([r(1) r(end) v(1) v(end)]);
hold on
imagesc(r,v,code_classe)
carte_couleurs = [.45 .45 .65 ; .45 .65 .45 ; .65 .45 .45];
colormap(carte_couleurs)
hx = xlabel('$\overline{r}$','FontSize',20);
set(hx,'Interpreter','Latex')
hy = ylabel('$\bar{v}$','FontSize',20);
set(hy,'Interpreter','Latex')
view(-90,90)
plot(X_oeillets(:,1),X_oeillets(:,2),'go','MarkerSize',10,'LineWidth',2);
plot(X_chrysanthemes(:,1),X_chrysanthemes(:,2),'b+','MarkerSize',10,'LineWidth',2);
plot(X_pensees(:,1),X_pensees(:,2),'r*','MarkerSize',10,'LineWidth',2);
%% Comptage des images correctement classées
p_c = 0.2;
p_o = 0.7;
p_p = 0.1;
V_c_c = p_c * vraisemblance(X_chrysanthemes(:,1), X_chrysanthemes(:,2), mu_chrysanthemes, Sigma_chrysanthemes, denominateur_classe_chrysanthemes);
V_c_o = p_o * vraisemblance(X_chrysanthemes(:,1), X_chrysanthemes(:,2), mu_oeillets, Sigma_oeillets, denominateur_classe_chrysanthemes);
V_c_p = p_p * vraisemblance(X_chrysanthemes(:,1), X_chrysanthemes(:,2), mu_pensees, Sigma_pensees, denominateur_classe_chrysanthemes);
V_o_c = p_c * vraisemblance(X_oeillets(:,1), X_oeillets(:,2), mu_chrysanthemes, Sigma_chrysanthemes, denominateur_classe_oeillets);
V_o_o = p_o * vraisemblance(X_oeillets(:,1), X_oeillets(:,2), mu_oeillets, Sigma_oeillets, denominateur_classe_oeillets);
V_o_p = p_p * vraisemblance(X_oeillets(:,1), X_oeillets(:,2), mu_pensees, Sigma_pensees, denominateur_classe_oeillets);
V_p_c = p_c * vraisemblance(X_pensees(:,1), X_pensees(:,2), mu_chrysanthemes, Sigma_chrysanthemes, denominateur_classe_pensees);
V_p_o = p_o * vraisemblance(X_pensees(:,1), X_pensees(:,2), mu_oeillets, Sigma_oeillets, denominateur_classe_pensees);
V_p_p = p_p * vraisemblance(X_pensees(:,1), X_pensees(:,2), mu_pensees, Sigma_pensees, denominateur_classe_pensees);
nb_c = (V_c_c > V_c_o) & (V_c_c > V_c_p);
nb_o = (V_o_o > V_o_c) & (V_o_o > V_o_p);
nb_p = (V_p_p > V_p_c) & (V_p_p > V_p_o);
pourcentage = sum(nb_c + nb_o + nb_p) / 30 * 100

65
TP3/exercice_3.m~ Executable file
View file

@ -0,0 +1,65 @@
%--------------------------------------------------------------------------
% ENSEEIHT - 1SN - Analyse de données
% TP3 - Classification bayésienne
% exercice_3.m
%--------------------------------------------------------------------------
clear
close all
clc
% Chargement des données de l'exercice 2
load resultats_ex2
%% Classifieur par maximum de vraisemblance
% code_classe est la matrice contenant des 1 pour les chrysanthemes
% 2 pour les oeillets
% 3 pour les pensees
% l'attribution de 1,2 ou 3 correspond au maximum des trois vraisemblances
V_full = cat(3, V_chrysanthemes, V_oeillets, V_pensees);
[~, code_classe] = max(V_full, [], 3);
%% Affichage des classes
figure('Name','Classification par maximum de vraisemblance',...
'Position',[0.25*L,0.1*H,0.5*L,0.8*H])
axis equal ij
axis([r(1) r(end) v(1) v(end)]);
hold on
imagesc(r,v,code_classe)
carte_couleurs = [.45 .45 .65 ; .45 .65 .45 ; .65 .45 .45];
colormap(carte_couleurs)
hx = xlabel('$\overline{r}$','FontSize',20);
set(hx,'Interpreter','Latex')
hy = ylabel('$\bar{v}$','FontSize',20);
set(hy,'Interpreter','Latex')
view(-90,90)
plot(X_oeillets(:,1),X_oeillets(:,2),'go','MarkerSize',10,'LineWidth',2);
plot(X_chrysanthemes(:,1),X_chrysanthemes(:,2),'b+','MarkerSize',10,'LineWidth',2);
plot(X_pensees(:,1),X_pensees(:,2),'r*','MarkerSize',10,'LineWidth',2);
%% Comptage des images correctement classées
p_c = 0.0;
p_o = &;
p_p = 0.0;
V_c_c = p_c * vraisemblance(X_chrysanthemes(:,1), X_chrysanthemes(:,2), mu_chrysanthemes, Sigma_chrysanthemes, denominateur_classe_chrysanthemes);
V_c_o = p_o * vraisemblance(X_chrysanthemes(:,1), X_chrysanthemes(:,2), mu_oeillets, Sigma_oeillets, denominateur_classe_chrysanthemes);
V_c_p = p_p * vraisemblance(X_chrysanthemes(:,1), X_chrysanthemes(:,2), mu_pensees, Sigma_pensees, denominateur_classe_chrysanthemes);
V_o_c = p_c * vraisemblance(X_oeillets(:,1), X_oeillets(:,2), mu_chrysanthemes, Sigma_chrysanthemes, denominateur_classe_oeillets);
V_o_o = p_o * vraisemblance(X_oeillets(:,1), X_oeillets(:,2), mu_oeillets, Sigma_oeillets, denominateur_classe_oeillets);
V_o_p = p_p * vraisemblance(X_oeillets(:,1), X_oeillets(:,2), mu_pensees, Sigma_pensees, denominateur_classe_oeillets);
V_p_c = p_c * vraisemblance(X_pensees(:,1), X_pensees(:,2), mu_chrysanthemes, Sigma_chrysanthemes, denominateur_classe_pensees);
V_p_o = p_o * vraisemblance(X_pensees(:,1), X_pensees(:,2), mu_oeillets, Sigma_oeillets, denominateur_classe_pensees);
V_p_p = p_p * vraisemblance(X_pensees(:,1), X_pensees(:,2), mu_pensees, Sigma_pensees, denominateur_classe_pensees);
nb_c = (V_c_c > V_c_o) & (V_c_c > V_c_p);
nb_o = (V_o_o > V_o_c) & (V_o_o > V_o_p);
nb_p = (V_p_p > V_p_c) & (V_p_p > V_p_o);
pourcentage = sum(nb_c + nb_o + nb_p) / 30 * 100

61
TP3/exercice_3_bis.m Executable file
View file

@ -0,0 +1,61 @@
%--------------------------------------------------------------------------
% ENSEEIHT - 1SN - Analyse de données
% TP3 - Classification bayésienne
% exercice_3.m
%--------------------------------------------------------------------------
clear
close all
clc
% Chargement des données de l'exercice 2
load resultats_ex2
%% Classifieur par maximum de vraisemblance
% code_classe est la matrice contenant des 1 pour les chrysanthemes
% 2 pour les oeillets
% 3 pour les pensees
% l'attribution de 1,2 ou 3 correspond au maximum des trois vraisemblances
V_full = cat(3, V_chrysanthemes, V_oeillets, V_pensees);
[~, code_classe] = max(V_full, [], 3);
%% Affichage des classes
figure('Name','Classification par maximum de vraisemblance',...
'Position',[0.25*L,0.1*H,0.5*L,0.8*H])
axis equal ij
axis([r(1) r(end) v(1) v(end)]);
hold on
imagesc(r,v,code_classe)
carte_couleurs = [.45 .45 .65 ; .45 .65 .45 ; .65 .45 .45];
colormap(carte_couleurs)
hx = xlabel('$\overline{r}$','FontSize',20);
set(hx,'Interpreter','Latex')
hy = ylabel('$\bar{v}$','FontSize',20);
set(hy,'Interpreter','Latex')
view(-90,90)
plot(X_oeillets(:,1),X_oeillets(:,2),'go','MarkerSize',10,'LineWidth',2);
plot(X_chrysanthemes(:,1),X_chrysanthemes(:,2),'b+','MarkerSize',10,'LineWidth',2);
plot(X_pensees(:,1),X_pensees(:,2),'r*','MarkerSize',10,'LineWidth',2);
%% Comptage des images correctement classées
[V_c_c, ~] = vraisemblance(X_chrysanthemes(:,1), X_chrysanthemes(:,2), mu_chrysanthemes, Sigma_chrysanthemes, denominateur_classe_chrysanthemes);
[V_c_o, ~] = vraisemblance(X_chrysanthemes(:,1), X_chrysanthemes(:,2), mu_oeillets, Sigma_oeillets, denominateur_classe_chrysanthemes);
[V_c_p, ~] = vraisemblance(X_chrysanthemes(:,1), X_chrysanthemes(:,2), mu_pensees, Sigma_pensees, denominateur_classe_chrysanthemes);
[V_o_c, ~] = vraisemblance(X_oeillets(:,1), X_oeillets(:,2), mu_chrysanthemes, Sigma_chrysanthemes, denominateur_classe_oeillets);
[V_o_o, ~] = vraisemblance(X_oeillets(:,1), X_oeillets(:,2), mu_oeillets, Sigma_oeillets, denominateur_classe_oeillets);
[V_o_p, ~] = vraisemblance(X_oeillets(:,1), X_oeillets(:,2), mu_pensees, Sigma_pensees, denominateur_classe_oeillets);
[V_p_c, ~] = vraisemblance(X_pensees(:,1), X_pensees(:,2), mu_chrysanthemes, Sigma_chrysanthemes, denominateur_classe_pensees);
[V_p_o, ~] = vraisemblance(X_pensees(:,1), X_pensees(:,2), mu_oeillets, Sigma_oeillets, denominateur_classe_pensees);
[V_p_p, ~] = vraisemblance(X_pensees(:,1), X_pensees(:,2), mu_pensees, Sigma_pensees, denominateur_classe_pensees);
nb_c = (V_c_c > V_c_o) & (V_c_c > V_c_p);
nb_o = (V_o_o > V_o_c) & (V_o_o > V_o_p);
nb_p = (V_p_p > V_p_c) & (V_p_p > V_p_o);
nb = sum(nb_c + nb_o + nb_p) / 30 * 100;

17
TP3/moyenne.m Executable file
View file

@ -0,0 +1,17 @@
function X = moyenne(im)
I = single(im);
R = I(:,:,1);
V = I(:,:,2);
B = I(:,:,3);
M = max(1, R + V + B);
r = R ./ M;
v = V ./ M;
X = [ mean(r(:)) mean(v(:)) ];
end

90
TP3/recup_donnees.m Executable file
View file

@ -0,0 +1,90 @@
%--------------------------------------------------------------------------
% ENSEEIHT - 1SN - Analyse de données
% TP3 - Classification bayésienne
% donnees.m
%--------------------------------------------------------------------------
clear
close all
clc
taille_ecran = get(0,'ScreenSize');
L = taille_ecran(3);
H = taille_ecran(4);
% Chemin d'accès aux images
chemin = '/mnt/n7fs/ens/tp_guivarch/AD/images/';
%% Images de pensées
% Chargement des images
fichier = [chemin 'pensees'];
s = whos('-file',fichier);
nb_images_pensees = length(s);
load(fichier);
% Affichage des images
fact = factor(nb_images_pensees);
nb_lignes_affichage = fact(2);
nb_colonnes_affichage = fact(1);
figure('Name','Images de pensées',...
'Position',[0.1*L,0.1*H,0.25*L,0.75*H]);
for i = 1:nb_images_pensees
subplot(nb_lignes_affichage,nb_colonnes_affichage,i)
imagesc(eval(['pe' num2str(i)]))
title(['Pensée n°' num2str(i)])
axis off image
end
%% Images d'oeillets
% Chargement des images
fichier = [chemin 'oeillets'];
s = whos('-file',fichier);
nb_images_oeillets = length(s);
load(fichier);
% Affichage des images
fact = factor(nb_images_oeillets);
nb_lignes_affichage = fact(2);
nb_colonnes_affichage = fact(1);
figure('Name','Images d''oeillets',...
'Position',[0.4*L,0.1*H,0.25*L,0.75*H]);
for i = 1:nb_images_oeillets
subplot(nb_lignes_affichage,nb_colonnes_affichage,i)
imagesc(eval(['oe' num2str(i)]))
title(['Oeillet n°' num2str(i)])
axis off image
end
%% Images de chrysanthèmes
% Chargement des images
fichier = [chemin 'chrysanthemes'];
s = whos('-file',fichier);
nb_images_chrysanthemes = length(s);
load(fichier);
% Affichage des images
fact = factor(nb_images_chrysanthemes);
nb_lignes_affichage = fact(2);
nb_colonnes_affichage = fact(1);
figure('Name','Images de chrysanthèmes',...
'Position',[0.7*L,0.1*H,0.25*L,0.75*H]);
for i = 1:nb_images_chrysanthemes
subplot(nb_lignes_affichage,nb_colonnes_affichage,i);
imagesc(eval(['ch' num2str(i)]));
title(['Chrysanthème n°' num2str(i)]);
axis off image
end
drawnow;
clear chemin fact fichier i nb_lignes_affichage nb_colonnes_affichage s taille_ecran
save donnees

BIN
TP3/resultats_ex1.mat Executable file

Binary file not shown.

BIN
TP3/resultats_ex2.mat Executable file

Binary file not shown.

BIN
TP3/sujet_TP3_AD.pdf Executable file

Binary file not shown.

53
TP3/vraisemblance.m Executable file
View file

@ -0,0 +1,53 @@
%--------------------------------------------------------------------------
% ENSEEIHT - 1SN - Analyse de données
% TP3 - Classification bayésienne
% vraisemblance.m
%--------------------------------------------------------------------------
% calcule la vraisemblance p(x, w_i) et le dénominateur de classe
% x est donné par ses coordonnées sur la grille(r,v)
% w_i est caractérisée par mu_i et Sigma_i
% le dénominateur de classe peut être
% - calculé (et retourné comme résultat) si denominateur_classe_i = -1
% - ou fourni
function [P, denominateur] = vraisemblance(r, v, mu_i, Sigma_i, denominateur_classe_i)
if (denominateur_classe_i == -1)
% génération des cartes de vraisemblances :
% nb_r indépendant de nb_v (tailles de grilles)
nb_r = length(r);
nb_v = length(v);
P = zeros(nb_r,nb_v);
for i = 1:nb_r
for j = 1:nb_v
x_centre = [r(i);v(j)] - mu_i;
P(j,i) = exp(-(x_centre.')*(Sigma_i \ x_centre)/2);
end
end
denominateur = 2*pi*sqrt(det(Sigma_i));
else
% calcul de vraisemblances pour des vecteurs r et v associés aux données
% avec dénominateur déjà connu : nb_r = nb_v = nombre de données
nb_r = length(r);
P = zeros(nb_r,1);
for i = 1:nb_r
x_centre = [r(i);v(i)] - mu_i;
P(i) = exp(-(x_centre.')*(Sigma_i \ x_centre)/2);
end
denominateur = denominateur_classe_i;
end
P = P / denominateur;
end

BIN
TP4/MNIST.mat Executable file

Binary file not shown.

51
TP4/TP4AD.m Executable file
View file

@ -0,0 +1,51 @@
%--------------------------------------------------------------------------
% ENSEEIHT - 1SN - Analyse de donnees
% TP4 - Reconnaissance de chiffres manuscrits par k plus proches voisins
% TP4AD.m
%--------------------------------------------------------------------------
clear
close all
clc
% Chargement des images d'apprentissage et de test
load MNIST
% database_test_images 10000x784
% database_test_labels 10000x1
% database_train_images 60000x784
% database_train_labels 60000x1
DataA = database_train_images;
clear database_train_images
DataT = database_test_images;
clear database_test_images
labelA = database_train_labels;
clear database_train_labels
labelT = database_test_labels;
clear database_test_labels
% Choix du nombre de voisins
K = 2;
% Initialisation du vecteur des classes
ListeClass = 0:9;
% Nombre d'images test
[Nt,~] = size(DataT);
Nt_test = Nt/1000; % A changer, pouvant aller de 1 jusqu'à Nt
% Classement par l'algorithme des k-ppv
[Partition] = kppv(DataA, labelA, DataT, Nt_test, K, ListeClass);
% affichage des images avec leur label calculé
for i=1:6
subplot(2, 3, i);
img = reshape(DataT(i,:), 28, 28);
imagesc(img);
colormap gray;
axis image off;
title(num2str(Partition(i)));
end

59
TP4/kppv.m Executable file
View file

@ -0,0 +1,59 @@
%--------------------------------------------------------------------------
% ENSEEIHT - 1SN - Analyse de donnees
% TP4 - Reconnaissance de chiffres manuscrits par k plus proches voisins
% fonction kppv.m
%
% Données :
% DataA : les données d'apprentissage (connues)
% LabelA : les labels des données d'apprentissage
%
% DataT : les données de test (on veut trouver leur label)
% Nt_test : nombre de données tests qu'on veut labelliser
%
% K : le K de l'algorithme des k-plus-proches-voisins
% ListeClass : les classes possibles (== les labels possibles)
%
% Résultat :
% Partition : pour les Nt_test données de test, le label calculé
%
%--------------------------------------------------------------------------
function [Partition] = kppv(DataA, labelA, DataT, Nt_test, K, ListeClass)
[Na,~] = size(DataA);
% Initialisation du vecteur d'étiquetage des images tests
Partition = zeros(Nt_test,1);
disp(['Classification des images test dans ' num2str(length(ListeClass)) ' classes'])
disp(['par la methode des ' num2str(K) ' plus proches voisins:'])
% Boucle sur les vecteurs test de l'ensemble de l'évaluation
for i = 1:Nt_test
disp(['image test n°' num2str(i)])
% Calcul des distances entre les vecteurs de test
% et les vecteurs d'apprentissage (voisins)
distance = vecnorm(DataA - DataT(i,:));
% On ne garde que les indices des K + proches voisins
[D, I] = sort(distance);
kvoisins = I(1:K);
% Comptage du nombre de voisins appartenant à chaque classe
classe = labelA(kvoisins);
% Recherche de la classe contenant le maximum de voisins
[M, F, C] = mode(classe);
% Si l'image test a le plus grand nombre de voisins dans plusieurs
% classes différentes, alors on lui assigne celle du voisin le + proche,
% sinon on lui assigne l'unique classe contenant le plus de voisins
% Assignation de l'étiquette correspondant à la classe trouvée au point
% correspondant à la i-ème image test dans le vecteur "Partition"
Partition(i) = M;
end

BIN
TP4/sujet_TP4_AD.pdf Executable file

Binary file not shown.