commit eac4c5b650924bbaf38f3b76320804be3a664b02 Author: Laureηt Date: Mon May 29 16:43:44 2023 +0200 init: import TPs diff --git a/TP1/Quizz_GroupeIJ/ishihara-10.png b/TP1/Quizz_GroupeIJ/ishihara-10.png new file mode 100755 index 0000000..407f5ac Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-10.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-11.png b/TP1/Quizz_GroupeIJ/ishihara-11.png new file mode 100755 index 0000000..62842f5 Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-11.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-12.png b/TP1/Quizz_GroupeIJ/ishihara-12.png new file mode 100755 index 0000000..711b8fe Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-12.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-13.png b/TP1/Quizz_GroupeIJ/ishihara-13.png new file mode 100755 index 0000000..0a18011 Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-13.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-14.png b/TP1/Quizz_GroupeIJ/ishihara-14.png new file mode 100755 index 0000000..0351be8 Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-14.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-15.png b/TP1/Quizz_GroupeIJ/ishihara-15.png new file mode 100755 index 0000000..1138e2a Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-15.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-16.png b/TP1/Quizz_GroupeIJ/ishihara-16.png new file mode 100755 index 0000000..8b4d640 Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-16.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-17.png b/TP1/Quizz_GroupeIJ/ishihara-17.png new file mode 100755 index 0000000..8badf21 Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-17.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-18.png b/TP1/Quizz_GroupeIJ/ishihara-18.png new file mode 100755 index 0000000..716cef9 Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-18.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-19.png b/TP1/Quizz_GroupeIJ/ishihara-19.png new file mode 100755 index 0000000..cba4e21 Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-19.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-20.png b/TP1/Quizz_GroupeIJ/ishihara-20.png new file mode 100755 index 0000000..6e412dd Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-20.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-6.png b/TP1/Quizz_GroupeIJ/ishihara-6.png new file mode 100755 index 0000000..a473c5f Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-6.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-7.png b/TP1/Quizz_GroupeIJ/ishihara-7.png new file mode 100755 index 0000000..86586e2 Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-7.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-8.png b/TP1/Quizz_GroupeIJ/ishihara-8.png new file mode 100755 index 0000000..b72ee6a Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-8.png differ diff --git a/TP1/Quizz_GroupeIJ/ishihara-9.png b/TP1/Quizz_GroupeIJ/ishihara-9.png new file mode 100755 index 0000000..415430b Binary files /dev/null and b/TP1/Quizz_GroupeIJ/ishihara-9.png differ diff --git a/TP1/exercice_1.m b/TP1/exercice_1.m new file mode 100755 index 0000000..5d96fe4 --- /dev/null +++ b/TP1/exercice_1.m @@ -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) diff --git a/TP1/exercice_2.m b/TP1/exercice_2.m new file mode 100755 index 0000000..d32280f --- /dev/null +++ b/TP1/exercice_2.m @@ -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) \ No newline at end of file diff --git a/TP1/ishihara-0.png b/TP1/ishihara-0.png new file mode 100755 index 0000000..d640fa2 Binary files /dev/null and b/TP1/ishihara-0.png differ diff --git a/TP1/memento_Matlab.pdf b/TP1/memento_Matlab.pdf new file mode 100755 index 0000000..a380d2a Binary files /dev/null and b/TP1/memento_Matlab.pdf differ diff --git a/TP1/sujet_TP1_AD.pdf b/TP1/sujet_TP1_AD.pdf new file mode 100755 index 0000000..cc6c1f7 Binary files /dev/null and b/TP1/sujet_TP1_AD.pdf differ diff --git a/TP2/Data_Exo_2/ImSG1.mat b/TP2/Data_Exo_2/ImSG1.mat new file mode 100755 index 0000000..6e0acbf Binary files /dev/null and b/TP2/Data_Exo_2/ImSG1.mat differ diff --git a/TP2/Data_Exo_2/ImSG2.mat b/TP2/Data_Exo_2/ImSG2.mat new file mode 100755 index 0000000..13f3883 Binary files /dev/null and b/TP2/Data_Exo_2/ImSG2.mat differ diff --git a/TP2/Data_Exo_2/ImSG3.mat b/TP2/Data_Exo_2/ImSG3.mat new file mode 100755 index 0000000..5bb9a24 Binary files /dev/null and b/TP2/Data_Exo_2/ImSG3.mat differ diff --git a/TP2/Data_Exo_2/ImSG4.mat b/TP2/Data_Exo_2/ImSG4.mat new file mode 100755 index 0000000..8bee5a0 Binary files /dev/null and b/TP2/Data_Exo_2/ImSG4.mat differ diff --git a/TP2/Data_Exo_2/ImSG5.mat b/TP2/Data_Exo_2/ImSG5.mat new file mode 100755 index 0000000..859317d Binary files /dev/null and b/TP2/Data_Exo_2/ImSG5.mat differ diff --git a/TP2/Data_Exo_2/ImSG6.mat b/TP2/Data_Exo_2/ImSG6.mat new file mode 100755 index 0000000..582acce Binary files /dev/null and b/TP2/Data_Exo_2/ImSG6.mat differ diff --git a/TP2/Data_Exo_2/ImSG7.mat b/TP2/Data_Exo_2/ImSG7.mat new file mode 100755 index 0000000..e90cd16 Binary files /dev/null and b/TP2/Data_Exo_2/ImSG7.mat differ diff --git a/TP2/Data_Exo_2/SG1.mat b/TP2/Data_Exo_2/SG1.mat new file mode 100755 index 0000000..3bc1628 Binary files /dev/null and b/TP2/Data_Exo_2/SG1.mat differ diff --git a/TP2/Data_Exo_2/SG2.mat b/TP2/Data_Exo_2/SG2.mat new file mode 100755 index 0000000..0bda30b Binary files /dev/null and b/TP2/Data_Exo_2/SG2.mat differ diff --git a/TP2/Data_Exo_2/SG3.mat b/TP2/Data_Exo_2/SG3.mat new file mode 100755 index 0000000..4e1e434 Binary files /dev/null and b/TP2/Data_Exo_2/SG3.mat differ diff --git a/TP2/Data_Exo_2/SG4.mat b/TP2/Data_Exo_2/SG4.mat new file mode 100755 index 0000000..fd539e2 Binary files /dev/null and b/TP2/Data_Exo_2/SG4.mat differ diff --git a/TP2/Data_Exo_2/SG5.mat b/TP2/Data_Exo_2/SG5.mat new file mode 100755 index 0000000..e003f5f Binary files /dev/null and b/TP2/Data_Exo_2/SG5.mat differ diff --git a/TP2/Data_Exo_2/SG6.mat b/TP2/Data_Exo_2/SG6.mat new file mode 100755 index 0000000..8bec9e7 Binary files /dev/null and b/TP2/Data_Exo_2/SG6.mat differ diff --git a/TP2/Data_Exo_2/SG7.mat b/TP2/Data_Exo_2/SG7.mat new file mode 100755 index 0000000..90c1306 Binary files /dev/null and b/TP2/Data_Exo_2/SG7.mat differ diff --git a/TP2/MV.m b/TP2/MV.m new file mode 100755 index 0000000..9590b37 --- /dev/null +++ b/TP2/MV.m @@ -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); diff --git a/TP2/affichage_ellipse.m b/TP2/affichage_ellipse.m new file mode 100755 index 0000000..ee7f7ce --- /dev/null +++ b/TP2/affichage_ellipse.m @@ -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); \ No newline at end of file diff --git a/TP2/conversion.m b/TP2/conversion.m new file mode 100755 index 0000000..3d2f3a9 --- /dev/null +++ b/TP2/conversion.m @@ -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 \ No newline at end of file diff --git a/TP2/donnees.m b/TP2/donnees.m new file mode 100755 index 0000000..df8fab2 --- /dev/null +++ b/TP2/donnees.m @@ -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 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 \ No newline at end of file diff --git a/TP3/exercice_3.m~ b/TP3/exercice_3.m~ new file mode 100755 index 0000000..af58311 --- /dev/null +++ b/TP3/exercice_3.m~ @@ -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 \ No newline at end of file diff --git a/TP3/exercice_3_bis.m b/TP3/exercice_3_bis.m new file mode 100755 index 0000000..549b467 --- /dev/null +++ b/TP3/exercice_3_bis.m @@ -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; \ No newline at end of file diff --git a/TP3/moyenne.m b/TP3/moyenne.m new file mode 100755 index 0000000..3cd2995 --- /dev/null +++ b/TP3/moyenne.m @@ -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 \ No newline at end of file diff --git a/TP3/recup_donnees.m b/TP3/recup_donnees.m new file mode 100755 index 0000000..c165d66 --- /dev/null +++ b/TP3/recup_donnees.m @@ -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 diff --git a/TP3/resultats_ex1.mat b/TP3/resultats_ex1.mat new file mode 100755 index 0000000..be0577d Binary files /dev/null and b/TP3/resultats_ex1.mat differ diff --git a/TP3/resultats_ex2.mat b/TP3/resultats_ex2.mat new file mode 100755 index 0000000..4ea88d9 Binary files /dev/null and b/TP3/resultats_ex2.mat differ diff --git a/TP3/sujet_TP3_AD.pdf b/TP3/sujet_TP3_AD.pdf new file mode 100755 index 0000000..f8c3558 Binary files /dev/null and b/TP3/sujet_TP3_AD.pdf differ diff --git a/TP3/vraisemblance.m b/TP3/vraisemblance.m new file mode 100755 index 0000000..86c498b --- /dev/null +++ b/TP3/vraisemblance.m @@ -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 + diff --git a/TP4/MNIST.mat b/TP4/MNIST.mat new file mode 100755 index 0000000..ad7f21e Binary files /dev/null and b/TP4/MNIST.mat differ diff --git a/TP4/TP4AD.m b/TP4/TP4AD.m new file mode 100755 index 0000000..565bfc2 --- /dev/null +++ b/TP4/TP4AD.m @@ -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 diff --git a/TP4/kppv.m b/TP4/kppv.m new file mode 100755 index 0000000..6db9d32 --- /dev/null +++ b/TP4/kppv.m @@ -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 + diff --git a/TP4/sujet_TP4_AD.pdf b/TP4/sujet_TP4_AD.pdf new file mode 100755 index 0000000..4167624 Binary files /dev/null and b/TP4/sujet_TP4_AD.pdf differ