Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
IA 2017 – TP3EVAL - #3 aprendizaje en un objeto tipo celda, en este caso llamado “entrada”. Y generamos la matriz ‘T’ de pesos adecuada para la red hopfield con los vectores de entrenamiento de la siguiente forma: %APRENDIZAJE DE LA RED NEURONAL v0 = [-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,- 1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,- 1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1]; v1 = [-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,- 1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,- 1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1]; v2 = [-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,- 1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,- 1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1]; v3 = [-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,- 1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,- 1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1]; v4 = [-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,- 1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,- 1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1]; v5 = [1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,- 1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,- 1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1]; v6 = [-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,- 1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,- 1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1]; v7 = [1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,- 1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,- 1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1]; v8 = [-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,- 1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,- 1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1]; v9 = [-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,- 1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,- 1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1]; entrada = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9};%Almacenamos los vectores patron en un objeto tipo celda 'entrada' %Generamos una matriz de pesos adecuada para la red de hopfield con los %vectores de entrenamiento %Definimos un matrix de ceros de 77x77 para almacenar los pesos T = [v0' v1' v2' v3' v4' v5' v6' v7' v8' v9']; Luego le a asignamos al a matriz ‘f’ la imagen del patron que se requiere reconocer, este patron es para comprobar el funcionamiento de la red. Los patrones estan almacenados en la direccion que se muestra en el codigo, para seleccionar uno se debe descomentar la parte correspondiente a la asignacion y asegurarse que la ruta concuerde. Como patrones para comprobar tenemos valores del 0 al 9 y para los valores del 1 al 6 colocamos 3 variantes de cada uno. %Imagenes, matrices y vectores %f =imread('D:\IA\TP3 EV\Patrones\1V1.jpeg');% NUMERO 1 PRIMER VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\1V2.jpg');% NUMERO 1 SEGUNDA VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\1V3.jpg');% NUMERO 1 TERCER VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\2V1.jpeg');% NUMERO 2 PRIMER VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\2V2.jpg');% NUMERO 2 SEGUNDA VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\2V3.jpg');% NUMERO 2 TERCER VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\3V1.jpeg');%NUMERO 3 PRIMER VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\3V2.jpg');%NUMERO 3 SEGUNDA VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\3V3.jpg');%NUMERO 3 TERCER VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\4V1.jpeg');%NUMERO 4 PRIMER VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\4V2.jpg');%NUMERO 4 SEGUNDA VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\4V3.jpg');%NUMERO 4 TERCER VARIANTE IA 2017 – TP3EVAL - #4 %f =imread('D:\IA\TP3 EV\Patrones\5V1.jpeg');%NUMERO 5 PRIMER VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\5V2.jpg');%NUMERO 5 SEGUNDA VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\5V3.jpg');%NUMERO 5 TERCER VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\6V1.jpeg');%NUMERO 6 PRIMER VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\6V2.jpg');%NUMERO 6 SEGUNDA VARIANTE %f =imread('D:\IA\TP3 EV\Patrones\6V3.jpg');%NUMERO 6 TERCER VARIANTE Una vez elegido el patrón de prueba a reconocer debemos transformarlo en una imagen binaria, para hacer esto necesitamos elegir un umbral que permita distinguir las clases entre pixeles blancos y negros y así convertirla en imagen binaria. M=graythresh(f);%Elige el umbral para minimizar la varianza intraclase de los píxeles en blanco y negro. fbinaria=im2bw(f,M);%Convierte la imagen en escala de grises "f" en una imagen binaria Transformamos la matriz binaria de 7x11 en un vector de 1x77; y luego cambiamos los 0 por 1, y los 1 por -1 para analizar el patrón de prueba utilizando la función signo %Transformamos la matriz binaria en un vector de 1x77 I = []; for i = 1:1:size(fbinaria, 1) I = horzcat(I, fbinaria(i,:)); end; %cambiamos los 0 en 1, y los 1 en -1, para %poder analizar el patron de prueba haciendo uso de la función signo. for i=1:77 if I(i)==0 I(i)=1 else I(i)=-1 end end Creamos la red, asignamos el patrón de prueba y simulamos la Red net = newhop(T); %Creación de la Red Neuronal de Hopfield vp = I; % Introducimos el patrón de prueba salida = 0; %para iterar en el bucle while prueba = sim(net,1,[],vp'); %Simulación de la Red de Hopfield iteraciones = 0; IA 2017 – TP3EVAL - #5 Luego comparamos el patrón de prueba con los patrones aprendidos para así poder asociárselo correctamente Si no hay ninguno con el que pueda asociarse se dice que la red no converge while ((salida == 0) || (iteraciones == 77))%Itera mientras los vectores son diferentes iteraciones = iteraciones + 1;%número de iteraciones en las que se determina el patrón obtenido prueba1 = sim(net,1,[],prueba); if isequal(prueba1,prueba)%Compara si ambas son iguales salida = 1;%Si son iguales termina de iterar else prueba = prueba1;%Si son diferentes le asigno prueba1 al patron de prueba end end if iteraciones > 77 fprintf('La red no converge'); end for i = 1:1:10 %Este bucle es para saber que puntos de prueba coinciden con ciertos puntos de aprendizaje if isequal(entrada{i},prueba')%Compara el patron de prueba con los patrones de entrada, para luego mostrar a cual se asemeja más fprintf ('Patron encontrado: %d \n', i-1); IT2 = prueba'; %resulta conveniente transformar los "-1" %en 0 y por ello que utilizamos el siguiente bucle "for" for i=1:77 if IT2(i)==-1 IT2(i)=0; end end %Con el siguiente bucle "for", transformo el vector en matriz, y con %ello muestra la matriz que identifica univocamente al patron %encontrado for i=1:7 x(1,i)=IT2(i); x(2,i)=IT2(i+7); x(3,i)=IT2(i+14); x(4,i)=IT2(i+21); x(5,i)=IT2(i+28); x(6,i)=IT2(i+35); x(7,i)=IT2(i+42); x(8,i)=IT2(i+49); x(9,i)=IT2(i+56); x(10,i)=IT2(i+63); x(11,i)=IT2(i+70); end disp(x); %Muestro la matriz formada fprintf('\nNumero de iteraciones: %d \n', iteraciones); %esta línea muestra el número de iteraciones realizadas hasta %que se logra encontrar el patrón más próximo al patrón de prueba end endIA 2017 – TP3EVAL - #6 Los resultados de las pruebas son los siguientes: PATRON 1 Primer Variante f =imread('D:\IA\TP3 EV\Patrones\1V1.jpeg');% NUMERO 1 PRIMER VARIANTE En 3 iteraciones logro el resultado esperado lo clasifico como el valor 1 Segunda Variante f =imread('D:\IA\TP3 EV\Patrones\1V2.jpg');% NUMERO 1 SEGUNDA VARIANTE IA 2017 – TP3EVAL - #7 Tambien llego al resultado deseado en 8 iteraciones. Clasifico correctamente como valor 1 Tercer Variante f =imread('D:\IA\TP3 EV\Patrones\1V3.jpg');% NUMERO 1 TERCER VARIANTE IA 2017 – TP3EVAL - #8 En 11 iteraciones llego al resultado correcto el patron 1. PATRON 2 Primer Variante f =imread('D:\IA\TP3 EV\Patrones\2V1.jpeg');% NUMERO 2 PRIMER VARIANTE IA 2017 – TP3EVAL - #9 En 10 iteraciones llega el resultado 2 que es el correcto Segunda Variante f =imread('D:\IA\TP3 EV\Patrones\2V2.jpg');% NUMERO 2 SEGUNDA VARIANTE No llego al resultado correcto no encontró el patrón. Tercer Variante f =imread('D:\IA\TP3 EV\Patrones\2V3.jpg');% NUMERO 2 TERCER VARIANTE IA 2017 – TP3EVAL - #10 Llego al patron 2 que es el correcto en 12 iteraciones PATRON 3 Primer Variante f =imread('D:\IA\TP3 EV\Patrones\3V1.jpeg');%NUMERO 3 PRIMER VARIANTE IA 2017 – TP3EVAL - #11 En 12 iteraciones llego a un resultado incorrecto, lo clasifico como 2. Segunda Variante f =imread('D:\IA\TP3 EV\Patrones\3V2.jpg');%NUMERO 3 SEGUNDA VARIANTE IA 2017 – TP3EVAL - #12 En 10 iteraciones produjo un resultado incorrecto. Lo clasifico como 5 Tercer Variante f =imread('D:\IA\TP3 EV\Patrones\3V3.jpg');%NUMERO 3 TERCER VARIANTE En 21 iteraciones tambien clasifico incorrectamente como 5. PATRON 4 Primer Variante f =imread('D:\IA\TP3 EV\Patrones\4V1.jpeg');%NUMERO 4 PRIMER VARIANTE IA 2017 – TP3EVAL - #13 Encontro el resultado correcto en 5 iteraciones Segunda Variante f =imread('D:\IA\TP3 EV\Patrones\4V2.jpg');%NUMERO 4 SEGUNDA VARIANTE En 21 iteraciones alcanzo el valor correcto IA 2017 – TP3EVAL - #14 Tercer Variante f =imread('D:\IA\TP3 EV\Patrones\4V3.jpg');%NUMERO 4 TERCER VARIANTE En 24 iteraciones llega al valor correcto PATRON 5 Primer Variante f =imread('D:\IA\TP3 EV\Patrones\5V1.jpeg');%NUMERO 5 PRIMER VARIANTE IA 2017 – TP3EVAL - #15 En 13 iteraciones llega al patron 5 Segunda Variante f =imread('D:\IA\TP3 EV\Patrones\5V2.jpg');%NUMERO 5 SEGUNDA VARIANTE En 20 iteraciones llega al resultado deseado IA 2017 – TP3EVAL - #16 Tercer Variante f =imread('D:\IA\TP3 EV\Patrones\5V3.jpg');%NUMERO 5 TERCER VARIANTE En 27 iteraciones llega al resultado PATRON 6 Primer Variante f =imread('D:\IA\TP3 EV\Patrones\6V1.jpeg');%NUMERO 6 PRIMER VARIANTE IA 2017 – TP3EVAL - #17 Lo clasifico erroneamente como 0 Segunda Variante f =imread('D:\IA\TP3 EV\Patrones\6V2.jpg');%NUMERO 6 SEGUNDA VARIANTE IA 2017 – TP3EVAL - #18 En 33 iteraciones lo clasifico como un 6 Tercer Variante f =imread('D:\IA\TP3 EV\Patrones\6V3.jpg');%NUMERO 6 TERCER VARIANTE No llego a clasificarlo correctamente Conclusiones: A partir de los resultados que la red presente un funcionamiento aceptable ya que encontró la solución a la mayoría de los patrones, algunos de estos fueron dibujados con una mayor dificultad para comprobar el funcionamiento de la red ante patrones distintos a los aprendidos sin embargo hay patrones en los que fallo la convergencia o que dio un resultado que era incorrecto, entre ellos son la segunda variante del patrón 2, todas las variantes del patrón 3 y la primer y tercer variante del patrón 6 . Como remarcamos anteriormente las variantes de los patrones fueron diseñadas con formas confusas, algunas con líneas rectas otras sin ninguna línea recta y hasta algunas imperfecciones y rotaciones para poder probar el potencial de la red. La mayoría de las pruebas fueron satisfactorias por lo que podemos concluir que si a la red le brindamos patrones en término medio de imperfecciones esta va a poder reconocerlos correctamente IA 2017 – TP3EVAL - #19 2. Red RBF (2 puntos). La red RBF de la figura (a) se va a utilizar como herramienta de agrupamiento (clustering). Se implementará con un entrenamiento híbrido. Figura (a) Figura (b) Estimar desde la figura (b) los datos correspondientes a los centros y aperturas para el entrenamiento no supervisado de las funciones de las neuronas ocultas. Para el entrenamiento supervisado se deben utilizar los puntos mostrados en la figura (b) para cada clase (C1, C2 y C3). En la fase de operación, comprobar los resultados utilizando tres puntos para cada clase, ubicados solamente sobre las intersecciones de la cuadrícula y que no sean los utilizados en el entrenamiento. Cada terna de puntos de comprobación, debe ser: uno ubicado cerca del centro de la clase; otro ubicado cerca de la periferia del agrupamiento, pero dentro de la clase; y el tercero fuera de cualquiera de las clases. DESARROLLO Primero tomamos las coordenadas de los centros de las clases de la figura y le asociamos su correspondiente salida %%%PUNTO 2%%%% %datos de entrada y salida ent = [2 2 6 6; 6 2 6 2]; %coordenadaas x y %clase a la que pertenece sal = [2 1 1 3]; Luego creamos la red a través del GUI de redes neuronales %creacion de la red con la gui nntool IA 2017 – TP3EVAL - #20 Una vez creados los datos en el espacio de trabajos los importamos para usar en la red: IA 2017 – TP3EVAL - #21 Al momento de crear la red seleccionamos la correcta la cual está marcada esta es la red RBF hibrida. IA 2017 – TP3EVAL - #22 Luego debemos elegir el valor de delta nosotros propusimos el valor 1.5 porque creemos que es el más adecuado al problema IA 2017 – TP3EVAL - #23 Luego solo queda exportar la red al espacio de trabajo y usarla y comprobar su funcionamiento PRUEBA CLASE 2 IA 2017 – TP3EVAL - #24 CLASE 1 CLASE 3 IA 2017 – TP3EVAL - #25 3. Red feedforward-backpropagation (5 puntos). Considerar la secuencia de una tormenta producida en la cuenca del río Elorrio (España) y el caudal que se genera en este río (archivo TORMENTAS ELORRIO.xlx), con mediciones cada 10 min. Diseñar una red FF-BP, para trabajar como un predictor de caudales, bajo las siguientes consideraciones: Diseñar dos redes FF-BP con una entrada (lluvia) y una salida (caudal). Estimar la cantidad de neuronas ocultas requeridas. Las funciones de activación ocultas pueden ser sigmoides bivaluadas. La función de activación de salida debe ser lineal. Utilizar el 80% de los datos para el entrenamiento, con predicción de un paso adelantado (10 min) para la primera red FF-BP y seis pasos adelantados (1 hora) para la segunda red FF-BP. Con los datos restantes, comprobar el proceso de predicción utilizando el error cuadrático medio, para ambas redes (por separado). Repetir el proceso anterior, pero agregando seis ventanas de tiempo diferido a cada red FF-BP. Nuevamente comprobar el proceso de predicción mediante el error cuadrático medio. Generar conclusiones respecto de los resultados obtenidos. DESARROLLO Para empezar vamos a preparar los datos, extrayendo los datos de entradas y de salidas para luego importar en espacio de trabajo. También distinguimos los datos de la red 1 de un paso y los datos que tendrán la red 2 de seis pasos: 1 Paso: IA 2017 – TP3EVAL - #26 6 pasos: Ahora importamos los datos que vamos a usar en las redes: Caudal 1 paso: IA 2017 – TP3EVAL - #27 Lluvia1 paso: Caudal 6 pasos: IA 2017 – TP3EVAL - #28 Lluvia 6 pasos: Luego guardamos estas estructuras para luego simplemente cargarlas mediante el comando ‘load’ cuando realicemos las redes. RED 1 PASO Cargamos, invertimos y renombramos las matrices importadas para que puedean usarse para el entrenamiento y prueba de la red 1 paso: %%% Cargamos y preparamos los datos para poder usarlos para entrenamiento y prueba load('lluvia1paso.mat'); load('caudal1paso.mat'); entradaLluvia1Paso = lluvia1paso'; salidaCaudal1Paso = caudal1paso'; Luego de tener los datos que vamos a usar comenzamos a ajustar los parámetros que va a utilizar la red “Red1Paso”. Los datos que vamos a definir de entrada y salida del todo el conjunto se preparan de la siguiente forma: %%Con este parametro cambiamos la ventana N = 1; %%% Comenzamos con la red1 entradaRed1Paso = entradaLluvia1Paso(1:end - N); salidaRed1Paso = salidaCaudal1Paso(1:end - N); %%% Estos dos datos son la entrada y salida para el entrenamiento de la red %%% Ahora creamos los datos para prediccion y pruebas entradaRed1PasoTest = entradaLluvia1Paso(end - N + 1:end); salidaRed1PasoTest = salidaCaudal1Paso(end - N + 1:end); IA 2017 – TP3EVAL - #29 Como función de activación usamos la de defecto que es ‘trainlm’. El número de neuronas que utilizamos es 30 ya que es el que mejor resultados nos dio. Un número pequeño de neuronas provoca que el error sea demasiado grande y si usamos demasiadas vamos a perder el poder de generalización de la red. %Seleccionamos la funcion de entrenamiento por defecto trainFcn = 'trainlm'; %Estamos trabajando con una unica ventana delay = N; %Colocamos el numero de neuronas a usar en la capa oculta neuronsHiddenLayer = 30; Ahora creamos la red ‘Red1Paso’ y modificamos sus parámetros. Las funciones de activación que debemos usar indicadas en la consigna son sigmoidal bivaluada para la capa oculta y lineal para la capa de salida. La definimos a continuación: %Creamos la red neuronal Red1Paso = timedelaynet(1:N, neuronsHiddenLayer, trainFcn); %Verificamos las funciones de activacion de la capa oculta y salida %Modificando por la funcion deseada Red1Paso.layers{1}.transferFcn = 'tansig'; Red1Paso.layers{2}.transferFcn = 'purelin'; Se pide en este punto que usemos un 80% de los datos para entrenamiento y un 20% para prueba en las siguientes líneas preparamos los datos para la red en esa distribución, además definimos que la distribución de los datos de entrenamiento y prueba es en forma aleatoria por lo que en cada ejecución se obtendrán distintos conjuntos de datos y por lo tanto distintos resultados: %Preparamos de los datos de entrenamiento y test [Xs, Xi, Ai, Ts] = preparets(Red1Paso, entradaRed1Paso, salidaRed1Paso); %Realizamos la distribucion de los datos en 80 entrenamiento y 20 test Red1Paso.divideParam.trainRatio = 80/100; Red1Paso.divideParam.valRatio = 20/100; Red1Paso.divideParam.testRatio = 0/100; %Luego dividimos los datos de forma aleatoria Red1Paso.divideFcn = 'dividerand'; %Dividimos cada valor Red1Paso.divideMode = 'time'; %Usamos como funcion de rendimiento el error cuadratico medio Red1Paso.performFcn = 'mse'; Con los datos preparados ya podemos comenzar a entrenar la red y mostrar su arquitectura: %Una vez definidos todos los parametros podemos comenzar a entrenar la red Red1Paso = train(Red1Paso, Xs, Ts, Xi, Ai); %El diagrama de la red se muestra a continuacion view(Red1Paso); IA 2017 – TP3EVAL - #30 El resultado del entrenamiento: IA 2017 – TP3EVAL - #31 Y la arquitectura de la red: Con la red entrenada y lista ya podemos hacerla funcionar y volcar sus resultados en una gráfica: %Realizamos las predicciones [Y, Xf, Af] = Red1Paso(Xs, Xi, Ai); [yPred, Xfp, Afp] = Red1Paso(entradaRed1PasoTest, Xf, Af); %Para comparar los resultados realizamos el grafico figure; originalSeries = salidaCaudal1Paso; predictionSeries = salidaCaudal1Paso; predictionSeries(end - N + 1:end) = yPred; %Representamos el grafico plot(1:length(salidaCaudal1Paso), cell2mat(predictionSeries), 'r', 1:length(salidaCaudal1Paso),cell2mat(originalSeries), 'b'); legend('Serie de Predicción', 'Serie Original', 'Location', 'SouthEast'); Grafico: IA 2017 – TP3EVAL - #32 Se puede ver como el valor generado por la red es mínimamente diferente al original por lo que tiene un error pequeño y concordamos que la red funciona a un muy buen nivel. Valor esperado: 4,00100000000000 Valor obtenido: 4,10031853653551 RED 6 PASOS Para la red de 6 pasos el procedimiento es el mismo salvo cambiar el nombre de la red a ‘Red6Pasos’ y los datos que usamos son los de 6 pasos adelantados por lo que la línea de código de los datos cambia por: %%% Cargamos y preparamos los datos para poder usarlos para entrenamiento y prueba load('lluvia6pasos.mat'); load('caudal6pasos.mat'); entradaLluvia6Pasos = lluvia6pasos'; salidaCaudal6Pasos = caudal6pasos'; El resto del código es igual al anterior. Misma cantidad de neuronas y mismas funciones. IA 2017 – TP3EVAL - #33 Entrenamiento de la red: IA 2017 – TP3EVAL - #34 Arquitectura de la red: Gráfico de resultados: Podemos apreciar del grafico que el resultado de esta no es tan buena como la de 1 paso, esto es debido que está calculando 6 pasos adelantados y además no se tienen tantos datos para entrenarse como en la red de un paso. Aun así el resultado es aceptable no se aleja demasiado del valor original Valor esperado: 4,21900000000000 Valor obtenido: 3,69245803194862 IA 2017 – TP3EVAL - #35 NOTA: AL FINAL DEL TRABAJO SE MOSTRARA EL CODIGO COMPLETO DE CADA RED ADEMAS DE INCLUIRLO EN LA CARPETA DEL TRABAJO AGREGACION DE 6 VENTANAS DE TIEMPO DIFERIDO RED 1 PASO El código para esta la red es el mismo mostrado para la red 1 paso, la diferencia estar en cambiar el valor de las ventanas de tiempo diferido en la siguiente línea: %%Con este parametro cambiamos la ventana N = 6; Todo el resto del código sigue siendo igual Entrenamiento de la red: IA 2017 – TP3EVAL - #36 Arquitectura de la red: Gráfico de resultados: IA 2017 – TP3EVAL - #37 Se puede apreciar que es considerablemente diferente a la red1 paso sin las 6 ventanas de tiempo diferido. En esta red se están prediciendo 6 valores debido a la ventana. Para los primeros valores el error de predicción es algo moderado pero este va disminuyendo hacia los últimos valores. Valores esperados: 4,34700000000000 4,32900000000000 4,21900000000000 4,14600000000000 4,05500000000000 4,00100000000000 Valores obtenidos: 3,90630036996537 3,90630036996537 3,90630036996537 3,90630036996537 3,90630036996537 3,90630036996537 NOTA: AL FINAL DEL TRABAJO SE MOSTRARA EL CODIGO COMPLETO DE CADA RED ADEMAS DE INCLUIRLO EN LA CARPETA DEL TRABAJO RED 6 PASOS Al igual que en el caso anterior el código es el mismo que de la red 6 pasos salvo cambiar el número de ventanas: %%Con este parametro cambiamos la ventana N = 6; Entrenamiento de la red: IA 2017 – TP3EVAL - #38 Arquitectura de la red: IA 2017 – TP3EVAL - #39 Gráfico de resultados: Los peores resultados los presenta esta red. Si bien en los últimos valores el error es menor sigue teniendo errores grandes en comparación de la anterior sin 6 ventanas, esto es debido al usar las 6 ventanas de tiempo diferido más una cantidad no muy grande de ejemplos de entrenamiento. Valores esperados: 7,44600000000000 7,08100000000000 6,54700000000000 5,75500000000000 4,93600000000000 4,21900000000000 Valores obtenidos: 20,0388654109711 11,9727776995465 4,30957125945115 4,62283173198718 7,58213354628093 4,88491418533692NOTA: AL FINAL DEL TRABAJO SE MOSTRARA EL CODIGO COMPLETO DE CADA RED ADEMAS DE INCLUIRLO EN LA CARPETA DEL TRABAJO IA 2017 – TP3EVAL - #40 Conclusiones RESULTADOS Red Serie Original Resultado 1 ventana Resultado 6 ventanas tiempo diferido Red 1 paso 4,34700000000000 - 3,90630036996537 4,32900000000000 - 3,90630036996537 4,21900000000000 - 3,90630036996537 4,14600000000000 - 3,90630036996537 4,05500000000000 - 3,90630036996537 4,00100000000000 4,10031853653551 3,90630036996537 ECM - 4.93 -03 0.08 Red 6 pasos 7,44600000000000 - 20,0388654109711 7,08100000000000 - 11,9727776995465 6,54700000000000 - 4,30957125945115 5,75500000000000 - 4,62283173198718 4,93600000000000 - 7,58213354628093 4,21900000000000 3,69245803194862 4,88491418533692 ECM - 0.14 32,707 Observando los resultados se puede concluir que los mejores resultados las obtuvieron las redes de 1 paso. Tanto con una ventana de 6 tiempos diferidos como sin ella. Entre estas dos el mejor resultado es el de una única ventana. La red de 6 pasos si ventana diferida presenta un error no tan grave considerado que el espacio de muestras de ejemplos es más reducido que para la red anterior. El peor error lo tiene la red de 6 pasos con las 6 ventanas de tiempo diferido esto es debido a que a las ventanas se le suma la pequeña cantidad de datos de entrenamiento lo que hace más difícil llegar a un buen entrenamiento de la red lo que produce poco poder de predicción. IA 2017 – TP3EVAL - #41 Código Red 1 paso sin ventana %%% TP3 PUNTO 3 RED 1 PASO%%% %%% Cargamos y preparamos los datos para poder usarlos para entrenamiento y prueba load('lluvia1paso.mat'); load('caudal1paso.mat'); entradaLluvia1Paso = lluvia1paso'; salidaCaudal1Paso = caudal1paso'; %%Con este parametro cambiamos la ventana N = 1; %%% Comenzamos con la red1 entradaRed1Paso = entradaLluvia1Paso(1:end - N); salidaRed1Paso = salidaCaudal1Paso(1:end - N); %%% Estos dos datos son la entrada y salida para el entrenamiento de la red %%% Ahora creamos los datos para prediccion y pruebas entradaRed1PasoTest = entradaLluvia1Paso(end - N + 1:end); salidaRed1PasoTest = salidaCaudal1Paso(end - N + 1:end); %Seleccionamos la funcion de entrenamiento por defecto trainFcn = 'trainlm'; %Estamos trabajando con una unica ventana delay = N; %Colocamos el numero de neuronas a usar en la capa oculta neuronsHiddenLayer = 30; %Creamos la red neuronal Red1Paso = timedelaynet(1:N, neuronsHiddenLayer, trainFcn); %Verificamos las funciones de activacion de la capa oculta y salida %Modificando por la funcion deseada Red1Paso.layers{1}.transferFcn = 'tansig'; Red1Paso.layers{2}.transferFcn = 'purelin'; %Preparamos de los datos de entrenamiento y test [Xs, Xi, Ai, Ts] = preparets(Red1Paso, entradaRed1Paso, salidaRed1Paso); %Realizamos la distribucion de los datos en 80 entrenamiento y 20 test Red1Paso.divideParam.trainRatio = 80/100; Red1Paso.divideParam.valRatio = 20/100; Red1Paso.divideParam.testRatio = 0/100; %Luego dividimos los datos de forma aleatoria Red1Paso.divideFcn = 'dividerand'; %Dividimos cada valor Red1Paso.divideMode = 'time'; %Usamos como funcion de rendimiento el error cuadratico medio Red1Paso.performFcn = 'mse'; %Una vez definidos todos los parametros podemos comenzar a entrenar la red Red1Paso = train(Red1Paso, Xs, Ts, Xi, Ai); %El diagrama de la red se muestra a continuacion view(Red1Paso); %Realizamos las predicciones [Y, Xf, Af] = Red1Paso(Xs, Xi, Ai); [yPred, Xfp, Afp] = Red1Paso(entradaRed1PasoTest, Xf, Af); %Para comparar los resultados realizamos el grafico IA 2017 – TP3EVAL - #42 figure; originalSeries = salidaCaudal1Paso; predictionSeries = salidaCaudal1Paso; predictionSeries(end - N + 1:end) = yPred; %Representamos el grafico plot(1:length(salidaCaudal1Paso), cell2mat(predictionSeries), 'r', 1:length(salidaCaudal1Paso),cell2mat(originalSeries), 'b'); legend('Serie de Predicción', 'Serie Original', 'Location', 'SouthEast'); Codigo Red 1 paso 6 ventanas tiempo diferido %%% TP3 PUNTO 3 RED 1 PASO / 6 VENTANAS%%% %%% Cargamos y preparamos los datos para poder usarlos para entrenamiento y prueba load('lluvia1paso.mat'); load('caudal1paso.mat'); entradaLluvia1Paso = lluvia1paso'; salidaCaudal1Paso = caudal1paso'; %%Con este parametro cambiamos la ventana N = 6; %%% Comenzamos con la red 1 entradaRed1Paso = entradaLluvia1Paso(1:end - N); salidaRed1Paso = salidaCaudal1Paso(1:end - N); %%% Estos dos datos son la entrada y salida para el entrenamiento de la red %%% Ahora creamos los datos para prediccion y pruebas entradaRed1PasoTest = entradaLluvia1Paso(end - N + 1:end); salidaRed1PasoTest = salidaCaudal1Paso(end - N + 1:end); %Seleccionamos la funcion de entrenamiento por defecto trainFcn = 'trainlm'; %Estamos trabajando con una unica ventana delay = N; %Colocamos el numero de neuronas a usar en la capa oculta neuronsHiddenLayer = 30; %Creamos la red neuronal Red1Paso = timedelaynet(1:N, neuronsHiddenLayer, trainFcn); %Verificamos las funciones de activacion de la capa oculta y salida %Modificando por la funcion deseada Red1Paso.layers{1}.transferFcn = 'tansig'; Red1Paso.layers{2}.transferFcn = 'purelin'; %Preparamos de los datos de entrenamiento y test [Xs, Xi, Ai, Ts] = preparets(Red1Paso, entradaRed1Paso, salidaRed1Paso); %Realizamos la distribucion de los datos en 80 entrenamiento y 20 test Red1Paso.divideParam.trainRatio = 80/100; Red1Paso.divideParam.valRatio = 20/100; Red1Paso.divideParam.testRatio = 0/100; %Luego dividimos los datos de forma aleatoria Red1Paso.divideFcn = 'dividerand'; %Dividimos cada valor Red1Paso.divideMode = 'time'; IA 2017 – TP3EVAL - #43 %Usamos como funcion de rendimiento el error cuadratico medio Red1Paso.performFcn = 'mse'; %Una vez definidos todos los parametros podemos comenzar a entrenar la red Red1Paso = train(Red1Paso, Xs, Ts, Xi, Ai); %El diagrama de la red se muestra a continuacion view(Red1Paso); %Realizamos las predicciones [Y, Xf, Af] = Red1Paso(Xs, Xi, Ai); [yPred, Xfp, Afp] = Red1Paso(entradaRed1PasoTest, Xf, Af); %Para comparar los resultados realizamos el grafico figure; originalSeries = salidaCaudal1Paso; predictionSeries = salidaCaudal1Paso; predictionSeries(end - N + 1:end) = yPred; %Representamos el grafico plot(1:length(salidaCaudal1Paso), cell2mat(predictionSeries), 'r', 1:length(salidaCaudal1Paso),cell2mat(originalSeries), 'b'); legend('Serie de Predicción', 'Serie Original', 'Location', 'SouthEast'); Codigo Red 6 pasos sin ventana %%% TP3 PUNTO 3 RED 6 PASOS %%% %%% Cargamos y preparamos los datos para poder usarlos para entrenamiento y prueba load('lluvia6pasos.mat'); load('caudal6pasos.mat'); entradaLluvia6Pasos = lluvia6pasos'; salidaCaudal6Pasos = caudal6pasos'; %%Con este parametro cambiamos la ventana N = 1; %%% Comenzamos con la red 1 entradaRed6Pasos = entradaLluvia6Pasos(1:end - N); salidaRed6Pasos = salidaCaudal6Pasos(1:end - N); %%% Estos dos datos son la entrada y salida para el entrenamiento de la red %%% Ahora creamos los datos para prediccion y pruebas entradaRed6PasosTest = entradaLluvia6Pasos(end - N + 1:end); salidaRed6PasosTest = salidaCaudal6Pasos(end - N + 1:end); %Seleccionamos la funcion de entrenamiento por defecto trainFcn = 'trainlm'; %Estamos trabajando con una unica ventana delay = N; %Colocamos el numero de neuronas a usar en la capa oculta neuronsHiddenLayer = 30; %Creamos la red neuronal IA 2017 – TP3EVAL - #44 Red6Pasos = timedelaynet(1:N, neuronsHiddenLayer, trainFcn); %Verificamos las funciones de activacion de la capa oculta y salida %Modificando por la funcion deseada Red6Pasos.layers{1}.transferFcn = 'tansig'; Red6Pasos.layers{2}.transferFcn = 'purelin'; %Preparamos de los datos de entrenamiento y test [Xs,Xi, Ai, Ts] = preparets(Red6Pasos, entradaRed6Pasos, salidaRed6Pasos); %Realizamos la distribucion de los datos en 80 entrenamiento y 20 test Red6Pasos.divideParam.trainRatio = 80/100; Red6Pasos.divideParam.valRatio = 20/100; Red6Pasos.divideParam.testRatio = 0/100; %Luego dividimos los datos de forma aleatoria Red6Pasos.divideFcn = 'dividerand'; %Dividimos cada valor Red6Pasos.divideMode = 'time'; %Usamos como funcion de rendimiento el error cuadratico medio Red6Pasos.performFcn = 'mse'; %Una vez definidos todos los parametros podemos comenzar a entrenar la red Red6Pasos = train(Red6Pasos, Xs, Ts, Xi, Ai); %El diagrama de la red se muestra a continuacion view(Red6Pasos); %Realizamos las predicciones [Y, Xf, Af] = Red6Pasos(Xs, Xi, Ai); [yPred, Xfp, Afp] = Red6Pasos(entradaRed6PasosTest, Xf, Af); %Para comparar los resultados realizamos el grafico figure; originalSeries = salidaCaudal6Pasos; predictionSeries = salidaCaudal6Pasos; predictionSeries(end - N + 1:end) = yPred; %Representamos el grafico plot(1:length(salidaCaudal6Pasos), cell2mat(predictionSeries), 'r', 1:length(salidaCaudal6Pasos),cell2mat(originalSeries), 'b'); legend('Serie de Predicción', 'Serie Original', 'Location', 'SouthEast'); Codigo Red 6 pasos 6 ventanas %%% TP3 PUNTO 3 RED 6 PASOS / 6 VENTANAS %%% %%% Cargamos y preparamos los datos para poder usarlos para entrenamiento y prueba load('lluvia6pasos.mat'); load('caudal6pasos.mat'); entradaLluvia6Pasos = lluvia6pasos'; salidaCaudal6Pasos = caudal6pasos'; %%Con este parametro cambiamos la ventana N = 6; %%% Comenzamos con la red 1 entradaRed6Pasos = entradaLluvia6Pasos(1:end - N); IA 2017 – TP3EVAL - #45 salidaRed6Pasos = salidaCaudal6Pasos(1:end - N); %%% Estos dos datos son la entrada y salida para el entrenamiento de la red %%% Ahora creamos los datos para prediccion y pruebas entradaRed6PasosTest = entradaLluvia6Pasos(end - N + 1:end); salidaRed6PasosTest = salidaCaudal6Pasos(end - N + 1:end); %Seleccionamos la funcion de entrenamiento por defecto trainFcn = 'trainlm'; %Estamos trabajando con una unica ventana delay = N; %Colocamos el numero de neuronas a usar en la capa oculta neuronsHiddenLayer = 30; %Creamos la red neuronal Red6Pasos = timedelaynet(1:N, neuronsHiddenLayer, trainFcn); %Verificamos las funciones de activacion de la capa oculta y salida %Modificando por la funcion deseada Red6Pasos.layers{1}.transferFcn = 'tansig'; Red6Pasos.layers{2}.transferFcn = 'purelin'; %Preparamos de los datos de entrenamiento y test [Xs, Xi, Ai, Ts] = preparets(Red6Pasos, entradaRed6Pasos, salidaRed6Pasos); %Realizamos la distribucion de los datos en 80 entrenamiento y 20 test Red6Pasos.divideParam.trainRatio = 80/100; Red6Pasos.divideParam.valRatio = 20/100; Red6Pasos.divideParam.testRatio = 0/100; %Luego dividimos los datos de forma aleatoria Red6Pasos.divideFcn = 'dividerand'; %Dividimos cada valor Red6Pasos.divideMode = 'time'; %Usamos como funcion de rendimiento el error cuadratico medio Red6Pasos.performFcn = 'mse'; %Una vez definidos todos los parametros podemos comenzar a entrenar la red Red6Pasos = train(Red6Pasos, Xs, Ts, Xi, Ai); %El diagrama de la red se muestra a continuacion view(Red6Pasos); %Realizamos las predicciones [Y, Xf, Af] = Red6Pasos(Xs, Xi, Ai); [yPred, Xfp, Afp] = Red6Pasos(entradaRed6PasosTest, Xf, Af); %Para comparar los resultados realizamos el grafico figure; originalSeries = salidaCaudal6Pasos; predictionSeries = salidaCaudal6Pasos; predictionSeries(end - N + 1:end) = yPred; %Representamos el grafico plot(1:length(salidaCaudal6Pasos), cell2mat(predictionSeries), 'r', 1:length(salidaCaudal6Pasos),cell2mat(originalSeries), 'b'); legend('Serie de Predicción', 'Serie Original', 'Location', 'SouthEast');
Compartir