Prévia do material em texto
LISTA DE EXERCICIOS 03 Perceptron Projeto Prático Enviar para ica@dee.ufc.br Assunto: Lista de Exercícios 03 André Luiz Ignácio de Almeida Filho - 485304 Faça o “Projeto Prático”, página 70, seção 3.6 do texto RNA para Eng., Ivan N da Silva, cap3, Perceptron.pdf disponível no SIGAA. O Apêndice I está disponível no SIGAA. Enviar em anexo: 1. As respostas ao Projeto prático 1) Execute cinco treinamentos para a rede Perceptron, iniciando-se o vetor de pesos {w} em cada treinamento com valores aleatórios entre zero e um. Se for o caso, reinicie o gerador de números aleatórios em cada treina- mento de tal forma que os elementos do vetor de pesos iniciais não sejam os mesmos. O conjunto de treinamento encontra-se no apêndice I mailto:ica@dee.ufc.br 2) Registre os resultados dos cinco treinamentos na tabela 3.2 apresen- tada a seguir. Tabela 3.2 – Resultados dos treinamentos do Perceptron Treinamento Vetor de pesos iniciais Vetor de pesos finais Número de épocas w 0 w 1 w 2 w 3 w 0 w 1 w 2 w 3 T1 0.4016 0.4429 0.4400 0.0817 1.6616 1.4676 2.1572 -0.7337 161 T2 0.5278 0.4484 0.1016 0.9047 1.9078 1.3516 1.9892 -0.6799 160 T3 0.7506 0.2206 0.0162 0.2437 2.0406 1.2912 1.9018 -0.6501 155 T4 0.1111 0.0192 0.6143 0.0954 1.5311 1.5286 2.2354 -0.7623 158 T5 0.4376 0.0287 0.7302 0.8884 1.8076 1.3908 2.066 -0.7016 142 3) Após o treinamento do Perceptron, coloque este em operação, apli- cando-o na classificação automática das amostras de óleo da tabela 3.3, indi- cando ainda nesta tabela aqueles resultados das saídas (Classes) referentes aos cinco processos de treinamento realizados no item 1. Tabela 3.3 – Amostras de óleo para validar a rede Perceptron Amostra x 1 x 2 x 3 y (T1) y (T2) y (T3) y (T4) y (T5) 1 -0,3665 0,0620 5,9891 -1 -1 -1 -1 -1 2 -0,7842 1,1267 5,5912 +1 +1 +1 +1 +1 3 0,3012 0,5611 5,8234 +1 +1 +1 +1 +1 4 0,7757 1,0648 8,0677 +1 +1 +1 +1 +1 5 0,1570 0,8028 6,3040 +1 +1 +1 +1 +1 6 -0,7014 1,0316 3,6005 +1 +1 +1 +1 +1 7 0,3748 0,1536 6,1537 -1 -1 -1 -1 -1 8 -0,6920 0,9404 4,4058 +1 +1 +1 +1 +1 9 -1,3970 0,7141 4,9263 -1 -1 -1 -1 -1 10 -1,8842 -0,2805 1,2548 +1 +1 +1 +1 +1 Universidade Federal do Ceará Centro de Tecnologia Departamento de Engenharia Elétrica Disciplina: Inteligência Computacional Aplicada 4) Explique por que o número de épocas de treinamento, em relação a esta aplicação, varia a cada vez que executamos o treinamento do Perceptron. Já que a geração dos pesos é feita de maneira aleatória, o número de épocas varia a partir deles. Dependendo dos pesos gerados, ele pode levar mais ou menos iterações para convergir, os pesos sempre convergem para valores semelhantes. 5) Para a aplicação em questão, discorra se é possível afirmar se as suas classes são linearmente separáveis. Levando em conta que para o treinamento da rede perceptron utilizado, só é possível treinar a rede para fronteiras lineares, ou seja, para classes linearmente separáveis, como foi possível treiná-la, podemos concluir que é linearmente separável. 2 Programa de computação utilizado clc, clear all, close all data = xlsread('Tabela#Seção3.6_RNA.xls'); x1 = data(:,1); x2 = data(:,2); x3 = data(:,3); x0 = -1*ones(30,1); x = [x0 x1 x2 x3] d = data(:,4); [padroes, entradas] = size(x); w = rand(entradas, 1); w_t = w.'; fprintf('Limiar e pesos iniciais'); disp(w); n = 0.01; epocas = 0; Universidade Federal do Ceará Centro de Tecnologia Departamento de Engenharia Elétrica Disciplina: Inteligência Computacional Aplicada erro = 0; while(erro == 0) erro = 1; for i = 1:amostras u = w_t*x(i,:).'; y = sinal(u); if y ~= d(i,:) w_t = w_t + n*(d(i,:) - y)*x(i,:); erro = 0; end end epocas = epocas + 1; end Utilizei também o de um colega para algumas etapas: import numpy as np import pandas as pd data = pd.read_excel('Tabela.xls') x = np.array([-np.ones(data.shape[0]),data['x1'],data['x2'],data['x3']]).T y = (np.array(data['d'])>0).astype(np.float64) alpha, max_iter = .01, 10000 def perceptron(x,y,alpha,w,it): for i in range(it): y_ = w@x.T > 0 erro = y - y_ w = w + alpha * erro @ x if np.all(erro==0): break return w, i validation_x = np.array([ [-1,-0.3665,0.0620,5.9891], Universidade Federal do Ceará Centro de Tecnologia Departamento de Engenharia Elétrica Disciplina: Inteligência Computacional Aplicada [-1,-0.7842,1.1267,5.5912], [-1,0.3012,0.5611,5.8234], [-1,0.7757,1.0648,8.0677], [-1,0.1570,0.8028,6.3040], [-1,-0.7014,1.0316,3.6005], [-1,0.3748,0.1536,6.1537], [-1,-0.6920,0.9404,4.4058], [-1,-1.3970,0.7141,4.9263], [-1,-1.8842,-0.2805,1.2548]]) tabela2 = validation_x[:,1:] for i in range(5): linha = np.array([]) w0 = np.random.random(x.shape[1]) w, it = perceptron(x,y,alpha,w0,max_iter) #print(f'Treinamento {i+1}') #print(f'w = {w}') #print(f'Valor desejado = {y.astype(np.int32)}') #print(f'Valor obtido = {(w@x.T>0).astype(np.int32)}') #print(f'Total de iterações = {it}') linha = np.concatenate([w0,w,[it]]) y_ = 2*(w@validation_x.T>0)-1 tabela1 = [linha] if i == 0 else np.concatenate([tabela1, linha.reshape(1,-1)], axis=0) tabela2 = np.concatenate([tabela2,(y_).reshape(-1, 1)], axis=1) df1 = pd.DataFrame(tabela1, index = [f'T{i+1}' for i in range(5)],columns = ['w0','w1','w2','w3','w0','w1','w2','w3','epocas']) df2 = pd.DataFrame(tabela2, index = [i+1 for i in range(10) ],columns = ['x1','x2','x3','y(T1)','y(T2)','y(T3)','y(T4)','y(T5)']) print(f'Tabela 1\n{df1}\n\n\nTabela 2\n{df2}')