Universidad de La Laguna. Centro Superior de Informática. Reconocimiento de Patrones Práctica 8 * Objetivo Estudiar la aplicación de un clasificador no lineal en un problema de clasificación multiclase. * Problema a Resolver Realizar la clasificación del conjunto de las iris de Fisher. * Metodología Clasificación no lineal multiclase basada en una red neuronal multicapa con propagación hacia delante. * Contenido de la práctica. 1. Modificar el programa de la práctica anterior para visualizar el resultado de la clasificación en tres clases. Para ello son necesarias las rutinas de SPRLIB dset *labelset_to_ioset(dset) con DATASET *dset Conjunto de datos la rutina devuelve un puntero de tipo dataset con los datos preparados para entrada-salida. dset *normalize_input_dataset(dset) con DATASET *dset Conjunto de datos la rutina devuelve un puntero de tipo dataset con los datos normalizados int learn_ptron_init(dset)con DATASET *dset Conjunto de datos la rutina devuelve TRUE(error) o FALSE(no error) NET* create_ff_net(netid,numcapas,numunits) con long netid: identificador de la red (un número cualquiera) int numcapas: número de capas (en este caso 3) int *numunits:un vector de enteros que contiene las unidades en cada capa. Para reservarle memoria se usa numunits=ivector(1,numcapas). En nuestro caso numunits[1]=2 numunits[2]=3 numunits[3]=3 la rutina devuelve un puntero con la red neuronal int bp_init(red)con NET *red: Puntero devuelto por la rutina anterior la rutina inicializa la red y devuelve TRUE(error) o FALSE(no error) void unif_rand_net(seed,min,max,red)con double min: limites de la distribucion uniforme (en este caso -.01) double max: limites de la distribucion uniforme (en este caso .01) NET * red: puntero a la red int bp_learn(red,dset,eta,alpha,ciclos,opciones) con NET* red: puntero a la red DATASET* dset: conjunto de datos double eta:parametro de entrenamiento (en nuestro caso 0.01) double alpha:parametro de entrenamiento (en nuestro caso 0.009) long ciclos:numero de iteraciones (en nuestro caso 10) long options: opciones del algoritmo (en nuestro caso options=NO_HISTU|NO_HISTT|NO_HISTW|BPACCUM|BPUPDATE) la rutina devuelve TRUE(error) o FALSE(no error) int eval_ff_net(red,medidas)con NET *red: Puntero a la red double* c: Vector de medidas la rutina devuelve TRUE(error) o FALSE(no error) Para calcular la salida de la red se examinan las unidades: unit_ptr = net->LastUnit; for (k=0;k<3;k++){ salida[unit_ptr->InOutIndex]=unit_ptr->Value.Output; unit_ptr = unit_ptr->Prev; y se obtiene la salida en salida[1],salida[2],salida[3]; void bp_free(red) NET *red: Puntero a la red la rutina libera la memoria asociada al entrenamiento void delete_net(red) NET *red: Puntero a la red la rutina libera la memoria asociada a la red 2. El programa debe tener la siguiente estructura: * Cargar el fichero de datos con load_dataset() * Convertir el conjunto de datos con labelset_to_ioset() * Normalizar los datos con normalize_input_dataset() (Esto se hace para facilitar la convergencia del método del gradiente. Después de esto prácticamente todas las medidas están en el intervalo [-5,5]). * Inicializar la red con create_ff_net() * Inicializar los parámetros del algoritmo de aprendizaje con bp_init() * Inicializar aleatoriamente los pesos con unif_rand_net() * Hacer 50 iteraciones de : * Realizar diez iteraciones (ciclos=10) de aprendizaje con bp_learn() * Para cada punto de la pantalla 100x100 * Transformarlo en un vector de medidas (al intervalo [-5,5]) * Evaluar el resultado de la red con eval_ff_net() * Calcular la salida * Asignar el punto a la clase que tenga mayor valor en el vector de salida y dibujarlo en pantalla * Dibujar el conjunto de muestras * Liberar memoria y estructuras de datos reservadas.