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