Commit 0882d90b authored by Lacoin Achille's avatar Lacoin Achille
Browse files

ajout du TP1 d'IML

parents
clear
clc
load('WhiteW.mat');
% 1// Prise en main des données
% Moyennes
moyX = mean(X);
% Variances
varX = var(X);
% Pour savoir les différentes catégories : unique(Y)
% Pour compter le nombre de 0 dans Y : sum(Y==0)
% On peut aussi utiliser hist(var)
hist(Y)
% On obtient 1640 '0' et 3258 '1'
boxplot(X) % moyenne, mediane, varicance ==> Stat univariée
imagesc(corrcoef(X)), colorbar, set(gca, 'fontsize', 20) %==> Stat bivariée
%% 2// Mise en place de la classification des données
% 2.1// Découpage des données
% Trois groupes : Apprentissage, Test et Validation
[xapp, yapp, xtest, ytest] = splitdata(X, Y, 1/3);
figure(1)
hist(yapp)
[xapp, yapp, xVal, yVal] = splitdata(xapp, yapp, 1/2);
figure(2)
hist(yVal)
% On obtient les mêmes proportions que dans l'échantillon de base
% 2.2// Méthode des k plus proches voisins
% IMPERATIF :: Choisir le K sur la validation jamais sur l'apprentissage
errVal = erreursPrediction(xapp,yapp,xVal,50,yVal)
figure(2)
plot(errVal)
% Dessine le coefficient de prédiction avéré en fonction du choix de k
[min,k] = min(errVal)
% On trouve l'erreur la plus basse avec K = 8
% On teste cette valeur de k sur l'ensemble de test
yValPred = kppv(xtest,xapp,yapp,k,[])
errValFin= mean(ytest ~= yValPred)
% On choisit k = 7, l'erreur est égale à 0.34
% 2.3// Influence de la normalisation des données
%
mapp = mean(xapp);
stdapp = std(xapp);
% On centre et on réduit les 3 groupes
[xappcr,xtestcr] = normalizemeanstd(xapp,xtest,mapp,stdapp);
[~,xvalcr] = normalizemeanstd(xapp,xVal,mapp,stdapp);
[~,kcr] = min(erreursPrediction(xappcr,yapp,xvalcr,50,yVal));
yValPredcr = kppv(xtestcr,xappcr,yapp,kcr,[]);
errValFincr= mean(ytest ~= yValPredcr);
function [errVal] = erreursPrediction(xapp,yapp,x,n,y)
MatDist=[];
errVal=1:1:n;
for k=1:n
[yValPred,MatDist] = kppv(x,xapp,yapp,k,MatDist);
errVal(k)= mean(y ~= yValPred);
end
end
\ No newline at end of file
function [YPeval, MatDist]=kppv(Xeval, Xapp, Yapp, k, MatDist)
% USAGE
% [YPeval,MatDist]=knn(Xeval, Xapp, Yapp, k, MatDist)
% Xeval : les donn�es dont on veut predire la classe. Xeval est une matrice
% de dimensions Ne x d (d: nombre de variables)
% Xapp : donn�es d'apprentissage (donn�es de r�f�rence), matrice Na x d
% Yapp : vect de taille Na contenant les labels des points dans Xapp
% MatDist : matrice de distance entre les points dans Xeval et ceux de
% Xapp. Matrice de dimensions Ne x Na. Si cette matrice n'existe pas il
% faut faire l'appel comme [YPeval,MatDist]=kppv(Xeval, Xapp, Yapp, k, [])
% YPeval : vecteur (taille Ne) des labels pr�dits pour les points de Xeval
% on d�termine combien de classes on a dans les donn�es
classcode=(unique(Yapp))';
nbclasse=length(classcode);
Ne=size(Xeval,1);
Na=size(Xapp,1);
YPeval=zeros(Ne,1);
% on calcule la matrice des distances entre les points Xeval et Xapp si
% l'appel a �t� fait avec MatDist = [] (matrice vide) sinon on ne fait rien
if nargin < 5 || isempty(MatDist) % on a deja calcule la matrice de distance
MatDist = zeros(Ne, Na);
for i=1:Ne;
for j=1:Na;
MatDist(i,j)=(Xeval(i,:)- Xapp(j,:))*(Xeval(i,:)- Xapp(j,:))';
end;
end;
end;
% Calcul de la pr�diction des labels des Ne points de Xeval par kppv
for i=1:Ne
[~,I]=sort(MatDist(i,:));
C=Yapp(I);
classeppv=C(1:k);
nc=0*ones(nbclasse,1);
for j=1:k;
ind=find(classcode==classeppv(j));
nc(ind)=nc(ind)+1;
end;
[~,aff]=max(nc);
YPeval(i)=classcode(aff);
end;
\ No newline at end of file
function [xapp,xtest,meanxapp,stdxapp] = normalizemeanstd(xapp,xtest,meanx,stdx)
% USAGE
%
% [xapp,xtest,meanxapp,stdxapp] = normalizemeanstd(xapp,xtest)
%
% normalize inputs and output mean and standard deviation to 0 and 1
%
%
tol=1e-5;
nbsuppress=0;
if nargin <3
meanxapp=mean(xapp);
stdxapp=std(xapp);
else
meanxapp=meanx;
stdxapp=stdx;
end;
nbxapp=size(xapp,1);
indzero=find(abs(stdxapp)<tol);
%keyboard
if ~isempty(indzero)
stdxapp(indzero)=1;
end;
nbvar=size(xapp,2);
xapp= (xapp - ones(nbxapp,1)*meanxapp)./ (ones(nbxapp,1)*stdxapp) ;
if nargin >1 & ~isempty(xtest)
nbxtest=size(xtest,1);
xtest= (xtest - ones(nbxtest,1)*meanxapp)./ (ones(nbxtest,1)*stdxapp );
else
xtest=[];
end;
\ No newline at end of file
function [xapp, yapp, xtest, ytest] = splitdata(x, y, ratio)
classcode = unique (y);
xapp = [];
yapp= [];
xtest = [];
ytest = [];
for numclass=1:length(classcode)
indclass = find(y==classcode(numclass));
Ni = length(indclass);
aux = randperm(Ni);
auxapp = aux(1: ceil(ratio*Ni));
auxtest = aux(ceil(ratio*Ni)+1:end);
xapp = [xapp; x(indclass(auxapp),:)];
yapp = [yapp; y(indclass(auxapp))];
xtest = [xtest; x(indclass(auxtest),:)];
ytest = [ytest; y(indclass(auxtest))];
end
= Test
:nofooter:
:icons: font
== Machin
* Hello
** Test
... mar
... fjsjk
WARNING: test
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment