Implementar o neurnio Adaline (funo de ativao linear) no SCILAB e aplic-lo na regresso linear de dados de uma dimenso: 1 - Criar a funo "yadaline" que calcula a sada do neurnio Adaline. Declarao: function y = yadaline(X,W,b) onde: X = matriz (m x t) de dados com t amostras de m caractersticas (m entradas); W = vetor linha (1 x m) de pesos das entradas; b = polarizao do neurnio; y = valor da sada no neurnio. //1 function y=yadaline(x, w, b) y=w*x + b; endfunction
2 - Gerar um vetor (1 x t) de dados de entrada (uma entrada apenas com t amostras) e um vetor (1 x t) de dados de sada correspondente, segundo uma reta crescente. Plotar o grfico dos dados. x1 = [0:5:100] y1 = 0.64*x1+1 Plotar o grfico dos dados. scf(0) xlabel ('X'); //Nomeia a abscissa ylabel ('Y desejado'); //Nomeia a ordenada title ('Reta original e dados amostrados sem rudos'); //Nomeia o titulo plot(x1,y1, 'Co')
3 - Criar a funo "treina_adaline" que treina o neurnio Adaline (funo idntica a funo "treina_perceptron" desenvolvida em exerccio anterior), e use-a com os dados do item 2 para fazer a regresso linear dos dados. Usar a funo "mistura", implementada em exerccio anterior, no incio de cada poca de treinamento. //1 function y=yadaline(x, w, b) y=w*x + b; endfunction
//Mistura
function [xp, cp]=mistura(x, c) xp = x; cp = c; indiceMisturado = grand(1,'prm',[1:size(x,2)]'); i = [1:size(x,2)]; xp(:,i) = x(:,indiceMisturado); cp(i) = c(indiceMisturado); endfunction
//3 - Criar a funo "treina_adaline" que treina o neurnio Adaline...
function [w, b, erroepocas]=treina_adaline(w, b, x1, y1, alfa, maxepocas, tol) it = 1; somaErrosAoQuadrado = 1000; // Soma dos erros quadrticos da ltima poca erroepocas=[]; // Soma dos erros quadrticos das pocas while (it <= maxepocas & somaErrosAoQuadrado > tol) somaErrosAoQuadrado = 0; [xin,yin]=mistura(x1,y1); for i=1:size(xin,2) // indo at o numero de amostras de X y = yadaline(xin(:,i),w,b) erro = yin(i) - y; somaErrosAoQuadrado = somaErrosAoQuadrado + (erro*erro)
w = w + alfa * erro * xin(:,i)' b = b + alfa * erro; end erroepocas = [erroepocas somaErrosAoQuadrado]; it = it + 1; end endfunction
4 - Plotar o grfico com os dados gerados e a reta encontrada pelo Adaline treinado. //4 - Plotar o grfico com os dados gerados e a reta encontrada pelo Adaline treinado.
x1 = [0:5:100] y1 = 0.64*x1+1
scf(0) xlabel ('X'); //Nomeia a abscissa ylabel ('Y desejado'); //Nomeia a ordenada title ('Reta original e dados amostrados sem rudos'); //Nomeia o titulo plot(x1,y1, 'Co')
w = rand(); b = rand(); alfa = 10^-5; maxepocas = 50; tol = 0.001; [w1,b1,erroepoca]=treina_adaline(w,b,x1,y1,alfa,maxepocas,tol); dados = [0:5:100]; y=yadaline(dados,w1,b1);
//4 - Plotar o grfico com os dados gerados e a reta encontrada pelo Adaline treinado.
scf(1) xlabel ('X'); //Nomeia a abscissa ylabel ('Y desejado'); //Nomeia a ordenada title ('Reta original e obtida com o adaline'); //Nomeia o titulo plot(x1,y1,'Co') plot(dados,y,'r') legend('reta dos dados gerados','reta do adaline');
5 - Plotar a evoluo do erro quadrtico de treinamento do Adaline em funo da poca. //5 - Plotar a evoluo do erro quadrtico de treinamento do Adaline em funo da poca. scf(2) xlabel ('Epoca'); //Nomeia a abscissa ylabel ('Erro'); //Nomeia a ordenada title ('Erro X Epoca'); //Nomeia o titulo plot(erroepoca);
6 - Acrescentar rudo aos dados de sada (utilize a funo "rand" do SCILAB), e repetir os itens anteriores.
variancia = 0.45; x1 = [0:5:100]; y_ruido= y1 +(2*rand(1,21,'normal'))*variancia ; scf(3); xlabel ('X'); //Nomeia a abscissa ylabel ('Y desejado'); //Nomeia a ordenada title ('Reta original e dados amostrados com rudos'); //Nomeia o titulo plot(x1,y_ruido, 'ob');
//Plotar o grfico com os dados com rudo gerados e a reta encontrada pelo Adaline treinado
scf(4) xlabel ('X'); //Nomeia a abscissa ylabel ('Y desejado'); //Nomeia a ordenada title ('Reta original e obtida com o adaline'); //Nomeia o titulo
plot(x1,y_ruido,'ob') plot(dados,y,'r') legend('amostra com ruidos','reta do adaline');
//Plota a evoluo do erro quadrtico de treinamento do Adaline em funo da poca scf(6) xlabel ('Epoca'); //Nomeia a abscissa ylabel ('Erro'); //Nomeia a ordenada title ('Erro quadrtico X Epoca'); plot(erroepoca1);
scf(5) xlabel ('X'); //Nomeia a abscissa ylabel ('Y desejado'); //Nomeia a ordenada title ('Reta original e obtida com o adaline'); //Nomeia o titulo plot(x1,y1,'b') plot(x1,y2,'r') legend('reta original','reta do adaline');
//Script completo //Programa de Treinamento do Perceptron // Implementar o neurnio Adaline (funo de ativao linear) no SCILAB e aplic-lo na regresso linear de dados de uma dimenso...
//1
function y=yadaline(x, w, b) y=w*x + b; endfunction
//Mistura
function [xp, cp]=mistura(x, c) xp = x; cp = c; indiceMisturado = grand(1,'prm',[1:size(x,2)]'); i = [1:size(x,2)]; xp(:,i) = x(:,indiceMisturado); cp(i) = c(indiceMisturado); endfunction
//3 - Criar a funo "treina_adaline" que treina o neurnio Adaline...
function [w, b, erroepocas]=treina_adaline(w, b, x1, y1, alfa, maxepocas, tol) it = 1; somaErrosAoQuadrado = 1000; // Soma dos erros quadrticos da ltima poca erroepocas=[]; // Soma dos erros quadraticos das epocas while (it <= maxepocas & somaErrosAoQuadrado > tol) somaErrosAoQuadrado = 0; [xin,yin]=mistura(x1,y1); for i=1:size(xin,2) // indo at o numero de amostras de X y = yadaline(xin(:,i),w,b) erro = yin(i) - y; somaErrosAoQuadrado = somaErrosAoQuadrado + (erro*erro)
w = w + alfa * erro * xin(:,i)' b = b + alfa * erro; end erroepocas = [erroepocas somaErrosAoQuadrado]; it = it + 1; end endfunction
//2
x1 = [0:5:100] y1 = 0.64*x1+1 scf(0) xlabel ('X'); //Nomeia a abscissa ylabel ('Y desejado'); //Nomeia a ordenada title ('Reta original e dados amostrados sem rudos'); //Nomeia o titulo plot(x1,y1, 'Co')
w = rand(); b = rand(); alfa = 10^-5; maxepocas = 50; tol = 0.001; [w1,b1,erroepoca]=treina_adaline(w,b,x1,y1,alfa,maxepocas,tol); dados = [0:5:100]; y=yadaline(dados,w1,b1);
//4 - Plotar o grfico com os dados gerados e a reta encontrada pelo Adaline treinado.
scf(1) xlabel ('X'); //Nomeia a abscissa ylabel ('Y desejado'); //Nomeia a ordenada title ('Reta original e obtida com o adaline'); //Nomeia o titulo plot(x1,y1,'Co') plot(dados,y,'r') legend('reta dos dados gerados','reta do adaline');
//5 - Plotar a evoluo do erro quadrtico de treinamento do Adaline em funo da poca.
scf(2) xlabel ('Epoca'); //Nomeia a abscissa ylabel ('Erro'); //Nomeia a ordenada title ('Erro X Epoca'); //Nomeia o titulo plot(erroepoca);
scf(3); xlabel ('X'); //Nomeia a abscissa ylabel ('Y desejado'); //Nomeia a ordenada title ('Reta original e dados amostrados com rudos'); //Nomeia o titulo plot(x1,y_ruido, 'ob');
//Plotar o grfico com os dados com ruido gerados e a reta encontrada pelo Adaline treinado
scf(4) xlabel ('X'); //Nomeia a abscissa ylabel ('Y desejado'); //Nomeia a ordenada title ('Reta original e obtida com o adaline'); //Nomeia o titulo
plot(x1,y_ruido,'ob') plot(dados,y,'r') legend('amostra com ruidos','reta do adaline');
//Plota a evoluo do erro quadrtico de treinamento do Adaline em funo da poca
scf(5) xlabel ('X'); //Nomeia a abscissa ylabel ('Y desejado'); //Nomeia a ordenada title ('Reta original e obtida com o adaline'); //Nomeia o titulo plot(x1,y1,'b') plot(x1,y2,'r') legend('reta original','reta do adaline');
scf(6) xlabel ('Epoca'); //Nomeia a abscissa ylabel ('Erro'); //Nomeia a ordenada title ('Erro quadrtico X Epoca'); plot(erroepoca1);