Machines `a vecteurs support (SVM) Chargement de la Toolbox

Transcription

Machines `a vecteurs support (SVM) Chargement de la Toolbox
Apprentissage, Réseaux de neurones et Modèles graphiques (RCP209)
Machines à vecteurs support (SVM)
Chargement de la Toolbox SVM
Voici deux toolbox intressantes :
http://www.csie.ntu.edu.tw/∼cjlin/libsvm
http://asi.insa-rouen.fr/enseignants/∼arakotom/toolbox
Nous allons utiliser la deuxième toolbox
- Allez à http://asi.insa-rouen.fr/enseignants/∼arakotom/toolbox
- Descendez dans la page jusqu’à Download
- Téléchargez Matlab source code
- Créez un répertoire SVM-KM (sous linux mkdir SVM-KM)
- Déplacez SVM-KM.zip dans SVM-KM (sous linux mv SVM-KM.zip SVM-KM/)
- Décompressez le fichier SVM-KM.zip ( unzip SVM-KM.zip)
Vous disposez alors de la toolbox SVM-KM
- Créez un répertoire de travail TP SVM au même niveau que la toolbox SVM-KM.
- Placez vous dans ce répertoire TP SVM.
- Créez un fichier matlab <<chemins.m>> contenant les chemins vers la toolbox.
Dans notre cas, vu l’emplacement de TP SVM par rapport à SVM-KM, le fichier
<<chemins.m>> contiendra les instructions suivantes :
addpath
addpath
addpath
addpath
addpath
addpath
addpath
addpath
addpath
addpath
../SVM-KM
../SVM-KM/AdaptScalSVM
../SVM-KM/featselreg
../SVM-KM/FeatureSelection
../SVM-KM/kbp
../SVM-KM/libsvminterface
../SVM-KM/regpath
../SVM-KM/svmroc
../SVM-KM/utilities
../SVM-KM/waveletkernelmultires
Quand vous lancez matlab, il ne faut pas oublier de taper la commande <<chemins>> pour ajouter
les paths vers le logiciel SVM-KM.
Classification en deux classes
Génération des données
Utilisez le script donnees1.m pour générer des exemples simples de classification en deux classes.
Fichier donnee1.m
N1 = input (’Nombre de points positifs ? ’);
N2 = input (’Nombre de points negatifs ? ’);
figure
axis([-4 4 -3 3]);
grid on
hold on
Yapp=[ones(N1,1);-ones(N2,1)];
1
for i=1:N1
[x(i),y(i)]=ginput(1); plot(x(i),y(i),’r.’)
end
for i=N1+1:N1+N2
[x(i),y(i)]=ginput(1); plot(x(i),y(i),’b.’)
end
Xapp=[x’ y’];
save donnees1 Xapp Yapp
a) générez des données linéairement séparables
b) générez des données non linéairement séparables
Apprentissage
Utilisez le script test1.m pour faire des apprentissages. Faı̂tes varier les paramètres de la fonction svmclass et observez les résultats.
- kernel = ’poly’ ou ’gaussian’ : le noyau
- kerneloption : le paramètre du noyau
- C : la constante de régularisation
Fichier test1.m
load donnees1
figure
plot(Xapp(Yapp==1,1),Xapp(Yapp==1,2),’+r’);
hold on
plot(Xapp(Yapp==-1,1),Xapp(Yapp==-1,2),’+b’);
lambda = 1e-7;
C = 100; kernel=’poly’; kerneloption=1;
[xsup,w,w0,pos,tps,alpha] = svmclass(Xapp,Yapp,C,lambda,kernel,kerneloption,0);
ypredapp = svmval(Xapp,xsup,w,w0,kernel,kerneloption,1);
% Visualisation
ax=axis;
[xtest1 xtest2] = meshgrid([ax(1):.05:ax(2)],[ax(3):0.05:ax(4)]);
[nn1 nn2] = size(xtest1);
Xtest = [reshape(xtest1 ,nn1*nn2,1) reshape(xtest2 ,nn1*nn2,1)];
Ypred = svmval(Xtest,xsup,w,w0,kernel,kerneloption,[ones(length(Xtest),1)]);
Ypred = reshape(Ypred,nn1,nn2);
hold on
[cc,hh]=contour(xtest1,xtest2,Ypred,[-1 0 1],’k’);
clabel(cc,hh);
plot(xsup(:,1),xsup(:,2),’om’);
title([’C=’ num2str(C) ’ (’ kernel ’,’ num2str(kerneloption) ’)’ ’NbVectSupport = ’ num2str(size(xsup,1))])
Cas multi-classes
Modifiez le fichier donnees.m pour générer des exemples de classification en trois classes.
N1 = input (’Nombre de points classe 1 ? ’);
N2 = input (’Nombre de points classe 2 ? ’);
N3 = input (’Nombre de points classe 3 ? ’);
figure
axis([-4 4 -3 3]);
grid on
hold on
2
Yapp=[ones(N1,1);2*ones(N2,1);3*ones(N3,1)];
for i=1:N1
[x(i),y(i)]=ginput(1); plot(x(i),y(i),’r.’)
end
for i=N1+1:N1+N2
[x(i),y(i)]=ginput(1); plot(x(i),y(i),’b.’)
end
for i=N1+N2+1:N1+N2+N3
[x(i),y(i)]=ginput(1); plot(x(i),y(i),’g.’)
end
Xapp=[x’ y’];
save donnees2 Xapp Yapp
Stratégie ”un contre tous”
Utilisez le script testUnContreTous.m
Script testUnContreTous.m
load donnees2
figure
hold on
plot(Xapp(Yapp==1,1),Xapp(Yapp==1,2),’+r’);
plot(Xapp(Yapp==2,1),Xapp(Yapp==2,2),’+b’);
plot(Xapp(Yapp==3,1),Xapp(Yapp==3,2),’+g’);
% Apprentissage
lambda = 1e-7;
c = 1000; kernel=’poly’; kerneloption= 1; nbclass=3;
[xsup,w,b,nbsv]=svmmulticlassoneagainstall(Xapp,Yapp,nbclass,c,lambda,kernel,kerneloption,0);
%Test et visualisation
[xtesta1,xtesta2]=meshgrid([-4:0.1:4],[-4:0.1:4]);
[na,nb]=size(xtesta1);
xtest1=reshape(xtesta1,1,na*nb);
xtest2=reshape(xtesta2,1,na*nb);
xtest=[xtest1;xtest2]’;
[ypred,maxi] = svmmultival(xtest,xsup,w,b,nbsv,kernel,kerneloption);
ypredmat=reshape(ypred,na,nb);
contour(xtesta1,xtesta2,ypredmat);
hold on
% les vecteurs supports
plot(xsup(:,1),xsup(:,2),’om’);
axis( [ -4 4 -4 4]);
legend(’classe 1’,’classe 2’,’classe 3’, ’contour’, ’vecteurs supports’);
hold off
Stratégie ”un contre un”
- Copiez le fichier testUnContreTous.m dans un fichier testUnContreUn.m
- Utilisez les fonctions :
- svmmulticlassoneagainstone à la place de svmmulticlassoneagainstall et
- svmmultivaloneagainstone à la place de svmmultival
3
Problème réel de classification : les Iris de Fisher
Les Iris de Fisher correspondent à 150 fleurs décrites par 4 variables quantitatives : longueur du sépale,
largeur du sépale, longueur du pétal et largeur du pétal.
Les 150 fleurs sont réparties en 3 différentes espèces : iris setosa, iris versicolor et iris virginica
Chaque classe est composée de 50 fleurs. La classe setosa est linéairement séparable des deux autres,
alors que versicolor et virginica ne le sont pas.
Le fichier iris don.mat contient les vecteurs d’entrée en dimension 4 décrivant les 150 iris. Le fichier
iris cls.mat contient les classes des 150 iris. Pour lire ces fichiers faire :
load -ascii iris don.mat
load -ascii iris cls.mat
1. Utiliser seulement deux variables : longueur du pétal et largeur du pétal.
a) Entraı̂nez et visualisez une SVM permettant de séparer iris setosa des deux autres classes.
b) Entraı̂nez et visualisez une SVM permettant de séparer iris virginica des deux autres classes.
c) Entraı̂nez et visualisez une SVM permettant de séparer iris versicolor des deux autres classes.
2. En utilisant les 4 variables, entraı̂nez une SVM permettant de séparer les trois classes.
Régression
Régression 1D
Utilisez le script suivant pour générer les données d’apprentissage.
Fichier donnees3.m
n=100; x=4*(rand(n,1)-.5); x=sort(x);
% y=sin(pi*x) sur ] − 1, 1[ et y=0 sur [−2, −1] ∪ [1, 2]
y=zeros(size(x)); y=sin(pi*x).*((x>-1) & (x<1));
figure
xx=linspace(-2,2,10000)’; yy=sin(pi*xx).*((xx>-1) & (xx<1));
plot(xx,yy,’g’,x,y,’b+’);
title(’fonction et points d”apprentissage’)
xreg1=x; yreg1=y; save datareg1 xreg1 yreg1
Utilisez le script suivant pour faire des apprentissages. Faı̂tes varier les différents paramètres et observez
les résultats.
Fichier testreg1.m
load datareg1
C = 1; lambda = 0.000001;
epsilon=0.1;
kernel=’gaussian’; kerneloption = 0.1;
[xsup,ysup,w,w0] = svmreg(xreg1,yreg1,C,epsilon,kernel,kerneloption,lambda);
rx = svmval(xx,xsup,w,w0,kernel,kerneloption);
figure
hold on
h=plot(xx,yy,’g’); set(h,’LineWidth’,2);
h = plot(xx,rx,’b’); set(h,’LineWidth’,2);
h = plot(xsup,ysup,’or’); set(h,’LineWidth’,2);
plot(xx,rx+epsilon,’b–’);
plot(xx,rx-epsilon,’b–’);
title([ ’NbVectSupport = ’ num2str(size(xsup,1))])
4
Régression 2D
Fichier testreg2.m
N=300; x1=2*randn(N,1); x2=2*randn(N,1); y=exp(-(x1.∧2+x2.∧2)*2); x=[x1 x2];
C = 1000; lambda = 1e-7; epsilon=0.05; kernel=’gaussian’; kerneloption = 0.3;
[xsup,ysup,w,w0] = svmreg(x,y,C,epsilon,kernel,kerneloption,lambda);
[xtesta1,xtesta2]=meshgrid([-3:0.1:3],[-3:0.1:3]);
[na,nb]=size(xtesta1);
xtest1=reshape(xtesta1,1,na*nb);
xtest2=reshape(xtesta2,1,na*nb);
xtest=[xtest1;xtest2]’;
ypred = svmval(xtest,xsup,w,w0,kernel,kerneloption);
ypredmat=reshape(ypred,na,nb);
figure
subplot(2,2,1); yy=exp(-(xtesta1.∧2+xtesta2.∧2)*2); mesh(xtesta1,xtesta2,yy); title(’Fonction’)
subplot(2,2,2); plot3(x1,x2,y,’k.’); title(’Points d”apprentissage’)
subplot(2,2,3); mesh(xtesta1,xtesta2,ypredmat); title([ ’NbVectSupport = ’ num2str(size(xsup,1))])
5