Commit 3fa881d0 authored by Ulmer Louis's avatar Ulmer Louis
Browse files

projet final

parent 9b9ca03d
No preview for this file type
File added
function [] = correlatiomatrix(X)
function [] = correlation_matrix(X)
%ind=find(ismember(CrimeSolved,'No'));
%X(ind,:)=[];
[n,p]=size(X);
Xn=(X-ones(n,1)*mean(X))./(ones(n,1)*std(X,1));
Mn=Xn'*Xn/n
Mn=Xn'*Xn/n;
figure(1)
clf
imagesc(Mn);
......@@ -11,8 +11,8 @@ colorbar;
colormap(jet)
set(gca,'XTick',1:p)
set(gca,'YTick',1:p)
set(gca,'xticklabel',{'age', 'campaign', 'consconfidx', 'conspriceidx', 'contact', 'day of week', 'default', 'duration', 'empvarrate', 'euribor3m','housing' 'job', 'loan', 'marital', 'month', 'nremployed', 'pdays' ,'previous' ,'Y'})
set(gca,'yticklabel',{'age', 'campaign', 'consconfidx', 'conspriceidx', 'contact', 'day of week', 'default', 'duration', 'empvarrate', 'euribor3m','housing' 'job', 'loan', 'marital', 'month', 'nremployed', 'pdays' ,'previous' ,'Y'})
set(gca,'xticklabel',{'age', 'campaign', 'consconfidx', 'conspriceidx', 'default_1', 'default_2', 'default_3', 'education_1', 'education_2', 'education_3', 'education_4', 'education_5', 'education_6', 'education_7' ,'empvarrate', 'euribor3m','housing_1','housing_2','job_1','job_2','job_3','job_4','job_5','job_6','job_7','job_8','job_9','job_10','job_11', 'loan_1','loan_2', 'marital_1', 'marital_2', 'marital_3', 'nremployed', 'pdays','poutcome_1','poutcome_2','poutcome_3','Y'})
set(gca,'yticklabel',{'age', 'campaign', 'consconfidx', 'conspriceidx', 'default_1', 'default_2', 'default_3', 'education_1', 'education_2', 'education_3', 'education_4', 'education_5', 'education_6', 'education_7' ,'empvarrate', 'euribor3m','housing_1','housing_2','job_1','job_2','job_3','job_4','job_5','job_6','job_7','job_8','job_9','job_10','job_11', 'loan_1','loan_2', 'marital_1', 'marital_2', 'marital_3', 'nremployed', 'pdays','poutcome_1','poutcome_2','poutcome_3','Y'})
set(gca,'XTickLabelRotation',90)
title('Matrice des correlations')
end
......
This diff is collapsed.
function monroc(fx, labels)
% fx : vecteur de taille Ncontenant les predictions fournies par le SVM
% sur N points xi. fx(i) = w'*xi + b avec w et b parametres du SVM.
% NB : fx = X*w + b si vous calculez la prediction SVM pour N points dans
% la matrice X
%
% labels : vecteur de taille N contenant les vrais labels associes aux points xi
seuils = [min(fx):0.01:max(fx)+0.01];
TPR = [];
FPR = [];
for i = 1:length(seuils)
b_pred = fx>=seuils(i);
TP = sum(b_pred==1 & labels == 1);
FP = sum(b_pred==1 & labels == -1);
TN = sum(b_pred==0 & labels == -1);
FN = sum(b_pred==0 & labels == 1);
TPR(i) = TP/(TP+FN);
FPR(i) = FP/(TN+FP);
end
figure(1);hold off
plot(FPR(end:-1:1), TPR(end:-1:1),'b-', 'linewidth', 2)
set(gca, 'fontsize', 16)
xlabel('Taux de faux positifs FPR', 'fontsize', 18)
ylabel('Taux de vrais positifs FPR', 'fontsize', 18)
disp(FPR)
end
\ No newline at end of file
function [X,Y] =preparation_donnees()
%% Import data from text file.
% Auto-generated by MATLAB on 2019/01/07 14:29:01
% Initialize variables.
filename = 'bank-additional-full.csv';
startRow = 2;
delimiter=';';
% Format for each line of text:
% column1: double (%f)
% column2: categorical (%C)
% column3: categorical (%C)
% column4: categorical (%C)
% column5: categorical (%C)
% column6: categorical (%C)
% column7: categorical (%C)
% column8: categorical (%C)
% column9: categorical (%C)
% column10: categorical (%C)
% column11: double (%f)
% column12: double (%f)
% column13: double (%f)
% column14: double (%f)
% column15: categorical (%C)
% column16: double (%f)
% column17: double (%f)
% column18: double (%f)
% column19: double (%f)
% column20: double (%f)
% column21: categorical (%C)
% For more information, see the TEXTSCAN documentation.
formatSpec = '%f%C%C%C%C%C%C%C%C%C%f%f%f%f%C%f%f%f%f%f%C%[^\n\r]';
% Open the text file.
fileID = fopen(filename,'r');
% Read columns of data according to the format.
% This call is based on the structure of the file used to generate this
% code. If an error occurs for a different file, try regenerating the code
% from the Import Tool.
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'TextType', 'string', 'EmptyValue', NaN, 'HeaderLines' ,startRow-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
% Close the text file.
fclose(fileID);
% Post processing for unimportable data.
% No unimportable data rules were applied during the import, so no post
% processing code is included. To generate code which works for
% unimportable data, select unimportable cells in a file and regenerate the
% script.
% Allocate imported array to column variable names
age = dataArray{:, 1};
job = dataArray{:, 2};
marital = dataArray{:, 3};
education = dataArray{:, 4};
default = dataArray{:, 5};
housing = dataArray{:, 6};
loan = dataArray{:, 7};
contact = dataArray{:, 8};
month1 = dataArray{:, 9};
day_of_week = dataArray{:, 10};
duration = dataArray{:, 11};
campaign = dataArray{:, 12};
pdays = dataArray{:, 13};
previous = dataArray{:, 14};
poutcome = dataArray{:, 15};
empvarrate = dataArray{:, 16};
conspriceidx = dataArray{:, 17};
consconfidx = dataArray{:, 18};
euribor3m = dataArray{:, 19};
nremployed = dataArray{:, 20};
y = dataArray{:, 21};
% Clear temporary variables
clearvars filename delimiter startRow formatSpec fileID dataArray ans;
%% Codage Disjonctif y
ind_yes = find(y=='yes');
Y = zeros(length(y),1);
Y(ind_yes)=1;
%% Procedure suppression NAN value
X=table(age,campaign,consconfidx,conspriceidx,default,duration,education,empvarrate,euribor3m,housing,job,loan,marital,nremployed,pdays,poutcome,previous,Y);
%% Suppression des "unknown" de job et education
idx=any(strcmp(cellstr([job, education, housing, loan, marital]),'unknown'),2);
X(idx,:) = [];
Y(idx) = [];
%% Codage Disjonctif des autres variables
age=X.age;
campaign=X.campaign;
consconfidx=X.consconfidx;
conspriceidx=X.conspriceidx;
duration=X.duration;
empvarrate=X.empvarrate;
euribor3m=X.euribor3m;
nremployed=X.nremployed;
previous=X.previous;
pdays=X.pdays;
housing=disjonctif2(X.housing);
poutcome=disjonctif2(X.poutcome);
job=disjonctif2(X.job);
loan=disjonctif2(X.loan);
marital=disjonctif2(X.marital);
education=disjonctif2(X.education);
default=disjonctif2(X.default);
%%
% On passe en matriciel
X=[age campaign consconfidx conspriceidx default education empvarrate euribor3m housing job loan marital nremployed pdays poutcome];
end
\ No newline at end of file
%% Import data from text file.
% Script for importing data from the following text file:
%
% /Users/louis/Documents/INSA/ASI4_LouisULMER/IML/projet_IML/bank-additional-full.csv
%
% To extend the code to different selected data or a different text file,
% generate a function instead of a script.
% Auto-generated by MATLAB on 2019/01/07 14:29:01
% Initialize variables.
filename = 'bank-additional-full.csv';
startRow = 2;
delimiter=';';
% Format for each line of text:
% column1: double (%f)
% column2: categorical (%C)
% column3: categorical (%C)
% column4: categorical (%C)
% column5: categorical (%C)
% column6: categorical (%C)
% column7: categorical (%C)
% column8: categorical (%C)
% column9: categorical (%C)
% column10: categorical (%C)
% column11: double (%f)
% column12: double (%f)
% column13: double (%f)
% column14: double (%f)
% column15: categorical (%C)
% column16: double (%f)
% column17: double (%f)
% column18: double (%f)
% column19: double (%f)
% column20: double (%f)
% column21: categorical (%C)
% For more information, see the TEXTSCAN documentation.
formatSpec = '%f%C%C%C%C%C%C%C%C%C%f%f%f%f%C%f%f%f%f%f%C%[^\n\r]';
% Open the text file.
fileID = fopen(filename,'r');
% Read columns of data according to the format.
% This call is based on the structure of the file used to generate this
% code. If an error occurs for a different file, try regenerating the code
% from the Import Tool.
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'TextType', 'string', 'EmptyValue', NaN, 'HeaderLines' ,startRow-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
% Close the text file.
fclose(fileID);
% Post processing for unimportable data.
% No unimportable data rules were applied during the import, so no post
% processing code is included. To generate code which works for
% unimportable data, select unimportable cells in a file and regenerate the
% script.
% Allocate imported array to column variable names
age = dataArray{:, 1};
job = dataArray{:, 2};
marital = dataArray{:, 3};
education = dataArray{:, 4};
default = dataArray{:, 5};
housing = dataArray{:, 6};
loan = dataArray{:, 7};
contact = dataArray{:, 8};
month1 = dataArray{:, 9};
day_of_week = dataArray{:, 10};
duration = dataArray{:, 11};
campaign = dataArray{:, 12};
pdays = dataArray{:, 13};
previous = dataArray{:, 14};
poutcome = dataArray{:, 15};
empvarrate = dataArray{:, 16};
conspriceidx = dataArray{:, 17};
consconfidx = dataArray{:, 18};
euribor3m = dataArray{:, 19};
nremployed = dataArray{:, 20};
y = dataArray{:, 21};
% Clear temporary variables
clearvars filename delimiter startRow formatSpec fileID dataArray ans;
%% Codage Disjonctif y
ind_yes = find(y=='yes');
Y = zeros(length(y),1);
Y(ind_yes)=1;
%% Procedure suppression NAN value
X=table(age,campaign,consconfidx,conspriceidx,default,duration,education,empvarrate,euribor3m,housing,job,loan,marital,nremployed,pdays,poutcome,previous,Y);
%% Suppression des "unknown" de job et education
idx=any(strcmp(cellstr([job, education, housing, loan, marital]),'unknown'),2);
X(idx,:) = [];
Y(idx) = [];
%% Codage Disjonctif des autres variables
age=X.age;
campaign=X.campaign;
consconfidx=X.consconfidx;
conspriceidx=X.conspriceidx;
duration=X.duration;
empvarrate=X.empvarrate;
euribor3m=X.euribor3m;
nremployed=X.nremployed;
previous=X.previous;
pdays=X.pdays;
housing=disjonctif2(X.housing);
poutcome=disjonctif2(X.poutcome);
job=disjonctif2(X.job);
loan=disjonctif2(X.loan);
marital=disjonctif2(X.marital);
education=disjonctif2(X.education);
default=disjonctif2(X.default);
%%
% On passe en matriciel
X=[age consconfidx conspriceidx default duration education empvarrate euribor3m housing job loan marital nremployed poutcome];
%% Matrice de correlation
correlation_matrix(X);
% on observe des correlations entre
% cons.price.idx || contact
% A VOIR DIMENSSION CHAQUE LABEL
%% PCA
%% PROJET IML
% Nous avons decide d'utiliser pour notre projet les donnees issues du domaine bancaire pour appliquer plusieurs types d'algorithmes de classification binaire vus en cours.
%% 1. Preparation des donnees
%% 1.2 Suppression des NAN et One-Hot Encoding
%Pour la premiere partie du projet nous nous sommes concentres sur l'encodage sous forme de variables 0-1 car la plupart des variables du dataset ne le sont pas sous ce format.
% Nous avons aussi traite le probleme des variables contenant le champ :
% 'Unknown' et NAN que nous avons supprime.
% Pour les variables contenant plus d'une valeur (ex : Day <=> 7 jours )
% nous avons cree un vecteur pour chaque valeur avec des booleans : 1 si x_i correspond a cette valeur, 0 sinon.
% Nous allons recuperer alors une matrice X contenant tous les variables discretisees.
[X,Y] = preparation_donnees();
%% 2. Apercu des donnees
%Avant de nous lancer dans la classification des données, nous avons essayé de voir s'il existe des relations entre nos variables. Pour cela nous avons realié la matrice de corrélation et l'ACP.
%% 2.1 Matrice de correlation
correlation_matrix([X Y]);
% On observe des correlations suivantes:
% entre Y et (empvarrate, euribor3m, pdays, poutcome2, poutcome3, nremployed)
% sans surprise la probabilte de contracter un depot a long terme est
% fortement influencee par le nombre de jours passes apres que le client aie
% ete contacte.
%influence par le taux d'emploi
%influence par l'euribor
%influence par le nombre de commerciaux a la propection
%% 2.2 ACP : essayons de reduire la dimension pour mieux visualiser notre probleme
[valpropres, U, moy]=mypca(X);
bar(valpropres/sum(valpropres));
title('Valeurs propres')
......@@ -132,74 +40,106 @@ figure
plot(C(Y==1,1),C(Y==1,2),'ro')
hold on
plot(C(Y==0,1),C(Y==0,2),'bo')
% L'acp ne nous aide pas
%% Modalits de chaque classe
% Compter les occurences
title('affichage sur les deux plus grands axes de l acp')
% On remarque que l'acp ne nous aide pas car la reduction en 2 dimmensions
% n'est pas representative pour les donnees de notre genre.
%% 2.3 Nombre d'occurence des Y
% On va compter les occurences de chaque classe pour pouvoir determiner par
% la suite les algorithmes que nous allons choisir pour classifier nos donnees. une SVM avec penalisation différente en fonction des points.
label0=sum(Y==0)
label1=sum(Y==1)
% On constate un desechilibre entre les deux classes, il faudait penser a
% faire une SVM avec penalisation differente en fonction des points
%% Downsampling
rapport=label1/(label0+label1)*100
% On constate un desequilibre d'ordre 10 entre les deux classes, il faudrait
% penser e  faire une SVM avec penalisation differente en fonction des points.
%% 3. Classification
%% 3.1 Downsampling
% Nous avons beaucoup de donnees et nos machines personnelles risquent de
% ne pas supporter autant alors nous alons utiliser la fonction
% downsampling pour reduire le nombre de donnees.
Z = [X Y];
[n p]=size(X);
Z = mydownsampling(Z,8);
X_small=Z(:,1:end-1);
Y_small=Z(:,end);
%% Depouage des donnees
%% 3.2 Preparation des donnees pour la classification
% On va decouper nos donnees en 3 :
% donnees d'apprentissage : 1/6
% donnees de validation : 1/6
% donnees de test : 1/3
ratio =2/3;
[xapp, yapp, xtest, ytest] = splitdata(X_small, Y_small, ratio);
ratio = 1/2;
[xapp, yapp, xval, yval] = splitdata(xapp, yapp, ratio);
%% Centrer reduire
% On va ensuite centrer et reduire nos donnees
meanx = mean(xapp);
stdx=std(xapp);
[xapp,xval,~,~] = normalizemeanstd(xapp,xval,meanx,stdx);
[~,xtest,~,~] = normalizemeanstd(xapp,xtest,meanx,stdx);
%% 2.2 Methode des K-ppV
%% 3.3 Methode des K-ppV
% La premiere methode de classification que nous avons traite est le K plus
% proche voisins.
% On a decide de prendre dans un premier temps un k au hasard et en suite
% de chercher le k le plus adapte a nos données.
k=3;
[ypred,MatDist]=kppv(xval, xapp, yapp, k, []);
err = mean(yval~=ypred)
% Erreur obtenue avec k=3 : 10.07%
%% choix d'une valeur de k
err_k_hasard = mean(yval~=ypred);
% Recherche du meilleur k :
vectK=floor(linspace(1,20,10)); %echelle lineaire des valeurs de k possibles
% evaluation d'un modele
err=zeros(length(vectK),1); %prealocation du vecteur pour gagner en performance
err_k_meilleur=zeros(length(vectK),1); %prealocation du vecteur pour gagner en performance
for i=1:1:length(vectK)
[ypred,MatDist]=kppv(xval, xapp, yapp, vectK(i), []);
err(i) = mean(yval~=ypred); %calcul de l'erreur de validation
err_k_meilleur(i) = mean(yval~=ypred); %calcul de l'erreur de validation
end
[val,pos] = min(err); %On trouve l'indice du vecteur pour lequel l'erreur et minimale
meilleur_K=(vectK(pos)) % On selectione le meilleur k possible grace a l'indice
%% essai de cette valeur sur les donnes de test
[val,pos] = min(err_k_meilleur); %On trouve l'indice du vecteur pour lequel l'erreur et minimale
meilleur_K=(vectK(pos)); % On selectione le meilleur k possible grace a l'indice
% Apres avoir trouve le meilleur K sur nos donnees de validation nous
% allons maintenant calculer la valeur de l'erreur sur le jeu de test avec
% le k choisi.
k=meilleur_K;
[ypred,MatDist]=kppv(xtest, xapp, yapp, k, []);
err = mean(ytest~=ypred)
% On trouve une erreur de 9.55% avec le meilleur k (13) qui est une bonne
% performance dans la realite.
%% SVM Normal
err_test = mean(ytest~=ypred);
disp('Meilleur K Erreur validation Erreur test')
disp([k val err_test])
% On remarque alors une erreur de test assez petite.
%% 3.4 SVM
%% 3.4.1 Normal
% Malgre la difference d'effectif des deux classes nous avons voulu quand meme
% illustrer le resultat d'un SVM Normal appliqué a nos données.
yapp(yapp==0)=-1;
ytest(ytest==0)=-1;
yval(yval==0)=-1;
%
% evaluation d'un modele
% Evaluation d'un modele
vectC=logspace(-2,2,9) %echelle logarithmique
precision=zeros(length(vectC),1);
for i=1:1:length(vectC)
[wapp,b]=monsvmclass(xapp,yapp,vectC(i));
ypred=monsvmval(xval,wapp,b);
%f(x) et y on le meme signe ?
ind_bon=find(ypred.*yval>0);
n_bon=length(ind_bon); %nombre de valeurs bien classifies
precision(i)=n_bon/length(yval)
precision(i)=n_bon/length(yval);
end
[val,pos] = max(precision)
meilleur_C=(vectC(pos))
%% SVM PENALISE
% On remarque que notre SVM a une precision de ~90% ce qui nous fait pense a
% notre ordre de grande de presque 10 entre les effectifs.
%On va ainsi essayer d'appliquer un SVM Penalise.
%% 3.4.2 Avec penalisation
vectC=logspace(-1,3,9) %echelle logarithmique
vectCC=ones(size(yapp));
precision=zeros(length(vectC));
......@@ -215,27 +155,18 @@ for i=1:1:length(vectC)
precision(i,j)=n_bon/length(yval)
end
end
precision
[val,pos_i] = max(max(precision'));
[val,pos_j] = max(max(precision));
meilleur_CC=[vectC(pos_i) ; vectC(pos_j)]
%%
C=zeros(length(yapp),1);
C(yapp==1)= meilleur_C(1);
C(yapp==-1)= meilleur_C(2);
[wapp,b]=monsvmclass(xapp,yapp,meilleur_C);
ypred=monsvmval(xtest,wapp,b);
%f(x) et y on le meme signe ?
ind_bon=find(ypred.*ytest>0);
n_bon=length(ind_bon);
accuracy=n_bon/length(ytest)
error=1-accuracy
% On trouve une erreur de 9.60% avec le meilleur C (0.0316) qui est une bonne
% performance dans la realite.
%% QDA (parce qu'on est pas des pds)
%% Implementation de LDA
% On trouve toujours une erreur proche de 10 avec le meilleur C (0.0316) qui meme si dans la vrai vie est une bonne
% performance, sur nos donnees n'est pas representatif.
%% 3.5 Implementation de LDA
% On va essayer maintenant de regarder le comportament d'une LDA sur notre
% jeu de donnees.
yapp(yapp==-1)=0;
ytest(ytest==-1)=0;
yval(yval==-1)=0;
......@@ -258,7 +189,8 @@ C2_hat=(xapp(ind2,:)-ones(n2,1)*mu2_hat')'*(xapp(ind2,:)-ones(n2,1)*mu2_hat')./n
%C2=cov(X(ind2,:))
C=(n1*C1_hat+n2*C2_hat)./n;
lamda=0.001;
C=C+lamda*eye(38,38);
C=C+lamda*eye(size(C));
% Calcul des paramtres de la fonction de dcision f
w=C\(mu1_hat-mu2_hat);
w0=log(pi1_hat/pi2_hat)-w'*(mu1_hat+mu2_hat)/2;
......@@ -282,5 +214,19 @@ Y_chap(f<=0)=0;
% Calcul de l'erreur
errtest = mean(Y_chap' ~= ytest)
% On a trouve un erreur d'apprentissage de 7.86 % et un erreur de test de
% 8.89%
% On a trouve alors encore une erreur en test proche de 10 ce qui est
% normal car LDA est aussi un algorithme de classification des modeles
% lineaires.
%% 4. Conclusion
%Nous avons obtenus des resultats concluants a l'aide de methodes non
%lineaires de type KppV cependant comme nos classes sont tres desequilibre
%nous avons constate un manque d'efficacite des modeles lineaires (qui
%mettent tout dans un meme cluster) il serait a l'avenir interressant
%d'augmenter le nombre de donnees ou bien essayer des techniques de SVM non
%lineaires.
%% PROJET IML
% Nous avons decide d'utiliser pour notre projet les donnees issues du domaine bancaire pour appliquer plusieurs types d'algorithmes de classification binaire vus en cours.
%% 1. Preparation des donnees
%% 1.2 Suppression des NAN et One-Hot Encoding
%Pour la premiere partie du projet nous nous sommes concentres sur l'encodage sous forme de variables 0-1 car la plupart des variables du dataset ne le sont pas sous ce format.
% Nous avons aussi traite le probleme des variables contenant le champ :
% 'Unknown' et NAN que nous avons supprime.
% Pour les variables contenant plus d'une valeur (ex : Day <=> 7 jours )
% nous avons cree un vecteur pour chaque valeur avec des booleans : 1 si x_i correspond a cette valeur, 0 sinon.
% Nous allons recuperer alors une matrice X contenant tous les variables discretisees.
[X,Y] = preparation_donnees();
%% 2. Apercu des donnees
%Avant de nous lancer dans la classification des données, nous avons essayé de voir s'il existe des relations entre nos variables. Pour cela nous avons realié la matrice de corrélation et l'ACP.
%% 2.1 Matrice de correlation
correlation_matrix([X Y]);
% On observe des correlations suivantes:
% entre Y et (empvarrate, euribor3m, pdays, poutcome2, poutcome3, nremployed)
% sans surprise la probabilte de contracter un depot a long terme est
% fortement influencee par le nombre de jours passes apres que le client aie
% ete contacte.
%influence par le taux d'emploi
%influence par l'euribor
%influence par le nombre de commerciaux a la propection
%% 2.2 ACP : essayons de reduire la dimension pour mieux visualiser notre probleme
[valpropres, U, moy]=mypca(X);
bar(valpropres/sum(valpropres));
title('Valeurs propres')
% Dimension des datas projetees
d=2;
P=U(:,1:d);
C=projpca(X,moy,P);
figure
plot(C(Y==1,1),C(Y==1,2),'ro')
hold on
plot(C(Y==0,1),C(Y==0,2),'bo')
title('affichage sur les deux plus grands axes de l acp')
% On remarque que l'acp ne nous aide pas car la reduction en 2 dimmensions
% n'est pas representative pour les donnees de notre genre.
%% 2.3 Nombre d'occurence des Y
% On va compter les occurences de chaque classe pour pouvoir determiner par
% la suite les algorithmes que nous allons choisir pour classifier nos donnees. une SVM avec penalisation différente en fonction des points.
label0=sum(Y==0)
label1=sum(Y==1)
rapport=label1/(label0+label1)*100
% On constate un desequilibre d'ordre 10 entre les deux classes, il faudrait
% penser e  faire une SVM avec penalisation differente en fonction des points.
%% 3. Classification
%% 3.1 Downsampling
% Nous avons beaucoup de donnees et nos machines personnelles risquent de
% ne pas supporter autant alors nous alons utiliser la fonction
% downsampling pour reduire le nombre de donnees.
Z = [X Y];
[n p]=size(X);
Z = mydownsampling(Z,8);
X_small=Z(:,1:end-1);
Y_small=Z(:,end);
%% 3.2 Preparation des donnees pour la classification
% On va decouper nos donnees en 3 :
% donnees d'apprentissage : 1/6
% donnees de validation : 1/6
% donnees de test : 1/3
ratio =2/3;