Preview only show first 10 pages with watermark. For full document please download

Programa Fonte Em Matlab Redes Neurais Adaline

Programa Fonte em MatLab Redes Neurais Adaline, utilizando uma Função Limiar

   EMBED


Share

Transcript

%% clean-up inicialização close all clear all % clc percentualAmostrasValidacao=50/100; funcaoAvaliacao='limiar'; tempo_treinamento = 10000; % quantidade maxima de épocas de treinamento epoca=1; % treinamento inicia na época 1 %% 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 Romanos % e todas, talvez com poucas excessões de fato levavam a Roma. % % 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); %% clean-up pre-treinamento % distribui universo de amostras entre valicação e treinamento qtdAmostrasValidacao = floor(qtdPontos*percentualAmostrasValidacao); qtdAmostrasDeTreinamento = qtdPontos-qtdAmostrasValidacao; % % arbitra um taxa de aprendizagem maxima_energia_erro_toleravel=1/2; w=w_inicial; pesos rede_esta_treinada= false; sinalizadora de que a rede está treinada Acabou_periodo_treinamento = false; time-out % inicializa vetor de % inicializa condição % inicializa condição de %% 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; % Ajusta pesos w = w + eta*erro_acumulado*x(:,i)'; end end disp ( sprintf('erro.........: %5.0f', erro)); disp ( sprintf(' energia_erro..%5.0f', energia_erro) ); rede_esta_treinada = ((energia_acumulada_erros/qtdAmostrasDeTreinamento)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); %% Processo: Treinamento do neuronio: Modelo de treinamento: Perceptron % Se a saida obtida (y) for igual a desejada incrementa % senão incrementa erros if y == d(i) acertos=acertos+1; else erros=erros+1; end end %% Estatisticas do treinamento acertos disp ('-----Rede Perceptrom - Pesos Iniciais: "Randomicos"-----'); disp ( sprintf('Qtd. Amostras..................: %5.0f', qtdPontos) ); disp ( sprintf('Qtd. AmostrasValidacao.........: %5.0f', qtdAmostrasValidacao ) ); disp ( sprintf('Qtd. Amostras de Treinamento...: %5.0f', qtdAmostrasDeTreinamento ) ); disp ( sprintf('Convergencia em................: %5.0f épocas\n', epoca ) ); disp ('pesos iniciais:'); disp (w_inicial); disp ('pesos finais:'); disp (w); disp (sprintf('Acertos: %3.2f \nErros: %3.2f \nPercentual de Acertos: %3.2f%%\n\n', acertos,erros, 100*acertos/(acertos+erros) ));