Práctica Obligatoria de Redes RBF PDF

Title Práctica Obligatoria de Redes RBF
Course Inteligencia Artificial
Institution Universidad Pontificia de Salamanca
Pages 18
File Size 188.3 KB
File Type PDF
Total Downloads 48
Total Views 149

Summary

Práctica Obligatoria de Redes RBF...


Description

19-12-2020

Práctica Obligatoria de Redes RBF Inteligencia Artificial

Pablo Mateos García 4º INGENIERÍA INFORMÁTICA UNIVERSIDAD PONTIFICIA DE SALAMANCA

Pablo Mateos García

Inteligencia Artificial Práctica Obligatoria de Redes RBF

1. Comentario de la práctica Para resolver la práctica, he decidido utilizar Matlab en vez de Octave, ya que podía utilizarlo desde el Mac. La práctica me ha parecido muy sencilla y clara gracias al script. Sin duda, ha sido muy fácil de seguir. A continuación, adjunto el código copiado de Matlab. Como se puede ver, hay algunos pequeños cambios debido a que Octave y Matlab tienen algunas pequeñas diferencias, por lo que en unas partes tuve que hacer ligeras modificaciones. A parte de mostrar el código aquí, también subiré el fichero en formato .m comprimido justo a esta entrega. 2. Código en Matlab % Cargamos primeramente los datos:

load -import doc.bin.304 load -import pendigits.muestra

% Problema de regresi�n para la funci�n seno con ruido

% Creamos primeramente los datospr ndatos=50; sigma= 0.1; x = (linspace(0,1,ndatos) )'; y = sin( 2 * pi * x) + sigma * randn( ndatos, 1);

% Nomalizamos la variable x para que tenga media 0 y desviaci�n standar 1

mu = mean(x); sigma = sqrt( sumsqr( x - mean(x) ) / (ndatos-1) ); %versión para matlab %sigma = sqrt( sumsq( x - mean(x) ) / (ndatos-1) ); %versión para octave 2

Pablo Mateos García

Inteligencia Artificial

x_train = (x - mu)./(sigma);

% Creamos la estructura que almacena la red

% Inicializamos el generador de n�meros aleatorios randn('seed', 40);

entradas = 1; n_capa_oculta =7; n_capa_salida=1;

gauss_seno = rbf( entradas, n_capa_oculta, n_capa_salida, 'gaussian'); gauss_seno

% Estimamos los centros de la red mediante un modelo de mixturas % con matriz de covarianza identidad. Los par�metros de la capa de % salida se estiman mediante una pseudoinversa.

options(1) = 1; % Proporciona los valores del error durante el algoritmo EM options(14) = 10; % M�ximo n�mero de iteraciones para el EM. Con pocas iteraciones % Vale para situar aproximadamente los centros.

gauss_seno = rbftrain( gauss_seno, options, x_train, y);

% Generamos el conjunto de test para evaluar la capacidad de generalizaci�n 3

Pablo Mateos García

Inteligencia Artificial

val_test = [ min(x):0.05:max(x) ]'; y_test = sin( 2 * pi * val_test); % Curva que debe predecir

% Normalizamos la variable x como antes val_test_norm = (val_test-mu)./(sigma);

% Realizamos la predicci�n para los puntos de test y= rbffwd( gauss_seno, val_test_norm);

% Dibujamos las curvas seno y la predicha por la red plot( val_test_norm, y_test, "-r", val_test_norm, y, "-b")

%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Problema de clasificaci�n %%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Clasificaci�n para 2 espirales conc�ntricas

% Generamos primeramente los datos de las espirales

ndatos= 150; % 150 datos para cada clase theta = (linspace( 0, 2*pi, ndatos))'; t1 = (linspace(0, 1, ndatos))'; t2 = 0.5 + 1.5 * t1; 4

Pablo Mateos García

Inteligencia Artificial

sigma = 0.1; % Desviaci�n estandar para el ruido a�adido

% Primera espiral x1 = t1 .* cos(theta) + sigma * randn( ndatos, 1); y1 = t1 .* sin(theta) + sigma * randn(ndatos, 1);

% Segunda espiral x2 = t2 .* cos(theta) + sigma * randn( ndatos, 1); y2 = t2 .* sin(theta) + sigma * randn( ndatos, 1);

espiral = [x1 y1; x2 y2]; etiqueta = [ones(ndatos, 1); 2 * ones( ndatos, 1)]; espiral = [ espiral etiqueta];

