Skip to content

Instantly share code, notes, and snippets.

@VitorLuizC
Last active October 10, 2017 23:56
Show Gist options
  • Save VitorLuizC/0c6de77e05c43dbe7064e55bb67775b8 to your computer and use it in GitHub Desktop.
Save VitorLuizC/0c6de77e05c43dbe7064e55bb67775b8 to your computer and use it in GitHub Desktop.
Redes Neurais

Etapas

  1. Pré-processamento
  2. Extração de dados
  3. Classificação

Circuítos lógicos são a solução pra classificações não lineares.

  • Essa solução adiciona camadas de neurônios pra trabalhar com os circuítos;
  • Essas camadas adicionais, segundo algum modelo matemático, podem ser subtituídas por uma única camada oculta;
  • Não existe forma de prever a quantidade de elementos na camada oculta.

Todos os elementos da camada de entrada alimentam a camada de entrada e todos os elementos da camada oculta alimentam a camada de saída.

 - Projetar a Rede:                 # Obs. Não existe ordem correta ou uma pré-definição
   -> Definir o vetor de atributos; #      do momento correto, na implementação, de fazer
   -> Definir classes;              #      a projeção.
   -> Número de neurônios na camada oculta;
   -> Definir a função de ativação;
   -> Treinar a Rede:
     -> Usar dados rotulados (Cada linha de dados possui um alvo específico);
     -> Executar o Backpropagation.

Back-Propagation

  • ETA é a taxa de aprendizado, sempre maior que 0;
  • Não consegue usar saídas de 0 & 1;
  • Precisa de uma saída mais suave de cada neurônio, funções de ativação:
    • Logítica: Transição suave entre 0 e 1.
  • Epocas são a quantidade de vezes que o treino é executado;
  • ERRO MINIMO taxa de erro permitida;
  • Pesos Sinápticos são salvos depois do treino.

Perceptron

Perceptron é um classificador linear.

MLP (Multi Layer Perceptron)

