1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
% genere un ensemble de K données de deux classes, de densités gaussiennes de moyennes m1 et m2 de Matrice de covariance = identité.
function [X, S] = genere_donnees(K, m1, m2)
X=[];
S=[];
for i =1:K
if randn <0
X=[X ; m1+randn(1,2)];
S=[S ; -1];
else
X=[X ; m2+randn(1,2)];
S=[S;1];
end
end
i1=find(S==-1);
i2=find(S==1);
figure(1);
clf;
#plot(X(i1,1),X(i1,2),'+',X(i2,1),X(i2,2),'*');
#hold on
endfunction;
function y = randperm(N)
[ordered_nu_ms, y] = sort( rand(N, 1));
endfunction
function [XApp, YApp, XTest, YTest] = diviseBD(E, S, Taux)
N = size(E) (1);
NApp = floor(N*Taux);
I = randperm(N);
J = I(1: NApp);
K = I(NApp+1: N);
XApp = E(J, :);
YApp = S(J, :);
XTest = E(K, :);
YTest = S(K, :);
endfunction
function taux=taux_erreur(E,S,W)
M=E*W.*S;
I_Non_Zero = find(M<0);
taux=size(I_Non_Zero)(1)/size(E)(1);
endfunction
function [w_opt, Err_app, Err_test]=perceptron(Ea, Sa, Et, St, Eps)
W = rand(3,1);
t=1;
abs=[];
Err_a_cum=[];
Err_t_cum=[];
do
for i=1 : length(Ea)
cond = Ea(i,:)*W.*Sa(i,:);
if( cond >= 0 )
w_opt = W;
condition = 0;
else
w_opt = W+Eps*Sa(i,:)*Ea(i,:)';
condition = 1;
endif
W = w_opt;
endfor
Err_app = taux_erreur(Ea,Sa,w_opt);
Err_test = taux_erreur(Et,St,w_opt);
Err_a_cum = [Err_a_cum, Err_app];
Err_t_cum = [Err_t_cum, Err_test];
abs=[abs, t];
t=t+1;
until( ( Err_app == 0 ) || (t>=200));
#subplot (2, 1, 1);
figure(2);
hold off;
plot(abs, Err_a_cum, '-', abs, Err_t_cum, '-');
endfunction
function tracer(W, XApp, YApp, XTest, YTest)
i1=find(YApp==-1);
i2=find(YApp==1);
ord = -(XApp(:,2).*W(2,:)+XApp(:,1).*W(1,:))./(W(3,:));
#hold off;
#subplot (2, 1, 2);
figure(1);
hold on;
plot(XApp(:,2), ord, '-', XApp(i1,2),XApp(i1,3),'+', XApp(i2,2),XApp(i2,3),'*');
endfunction
m1 = [-3 0];
m2 = [2.5 0];
K=1000;
[Xa, Sa] = genere_donnees(K, m1, m2);
[XApp, YApp, XTest, YTest] = diviseBD(Xa, Sa, 0.5);
Col1 = ones(size(XApp)(1), 1); #Ajout d'une colonne de 1 pour w0 -> x1*w2+x2*w1+1*w0
Ea = [Col1, XApp];
Col2 = ones(size(XTest)(1), 1);
Et = [Col2, XTest];
Eps = 0.001;
[w_opt, Err_app, Err_test]=perceptron(Ea, YApp, Et, YTest, Eps); #appel de la fonction
tracer(w_opt, Ea, YApp, Et, YTest) |
Partager