% Dibujamos los datos %plot( espiral( 1:ndatos ,1), espiral( 1:ndatos ,2), "@r", espiral(ndatos+1:2*ndatos ,1), espiral( ndatos+1:2*ndatos ,2), "@b") %versión para octave plot( espiral( 1:ndatos ,1), espiral( 1:ndatos ,2), "r", espiral( ndatos+1:2*ndatos ,1), espiral( ndatos+1:2*ndatos ,2), "b") %versión para matlab

% Creamos una muestra aleatoria para entrenamiento y test muestra = randperm(2*ndatos); datosm = 2 * round(0.8 * ndatos); muestra_t = muestra(datosm+1:2*ndatos); muestra = muestra(1:datosm);

5

Pablo Mateos García

Inteligencia Artificial

% Creamos la estructura de una red RBF con 15 neuronas en la capa oculta % y 2 en la de salida (problema de clasificaci�n con 2 clases)

entradas = 2; n_capa_oculta=25; n_capa_salida=2;

gauss_espiral = rbf( entradas, n_capa_oculta, n_capa_salida, 'gaussian');

% Se sugiere al alumno que prueba otras funciones en la capa oculta no gaussianas.

% Estimamos los par�metros de la red. % Para la capa oculta se calculan los centros con un modelo de mixturas y componentes normales. % La sigma para las normales se toma como el m�ximo de las distancias entre centros.

% Las etiquetas se deben codificar de tal forma que para cada dato s �lo la columna asociada % a la clase a la que pertenece el dato sea 1. Hacemos esa transformaci�n como:

etiquetas =[ espiral(:,3)==1 espiral(:,3)==2];

%options = foptions; options(1) = 1; % Visualiza el error para el algoritmo iterativo EM options(14)=25; % N�mero m�ximo de iteraciones para el algoritmo EM

6

Pablo Mateos García gauss_espiral= rbftrain( etiquetas(muestra,:) );

Inteligencia Artificial gauss_espiral,

options,

espiral(muestra,

1:2),

% Dibujamos los puntos donde se han puesto los centros: plot( espiral( 1:ndatos ,1), espiral( 1:ndatos ,2), "r", espiral( ndatos+1:2*ndatos ,1), espiral( ndatos+1:2*ndatos ,2), "b") %versión para matlab hold on %plot(gauss_espiral.c(:,1), gauss_espiral.c(:,2), "@g") %versión para octave plot(gauss_espiral.c(:,1), gauss_espiral.c(:,2), "g") %versión para matlab

% Calculamos las probabilidades de clase para los puntos de entrenamiento y test. y_ent = rbffwd( gauss_espiral, espiral(muestra, 1:2) ); y_test = rbffwd( gauss_espiral, espiral(muestra_t, 1:2) );

% Estimamos los errores y matriz de confusion tanto para el entrenamiento como para el test. [ matriz_confusion_ent, error_ent] = confmat(y_ent, etiquetas(muestra,:) );

[ matriz_confusion_test, error_test] = confmat(y_test, etiquetas(muestra_t,:) );

%Visualizamos los resultados

matriz_confusion_ent error_ent

matriz_confusion_test error_test 7

Pablo Mateos García

Inteligencia Artificial

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%% % Repetimos el proceso anterior pero ahora vamos a situar los centros de la capa oculta % mediante un algoritmo K-medias. La desviaci�n estandar se sigue mantiendo como % la m�xima distancia entre centros. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%

% Fijamos las opciones para el algoritmo k-medias %options = foptions; options(1) = 1; % Imprime los valores del error options(14)=10 % N�mero m�ximo de iteraciones para el algoritmo k-medias

% Inicializamos los centros de kmedias aleatoriamente ncentros = n_capa_oculta; muestra_aleat = muestra( randperm( length(muestra) ) ); %Permuta aleatoriamente los �ndices de muestra muestra_aleat = muestra_aleat(1:ncentros); componentes

%Se queda con las primeras

centros_aleat = espiral( muestra_aleat, 1:2);

% Obtenemos los centros con kmedias centros_kmedias = kmeans( centros_aleat, espiral(muestra, 1:2), options); 8

Pablo Mateos García

Inteligencia Artificial

% Generamos la estructura de la red gauss_espiral_kmedias = rbf( entradas, n_capa_oculta, n_capa_salida, 'gaussian');

% Rellenamos los centros y desviaci�n estandar en la estructura generada

gauss_espiral_kmedias.c = centros_kmedias; gauss_espiral_kmedias.wi = gauss_espiral.wi; % Las sigma_i son iguales al caso anterior

[y, act_kmedias] = rbffwd( gauss_espiral_kmedias, espiral(muestra, 1:2) ); % Obtenemos las funciones de % activaci�n con los par�metros calculados para la capa oculta

