Programa Fonte em MatLab Redes Neurais Adaline

Programa Fonte em MatLab Redes Neurais Adaline

(Parte 1 de 2)

%% clean-up inicialização close all clear all % clc

epoca=1;% treinamento inicia na época 1

percentualAmostrasValidacao=50/100; funcaoAvaliacao='limiar'; tempo_treinamento = 10000; % quantidade maxima de épocas de treinamento

%% ler dados de treinamento %

% Estou admitindo que as amostras x[i] e o valor desejado d[i],

% estão na primeira planilha da pasta excell.

% Pode ter tantas variaveis x quanto desejado, ou necessário

% a variável header contém o nome das variaveisa de treinamento.

[x header]=xlsread('D:\mestrado\matematica\redes neurais\RNA01\dadosTreinamento\Tabela#Seção4.6_RNA.xls','plan1'); [ qtdPontos qtdCaracteristicasX]=size(x);

%% monta saidas desejadas - d[i] - vetor coluna % saidas desejadas: ultima coluna dos dados de treinamento d=x( : ,qtdCaracteristicasX);

%% cria bias - b[i] - vetor coluna % bias - elemento que indica a direção.

%vem do Latim e significa em sua origem: via ou estrada, dai o
%ditado: "Todas as vias nos levam a Roma", na época do Imperio
%Romano, as vias bem estruturadas foram construidas pelo
%e todas, talvez com poucas excessões de fato levavam a Roma.

Romanos %

% Queres encurtar o caminho: "ab via" -

% vá para a via, la a caminhada é mais rapida, e voce pode

% 'abreviar' o tempo de caminhada.

% Queres que todo saiba: "ab via"

% Todo mundo : vaijantes, comerciantes, andarilhos passam pela % via, logo se estiver "ab via", na via ao lado da via todos vão % ver. Isto aumenta tambem sua chance de vender.

% É obvio que obvio que de "ab via" --> "ob via" --> "obvia" -- obvio

% viajem - tempo passado na via

% viajante - aquele que andqa na via

% Pensas diferente? Encontrastes uma caminho (via) para fazer: temos

% então um novo "viéz"

% A fim de não "enviezar" muito, e para tornar "obvio" o sentido de "bias": % Bias é viéz, direção, linha direcionadora, tendencia.

% Mas o que que tem a ver o "b" de bias e o "v" de via?

% Existe um resposta, mas isto é outra conversa

bias= 1 * ones(size(d));

%% montar padrões de entrada: bias e x[i] x=[bias x(:,1:qtdCaracteristicasX-1)]'; % entra a coluna de bias e % sai a coluna saidas desejadas - d[i]

%% Gerar vetor de pesos aleatorios - w[i] % 0 < w[i] < 1 - valores aleatorios com distribuição uniforme

% w_inicial é o w[i] na época zero

% w[i] - vetor linha w_inicial=rand(1,qtdCaracteristicasX);

qtdAmostrasValidacao= floor(qtdPontos*percentualAmostrasValidacao);
%% arbitra um taxa de aprendizagem

%% clean-up pre-treinamento % distribui universo de amostras entre valicação e treinamento qtdAmostrasDeTreinamento = qtdPontos-qtdAmostrasValidacao; maxima_energia_erro_toleravel=1/2;

w=w_inicial;% inicializa vetor de
rede_esta_treinada= false;% inicializa condição

pesos sinalizadora de que a rede está treinada Acabou_periodo_treinamento = false; % inicializa condição de time-out

%% treinamento % executa processo de treinamento até que a rede esteja treinada ou

% que se encerre o periodo de tempo reservado para o treinamento

%% Uma especie de redução ao absurdo:

% admitimos, como premissa inicial, que a condição

% "rede_esta_treinada" é verdadeira. Se concluirmos que a

% condição é falsa temos um absurdo, pois pelo Principio do

% Terceiro Excluído - que rege a Lógica Booleana, uma condição % não pode ser verdadeira e falsa ao mesmo tempo.

% Este absurdo nos leva a concluir que a premissa inicial

% "rede_esta_treinada" admitimos ser verdadeira, não o era, sendo % portanto falsa. E dado que a condição "rede_esta_treinada" é % falsa deve-se iniciar um novo ciclo de treinamento.

%% while ~(rede_esta_treinada || Acabou_periodo_treinamento) eta=1/(epoca*2+1); energia_acumulada_erros=0; erro_acumulado=0; for i=1:qtdAmostrasDeTreinamento %% processo: calcula neuronio

% calcula o "campo local induzido - v" pela entrada v=w*x(:,i);

% calcula a saida da rede utilizando função de ativação do tipo

% limiar de ativação y=feval(funcaoAvaliacao,v,0,-1,1);

%% Processo: Treina do neuronio: Modelo de treinamento: Perceptron - regra delta

% Se a saida obtida (y) for diferente da desejada (d) % 1 - Concluimos que rede não está treinada e indicamos esta condição % 2 - ajusta os pesos if y~=d(i) % calcula erro erro = d(i) - v; erro_acumulado=erro_acumulado+erro; energia_erro = erro*erro/2; energia_acumulada_erros = energia_acumulada_erros + energia_erro;

w= w + eta*erro_acumulado*x(:,i)';
disp ( sprintf('erro: %5.0f', erro));

% Ajusta pesos end end disp ( sprintf(' energia_erro..%5.0f', energia_erro) ); rede_esta_treinada = ((energia_acumulada_erros/qtdAmostrasDeTreinamento)<maxima_energia_erro_t oleravel); epoca=epoca+1;

Acabou_periodo_treinamento=(epoca>tempo_treinamento); end

%% avaliar resultado do treinamento acertos=0; erros=0; for i=(qtdPontos-qtdAmostrasValidacao+1):qtdPontos %% processo: neuronio

% calcula o campo local induzido amostras(u) e o bias(b) por esta amostra v=w*x(:,i);

% calcula a saida da rede utilizando função de ativação do tipo limiar de ativação y=feval(funcaoAvaliacao,v,0,-1,1);

(Parte 1 de 2)

Comentários