Title | Práctica Obligatoria de Redes RBF |
---|---|
Course | Inteligencia Artificial |
Institution | Universidad Pontificia de Salamanca |
Pages | 18 |
File Size | 188.3 KB |
File Type | |
Total Downloads | 48 |
Total Views | 149 |
Práctica Obligatoria de Redes RBF...
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...