% Calculamos ahora los pesos de la capa de salida mediante la pseudoinversa temp = pinv( [act_kmedias ones( length(muestra), 1) ] ) * etiquetas(muestra, :); % Etiqueta es la matriz t de salida gauss_espiral_kmedias.w2 = temp( 1:n_capa_oculta, :); gauss_espiral_kmedias.b2 = temp( n_capa_oculta + 1, :);

% Calculamos las matrices de confusion y errores como en el caso anterior

y_ent = rbffwd( gauss_espiral_kmedias, espiral(muestra, 1:2) ); % salida para los datos de entrenamiento y_test = rbffwd( gauss_espiral_kmedias, espiral(muestra_t, 1:2) ); % salida para los datos de test

9

Pablo Mateos García

Inteligencia Artificial

% Estimamos los errores y matriz de confusion tanto para el entrenamiento como para el test. [ matriz_confusion_ent, error_ent] = confmat( y_ent, etiquetas(muestra,:) );

[ matriz_confusion_test, error_test] = confmat( y_test, etiquetas(muestra_t,:) );

%Visualizamos los resultados

matriz_confusion_ent error_ent

matriz_confusion_test error_test

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Repetimos el procedimiento anterior pero generando los centros aleatoriamente %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Generamos la estructura de la red gauss_espiral_aleat = rbf( entradas, n_capa_oculta, n_capa_salida, 'gaussian');

% Rellenamos los centros y desviaci�n estandar en la estructura generada

gauss_espiral_aleat.c = centros_aleat; gauss_espiral_aleat.wi = gauss_espiral.wi; % Las sigma_i son iguales al caso anterior 10

Pablo Mateos García

Inteligencia Artificial

[y, act_aleat] = rbffwd( gauss_espiral_aleat, espiral(muestra, 1:2) ); % Obtenemos las funciones de % activaci�n con los par�metros calculados para la capa oculta

% Calculamos ahora los pesos de la capa de salida mediante la pseudoinversa temp = pinv( [act_aleat ones( length(muestra), 1) ] ) * etiquetas(muestra, :); % Etiqueta es la matriz t de salida gauss_espiral_aleat.w2 = temp( 1:n_capa_oculta, :); gauss_espiral_aleat.b2 = temp( n_capa_oculta + 1, :);

% Calculamos las matrices de confusion y errores como en el caso anterior

y_ent = rbffwd( gauss_espiral_aleat, espiral(muestra, 1:2) ); % salida para los datos de entrenamiento y_test = rbffwd( gauss_espiral_aleat, espiral(muestra_t, 1:2) ); % salida para los datos de test

% Estimamos los errores y matriz de confusion tanto para el entrenamiento como para el test. [ matriz_confusion_ent, error_ent] = confmat( y_ent, etiquetas(muestra,:) );

[ matriz_confusion_test, error_test] = confmat( y_test, etiquetas(muestra_t,:) );

%Visualizamos los resultados

matriz_confusion_ent error_ent 11

Pablo Mateos García

Inteligencia Artificial

matriz_confusion_test error_test

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%% % Aplicamos la red RBF al problema de documentos %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%% % Creamos la estructura de una red RBF con 20 neuronas en la capa oculta % y 2 en la de salida (problema de clasificaci�n con 2 clases)

entradas = 514; n_capa_oculta=30; n_capa_salida=4;

gauss_docs = rbf( entradas, n_capa_oculta, n_capa_salida, 'gaussian'); %options = foptions; options(1) = 1; %options(5)=10; % N�mero m�ximo de iteraciones para el algoritmo EM options(14) = 20; % Iteraciones para el algoritmo K-medias.

% Obtenemos la muestra de entrenamiento y de test. muestra = randperm(304); datos_m= round( 0.8 * 304); 12

Pablo Mateos García

Inteligencia Artificial

muestra_t= muestra( (datos_m+1):304); muestra = muestra(1:datos_m);

% Estimamos los par�metros de la red.

% Las etiquetas se deben codificar de tal forma que para cada dato s �lo la % columna asociada % a la clase a la que pertenece el dato sea 1. Hacemos esa transformaci�n como:

etiquetas =[ doc(:,515)==1 doc(:,515)==2 doc(:,515)==3 doc(:,515)==4];

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Obtenemos los centros con kmedias %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

centros_kmedias = kmeans( doc(1:n_capa_oculta, 1:514), doc(muestra, 1:514), options);

% Rellenamos los centros y desviaci�n estandar en la estructura generada

gauss_docs.c = centros_kmedias; cdist = dist2(centros_kmedias, centros_kmedias); maxdist = max(max(cdist)); gauss_docs.wi = (maxdist/size( gauss_docs.wi,2)) * ones(size(gauss_docs.wi));

