init: import TPs
BIN
TP1/Quizz_GroupeIJ/ishihara-10.png
Executable file
After Width: | Height: | Size: 987 KiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-11.png
Executable file
After Width: | Height: | Size: 977 KiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-12.png
Executable file
After Width: | Height: | Size: 1 MiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-13.png
Executable file
After Width: | Height: | Size: 993 KiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-14.png
Executable file
After Width: | Height: | Size: 1,002 KiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-15.png
Executable file
After Width: | Height: | Size: 982 KiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-16.png
Executable file
After Width: | Height: | Size: 991 KiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-17.png
Executable file
After Width: | Height: | Size: 1,011 KiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-18.png
Executable file
After Width: | Height: | Size: 966 KiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-19.png
Executable file
After Width: | Height: | Size: 989 KiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-20.png
Executable file
After Width: | Height: | Size: 1,013 KiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-6.png
Executable file
After Width: | Height: | Size: 1,013 KiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-7.png
Executable file
After Width: | Height: | Size: 1,000 KiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-8.png
Executable file
After Width: | Height: | Size: 1,013 KiB |
BIN
TP1/Quizz_GroupeIJ/ishihara-9.png
Executable file
After Width: | Height: | Size: 1,006 KiB |
69
TP1/exercice_1.m
Executable 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
|
@ -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
After Width: | Height: | Size: 1,003 KiB |
BIN
TP1/memento_Matlab.pdf
Executable file
BIN
TP1/sujet_TP1_AD.pdf
Executable file
BIN
TP2/Data_Exo_2/ImSG1.mat
Executable file
BIN
TP2/Data_Exo_2/ImSG2.mat
Executable file
BIN
TP2/Data_Exo_2/ImSG3.mat
Executable file
BIN
TP2/Data_Exo_2/ImSG4.mat
Executable file
BIN
TP2/Data_Exo_2/ImSG5.mat
Executable file
BIN
TP2/Data_Exo_2/ImSG6.mat
Executable file
BIN
TP2/Data_Exo_2/ImSG7.mat
Executable file
BIN
TP2/Data_Exo_2/SG1.mat
Executable file
BIN
TP2/Data_Exo_2/SG2.mat
Executable file
BIN
TP2/Data_Exo_2/SG3.mat
Executable file
BIN
TP2/Data_Exo_2/SG4.mat
Executable file
BIN
TP2/Data_Exo_2/SG5.mat
Executable file
BIN
TP2/Data_Exo_2/SG6.mat
Executable file
BIN
TP2/Data_Exo_2/SG7.mat
Executable file
24
TP2/MV.m
Executable 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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
BIN
TP3/donnees.mat
Executable file
12
TP3/estimation_mu_Sigma.m
Executable 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
|
@ -0,0 +1,2 @@
|
||||||
|
|
||||||
|
function [mu, sigma] = estimation_mu_Sigma(X)
|
67
TP3/exercice_1.m
Executable 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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
BIN
TP3/resultats_ex2.mat
Executable file
BIN
TP3/sujet_TP3_AD.pdf
Executable file
53
TP3/vraisemblance.m
Executable 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
51
TP4/TP4AD.m
Executable 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
|
@ -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
|
||||||
|
|