====== Exercise 5 ======
Program:
* Introduction to Netlab toolbox
* Classification of the wedge dataset using Netlab
* Classification of the XOR dataset using Netlab
Downloads:
* [[http://www1.aston.ac.uk/eas/research/groups/ncrg/resources/netlab/downloads/|The Netlab toolbox]]
* {{:courses:y33aui:cviceni:datawedge.txt|Wedge dataset}}
* {{:courses:y33aui:cviceni:dataxor.txt|XOR dataset}}
**Likely, you will not manage to finish the implementation of all the functions during the excercise in the lab. Finish them as a home work.**
===== Netlab installation =====
Download the Netlab toolbox, unpack it to a directory, and set the path to the directory in MATLAB.
* What is the puprose of the following functions:
* ''mlp()''
* ''netopt()''
* ''mlpfwd()''
* Do you understand the meaning of their arguments?
* In what format does the toolbox expect the data? Columns or rows? Is it the same format we used in previous exercises?
* Do you see the analogy with functions you created last week?
===== The wedge dataset =====
Repeat the task from the last week: train a simple neural network (2,2,1) on the wedge dataset.
* What types of transfer functions are available in Netlab? Can they be used freely for all neurons? What setting is suitable for our data?
* Try changing the optimization algorithm in ''netopt()''. Does the change affect the speed of learning? Does it affect the quality of learning?
* Try to visualize the results:
* plot the training data and the decision boundary
* plot the response of the network over the definition range
For plotting, you can use the following code snippets. For the decision boundary:
%% Plot the decision boundary
% Assuming the data are already plotted in current figure.
% Get the current axis limits
ax = axis;
% Prepare the mesh of points we will use to test the network
myx = ax(1):(ax(2)-ax(1))/100:ax(2);
myy = ax(3):(ax(4)-ax(3))/100:ax(4);
[xx,yy] = meshgrid(myx,myy);
% Prepare the data to the right format
data = [xx(:) yy(:)];
% Ask the NN for predictions
pred = mlpfwd(net, data);
% Reshape the predictions to the original matrix size
pred = reshape(pred, numel(myx), numel(myy));
% Draw the contour line - the decision boundary
[foo,c] = contour(myx, myy, pred, [0.5 0.5]);
And for the network response (assuming ''myx'', ''myy'', and ''pred'' come from the previous code snippet):
surf(myx, myy, pred);
shading flat;
view(-10,80);
===== The XOR dataset =====
Use the XOR dataset and explore the results of (2,2,1) network for this data set.
* Is the (2,2,1) network sufficient for this data?
* Is the resulting response surface always the same? How many different 'solutions' can this network provide?
Try to set higher number of units in the hidden layer.
* What is the minimal number of units in the hidden layer that allows us to split the data perfectly?
* Visualize the result. Did you expected it?
* Try to issue the command ''axis([-1 2 -1 2])'' after plotting the data, but before plotting the decision boundary and the response surface. Did the picture change? Is that what you expected?
* Try to increase the number of units in hidden layer (e.g. to 10), and issue the command ''axis([-10 11 -10 11])''. What does the response surface look like? Again, did you expected it?