13

Pablo Mateos García

Inteligencia Artificial

[y, act_kmedias] = rbffwd( gauss_docs, doc(muestra, 1:514) ); % Obtenemos las funciones de % activaci�n con los par�metros calculados para la capa oculta

% Calculamos ahora los pesos de la capa de salida mediante la pseudoinversa temp = pinv( [act_kmedias ones( length(muestra), 1) ] ) * etiquetas(muestra, :); % Etiqueta es la matriz t de salida gauss_docs.w2 = temp( 1:n_capa_oculta, :); gauss_docs.b2 = temp( n_capa_oculta + 1, :);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%

%gauss_docs= rbftrain( etiquetas(muestra,:) );

gauss_docs,

options,

doc(muestra,

1:514),

% Calculamos las probabilidades de clase para los puntos de entrenamiento y test. y_ent = rbffwd( gauss_docs, doc(muestra, 1:514) ); y_test = rbffwd( gauss_docs, doc(muestra_t, 1:514) );

% Estimamos los errores y matriz de confusion tanto para el entrenamiento como para el test. [ matriz_confusion_ent, error_ent] = confmat( y_ent, etiquetas(muestra,:) );

[ matriz_confusion_test, error_test] = confmat( y_test, etiquetas(muestra_t,:) ); 14

Pablo Mateos García

Inteligencia Artificial

%Visualizamos los resultados

matriz_confusion_ent error_ent

matriz_confusion_test error_test

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% % Aplicamos la red RBF al problema de los d�gitos manuscritos %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% % Creamos la estructura de una red RBF con 20 neuronas en la capa oculta % y 2 en la de salida (problema de clasificaci�n con 2 clases)

entradas = 256; n_capa_oculta=20; n_capa_salida=10;

gauss_pendigits = rbf( entradas, n_capa_oculta, n_capa_salida, 'gaussian'); %options = foptions; options(1) = 1; %options(5)=10; % N�mero m�ximo de iteraciones para el algoritmo EM options(14) = 20; % Iteraciones para el algoritmo K-medias. 15

Pablo Mateos García

Inteligencia Artificial

% Obtenemos la muestra de entrenamiento y de test. muestra = randperm(2000); datos_m= round( 0.8 * 2000); muestra_t= muestra( (datos_m+1):2000); muestra = muestra(1:datos_m);

% Estimamos los par�metros de la red.

% Las etiquetas se deben codificar de tal forma que para cada dato s�lo la % columna asociada % a la clase a la que pertenece el dato sea 1. Hacemos esa transformaci�n como:

etiquetas = [ pendigits(:,1)==0]; for i=1:9 etiquetas =[ etiquetas pendigits(:,1)==i]; end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Obtenemos los centros con kmedias %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

centros_kmedias = kmeans( pendigits(1:n_capa_oculta, 2:257), pendigits(muestra, 2:257), options);

% Rellenamos los centros y desviaci�n estandar en la estructura generada 16

Pablo Mateos García

Inteligencia Artificial

gauss_pendigits.c = centros_kmedias; cdist = dist2(centros_kmedias, centros_kmedias); maxdist = max(max(cdist)); gauss_pendigits.wi = (maxdist/size( ones(size(gauss_pendigits.wi));

gauss_pendigits.wi,2)

)

*

[y, act_kmedias] = rbffwd( gauss_pendigits, pendigits(muestra, 2:257) ); % Obtenemos las funciones de % activaci�n con los par�metros calculados para la capa oculta

% Calculamos ahora los pesos de la capa de salida mediante la pseudoinversa temp = pinv( [act_kmedias ones( length(muestra), 1) ] ) * etiquetas(muestra, :); % Etiqueta es la matriz t de salida gauss_pendigits.w2 = temp( 1:n_capa_oculta, :); gauss_pendigits.b2 = temp( n_capa_oculta + 1, :);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%

% Calculamos las probabilidades de clase para los puntos de entrenamiento y test. y_ent = rbffwd( gauss_pendigits, pendigits(muestra, 2:257) ); y_test = rbffwd( gauss_pendigits, pendigits(muestra_t, 2:257) );

% Estimamos los errores y matriz de confusion tanto para el entrenamiento como para el test. 17

Pablo Mateos García

Inteligencia Artificial

[ matriz_confusion_ent, error_ent] = confmat( y_ent, etiquetas(muestra,:));

[ matriz_confusion_test, error_test] = confmat( y_test, etiquetas(muestra_t,:) );

%Visualizamos los resultados

matriz_confusion_ent error_ent

matriz_confusion_test error_test

18...


Similar Free PDFs