% Rede Perceptron
% ------------------------------------------------------------------------------
% Fecha as janelas com conteúdos gráficos.
close all;
% Carrega os atributos do arquivo de dados na forma de vetores-coluna.
[slen,swid,plen,pwid,clazz] = textread(
'Data.data', % Obs. Linhas em branco no final do arquivo de dados devem ser
'%f%f%f%f%s', % manualmente excluídas pra evitar erros durante o
'delimiter', % carregamento dos atributos.
','
);
% Vetores logicos que indicam os indices ocpuados por amostras de cada classe
idx_setosa = strcmp(clazz,"Iris-setosa");
idx_virginica = strcmp(clazz,"Iris-virginica");
idx_versicolor = strcmp(clazz,"Iris-versicolor");
% Treinamento via regra do perceptron
Dados = [plen pwid];
% 1. Transformacao dos dados de classe em saidas do neuronios
% Classe setosa: [1 0 0]
% Classe virginica: [0 1 0]
% Classe versicolor: [0 0 1]
Alvos = zeros(length(plen),3);
Alvos(idx_setosa,:) = repmat([1 0 0],sum(idx_setosa),1);
Alvos(idx_virginica,:) = repmat([0 1 0],sum(idx_virginica),1);
Alvos(idx_versicolor,:) = repmat([0 0 1],sum(idx_versicolor),1);
eta = 0.2; %Taxa de aprendizado
%Matriz de atributos no caso de 2 aributos e tres classes
%Inicializacao com valores entre -1 e 1
nClasses = columns(Alvos);
W = 2*rand(columns(Dados), nClasses) - 1;
wb = 2*rand(nClasses,1) - 1; %Matriz coluna
%Vetor de erros - guarda o erro em cada epoca de teinamento
nEpocas = 200;
errVec = zeros(nClasses,nEpocas);
for epoca = 1:nEpocas
%Ordenacao aleatoria dos dados de entrada
ordering = randperm(length(plen));
DadosR = Dados(ordering,:); %Dados ordenados por linha
AlvosR = Alvos(ordering, :); %Alvos ordenados por linha
err2 = zeros(nClasses,1);
%Fazer o erro por neuronio
for i = 1:rows(DadosR)
x = DadosR(i,:)';
t = AlvosR(i,:)';
% Calculo da saida do neuronio
a = W' * x + wb; %Potenciais de acao
y = a > 0; %Saidas dos neuronios
e = t - y; %Erros dos neuronios
% Atualizaco dos pesos
W = W + eta * x * e';
wb = wb + eta * e; % x bias vale 1
err2 += e.^2;
end
errVec(:,epoca) = err2;
if (sum(err2) < 0.0001) break end;
end
plot(errVec');
%Plota os atributos 'sepal length' e 'sepal width'
figure
hold on
idx = idx_setosa;
scatter(plen(idx),pwid(idx),8,'k',"filled")
idx = idx_virginica;
scatter(plen(idx),pwid(idx),8,'r',"filled")
idx = idx_versicolor;
scatter(plen(idx),pwid(idx),8,'g',"filled")
title("petal length x petal width")
#Linhas de separação
xmin = 0;
xmax = 7;
plot([xmin,xmax],[(-wb(1)-W(1,1)*xmin)/W(2,1),(-wb(1)-W(1,1)*xmax)/W(2,1)],'k');
plot([xmin,xmax],[(-wb(2)-W(1,2)*xmin)/W(2,2),(-wb(2)-W(1,2)*xmax)/W(2,2)],'r');
plot([xmin,xmax],[(-wb(3)-W(1,3)*xmin)/W(2,3),(-wb(3)-W(1,3)*xmax)/W(2,3)],'g');
axis([min(plen) max(plen) min(pwid) max(pwid)]);
#Classificação de um novo ponto
teste = [2;0.2];
(W' * teste + wb > 0)' %Setosa é linearmente separável
teste = [7;2];
(W' * teste + wb > 0)' %Virginica é "quase" linearmente separável
teste = [4;1.3];
(W' * teste + wb > 0)' %Versicolor não é linearmente separável :(
%Uso da rede MLP
%Carregamento dos dados do arquivo iris.dat
% Script de classificacao
close all % Fecha todos os graficos
%Carrega os atributos de iris.data na forma de vetores-coluna
%OBS: As linhas em branco no final de iris.data devem ser apagadas manualmente
[slen,swid,plen,pwid,clazz] = textread('iris.data','%f%f%f%f%s','delimiter',',');
%Vetores logicos que indicam os indices ocpuados por amostras de cada classe
idx_setosa = strcmp(clazz,"Iris-setosa");
idx_virginica = strcmp(clazz,"Iris-virginica");
idx_versicolor = strcmp(clazz,"Iris-versicolor");
% Treinamento via regra do Perceptron
% Obs. Adicionando mais dados, no caso slen & swid, aumenta o aprendizado.
Dados = [plen pwid slen swid];
% Normalização dos dados
% ------------------------------------------------------------------------------
% Normalizar torna o aprendizado mais sucinto e diminui a taxa de erros.
Normalizados = (Dados - mean(Dados))./std(Dados);
% 1. Transformacao dos dados de classe em saidas do neuronios
% Classe setosa: [1 0 0]
% Classe virginica: [0 1 0]
% Classe versicolor: [0 0 1]
Alvos = zeros(length(plen),3);
Alvos(idx_setosa,:) = repmat([1 0 0],sum(idx_setosa),1);
Alvos(idx_virginica,:) = repmat([0 1 0],sum(idx_virginica),1);
Alvos(idx_versicolor,:) = repmat([0 0 1],sum(idx_versicolor),1);
eta = 0.5; %Taxa de aprendizado
nHidden = 3; %Neuronios na camada oculta
tipo = "sigmoid"; %POde ser 'tanh' ou 'sigmoid'
nEpocas = 1000;
minError = 0.001;
[NET, errVec] = backpropagation(Normalizados, Alvos, nHidden, tipo, eta, nEpocas, minError);
plot(errVec');
%Plota os atributos 'sepal length' e 'sepal width'
figure
hold on
idx = idx_setosa;
scatter(plen(idx),pwid(idx),8,'k',"filled")
idx = idx_virginica;
scatter(plen(idx),pwid(idx),8,'r',"filled")
idx = idx_versicolor;
scatter(plen(idx),pwid(idx),8,'g',"filled")
title("petal length x petal width")
#Classificação de um novo ponto
Teste = [
2, 0.2, 4.8, 3;
7, 2, 4.9, 2;
4, 1.3, 4.7, 1.2;
];
TesteNormalizado = (Teste - mean(Dados))./std(Dados);
Y = mlp(NET, TesteNormalizado); %Setosa, Virginica e Versicolor respectivamente
display(Y);
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.9,1.7,0.4,Iris-setosa
4.6,3.4,1.4,0.3,Iris-setosa
5.0,3.4,1.5,0.2,Iris-setosa
4.4,2.9,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
5.4,3.7,1.5,0.2,Iris-setosa
4.8,3.4,1.6,0.2,Iris-setosa
4.8,3.0,1.4,0.1,Iris-setosa
4.3,3.0,1.1,0.1,Iris-setosa
5.8,4.0,1.2,0.2,Iris-setosa
5.7,4.4,1.5,0.4,Iris-setosa
5.4,3.9,1.3,0.4,Iris-setosa
5.1,3.5,1.4,0.3,Iris-setosa
5.7,3.8,1.7,0.3,Iris-setosa
5.1,3.8,1.5,0.3,Iris-setosa
5.4,3.4,1.7,0.2,Iris-setosa
5.1,3.7,1.5,0.4,Iris-setosa
4.6,3.6,1.0,0.2,Iris-setosa
5.1,3.3,1.7,0.5,Iris-setosa
4.8,3.4,1.9,0.2,Iris-setosa
5.0,3.0,1.6,0.2,Iris-setosa
5.0,3.4,1.6,0.4,Iris-setosa
5.2,3.5,1.5,0.2,Iris-setosa
5.2,3.4,1.4,0.2,Iris-setosa
4.7,3.2,1.6,0.2,Iris-setosa
4.8,3.1,1.6,0.2,Iris-setosa
5.4,3.4,1.5,0.4,Iris-setosa
5.2,4.1,1.5,0.1,Iris-setosa
5.5,4.2,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
5.0,3.2,1.2,0.2,Iris-setosa
5.5,3.5,1.3,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
4.4,3.0,1.3,0.2,Iris-setosa
5.1,3.4,1.5,0.2,Iris-setosa
5.0,3.5,1.3,0.3,Iris-setosa
4.5,2.3,1.3,0.3,Iris-setosa
4.4,3.2,1.3,0.2,Iris-setosa
5.0,3.5,1.6,0.6,Iris-setosa
5.1,3.8,1.9,0.4,Iris-setosa
4.8,3.0,1.4,0.3,Iris-setosa
5.1,3.8,1.6,0.2,Iris-setosa
4.6,3.2,1.4,0.2,Iris-setosa
5.3,3.7,1.5,0.2,Iris-setosa
5.0,3.3,1.4,0.2,Iris-setosa
7.0,3.2,4.7,1.4,Iris-versicolor
6.4,3.2,4.5,1.5,Iris-versicolor
6.9,3.1,4.9,1.5,Iris-versicolor
5.5,2.3,4.0,1.3,Iris-versicolor
6.5,2.8,4.6,1.5,Iris-versicolor
5.7,2.8,4.5,1.3,Iris-versicolor
6.3,3.3,4.7,1.6,Iris-versicolor
4.9,2.4,3.3,1.0,Iris-versicolor
6.6,2.9,4.6,1.3,Iris-versicolor
5.2,2.7,3.9,1.4,Iris-versicolor
5.0,2.0,3.5,1.0,Iris-versicolor
5.9,3.0,4.2,1.5,Iris-versicolor
6.0,2.2,4.0,1.0,Iris-versicolor
6.1,2.9,4.7,1.4,Iris-versicolor
5.6,2.9,3.6,1.3,Iris-versicolor
6.7,3.1,4.4,1.4,Iris-versicolor
5.6,3.0,4.5,1.5,Iris-versicolor
5.8,2.7,4.1,1.0,Iris-versicolor
6.2,2.2,4.5,1.5,Iris-versicolor
5.6,2.5,3.9,1.1,Iris-versicolor
5.9,3.2,4.8,1.8,Iris-versicolor
6.1,2.8,4.0,1.3,Iris-versicolor
6.3,2.5,4.9,1.5,Iris-versicolor
6.1,2.8,4.7,1.2,Iris-versicolor
6.4,2.9,4.3,1.3,Iris-versicolor
6.6,3.0,4.4,1.4,Iris-versicolor
6.8,2.8,4.8,1.4,Iris-versicolor
6.7,3.0,5.0,1.7,Iris-versicolor
6.0,2.9,4.5,1.5,Iris-versicolor
5.7,2.6,3.5,1.0,Iris-versicolor
5.5,2.4,3.8,1.1,Iris-versicolor
5.5,2.4,3.7,1.0,Iris-versicolor
5.8,2.7,3.9,1.2,Iris-versicolor
6.0,2.7,5.1,1.6,Iris-versicolor
5.4,3.0,4.5,1.5,Iris-versicolor
6.0,3.4,4.5,1.6,Iris-versicolor
6.7,3.1,4.7,1.5,Iris-versicolor
6.3,2.3,4.4,1.3,Iris-versicolor
5.6,3.0,4.1,1.3,Iris-versicolor
5.5,2.5,4.0,1.3,Iris-versicolor
5.5,2.6,4.4,1.2,Iris-versicolor
6.1,3.0,4.6,1.4,Iris-versicolor
5.8,2.6,4.0,1.2,Iris-versicolor
5.0,2.3,3.3,1.0,Iris-versicolor
5.6,2.7,4.2,1.3,Iris-versicolor
5.7,3.0,4.2,1.2,Iris-versicolor
5.7,2.9,4.2,1.3,Iris-versicolor
6.2,2.9,4.3,1.3,Iris-versicolor
5.1,2.5,3.0,1.1,Iris-versicolor
5.7,2.8,4.1,1.3,Iris-versicolor
6.3,3.3,6.0,2.5,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
7.1,3.0,5.9,2.1,Iris-virginica
6.3,2.9,5.6,1.8,Iris-virginica
6.5,3.0,5.8,2.2,Iris-virginica
7.6,3.0,6.6,2.1,Iris-virginica
4.9,2.5,4.5,1.7,Iris-virginica
7.3,2.9,6.3,1.8,Iris-virginica
6.7,2.5,5.8,1.8,Iris-virginica
7.2,3.6,6.1,2.5,Iris-virginica
6.5,3.2,5.1,2.0,Iris-virginica
6.4,2.7,5.3,1.9,Iris-virginica
6.8,3.0,5.5,2.1,Iris-virginica
5.7,2.5,5.0,2.0,Iris-virginica
5.8,2.8,5.1,2.4,Iris-virginica
6.4,3.2,5.3,2.3,Iris-virginica
6.5,3.0,5.5,1.8,Iris-virginica
7.7,3.8,6.7,2.2,Iris-virginica
7.7,2.6,6.9,2.3,Iris-virginica
6.0,2.2,5.0,1.5,Iris-virginica
6.9,3.2,5.7,2.3,Iris-virginica
5.6,2.8,4.9,2.0,Iris-virginica
7.7,2.8,6.7,2.0,Iris-virginica
6.3,2.7,4.9,1.8,Iris-virginica
6.7,3.3,5.7,2.1,Iris-virginica
7.2,3.2,6.0,1.8,Iris-virginica
6.2,2.8,4.8,1.8,Iris-virginica
6.1,3.0,4.9,1.8,Iris-virginica
6.4,2.8,5.6,2.1,Iris-virginica
7.2,3.0,5.8,1.6,Iris-virginica
7.4,2.8,6.1,1.9,Iris-virginica
7.9,3.8,6.4,2.0,Iris-virginica
6.4,2.8,5.6,2.2,Iris-virginica
6.3,2.8,5.1,1.5,Iris-virginica
6.1,2.6,5.6,1.4,Iris-virginica
7.7,3.0,6.1,2.3,Iris-virginica
6.3,3.4,5.6,2.4,Iris-virginica
6.4,3.1,5.5,1.8,Iris-virginica
6.0,3.0,4.8,1.8,Iris-virginica
6.9,3.1,5.4,2.1,Iris-virginica
6.7,3.1,5.6,2.4,Iris-virginica
6.9,3.1,5.1,2.3,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
6.8,3.2,5.9,2.3,Iris-virginica
6.7,3.3,5.7,2.5,Iris-virginica
6.7,3.0,5.2,2.3,Iris-virginica
6.3,2.5,5.0,1.9,Iris-virginica
6.5,3.0,5.2,2.0,Iris-virginica
6.2,3.4,5.4,2.3,Iris-virginica
5.9,3.0,5.1,1.8,Iris-virginica
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment