Classification of XOR problem with a RBFN
Neural Networks course (practical examples) © 2012 Primoz Potocnik
PROBLEM DESCRIPTION: 2 groups of linearly inseparable data (A,B) are defined in a 2-dimensional input space. The task is to define a neural network for solving the XOR classification problem.
Contents
Create input data
close all, clear all, clc, format compact % number of samples of each cluster K = 100; % offset of clusters q = .6; % define 2 groups of input data A = [rand(1,K)-q rand(1,K)+q; rand(1,K)+q rand(1,K)-q]; B = [rand(1,K)+q rand(1,K)-q; rand(1,K)+q rand(1,K)-q]; % plot data plot(A(1,:),A(2,:),'k+',B(1,:),B(2,:),'b*') grid on hold on
Define output coding
% coding (+1/-1) for 2-class XOR problem
a = -1;
b = 1;
Prepare inputs & outputs for network training
% define inputs (combine samples from all four classes) P = [A B]; % define targets T = [repmat(a,1,length(A)) repmat(b,1,length(B))];
Create a RBFN
% NEWRB algorithm % The following steps are repeated until the network's mean squared error % falls below goal: % 1. The network is simulated % 2. The input vector with the greatest error is found % 3. A radbas neuron is added with weights equal to that vector % 4. The purelin layer weights are redesigned to minimize error % choose a spread constant spread = 2; % choose max number of neurons K = 20; % performance goal (SSE) goal = 0; % number of neurons to add between displays Ki = 4; % create a neural network net = newrb(P,T,goal,spread,K,Ki); % view network view(net)
NEWRB, neurons = 0, MSE = 1 NEWRB, neurons = 4, MSE = 0.302296 NEWRB, neurons = 8, MSE = 0.221059 NEWRB, neurons = 12, MSE = 0.193983 NEWRB, neurons = 16, MSE = 0.154859 NEWRB, neurons = 20, MSE = 0.122332
Evaluate network performance
% simulate RBFN on training data Y = net(P); % calculate [%] of correct classifications correct = 100 * length(find(T.*Y > 0)) / length(T); fprintf('\nSpread = %.2f\n',spread) fprintf('Num of neurons = %d\n',net.layers{1}.size) fprintf('Correct class = %.2f %%\n',correct) % plot targets and network response figure; plot(T') hold on grid on plot(Y','r') ylim([-2 2]) set(gca,'ytick',[-2 0 2]) legend('Targets','Network response') xlabel('Sample No.')
Spread = 2.00 Num of neurons = 20 Correct class = 99.50 %
Plot classification result
% generate a grid span = -1:.025:2; [P1,P2] = meshgrid(span,span); pp = [P1(:) P2(:)]'; % simualte neural network on a grid aa = sim(net,pp); % plot classification regions based on MAX activation figure(1) ma = mesh(P1,P2,reshape(-aa,length(span),length(span))-5); mb = mesh(P1,P2,reshape( aa,length(span),length(span))-5); set(ma,'facecolor',[1 0.2 .7],'linestyle','none'); set(mb,'facecolor',[1 1.0 .5],'linestyle','none'); view(2)
Plot RBFN centers
plot(net.iw{1}(:,1),net.iw{1}(:,2),'gs')