% skrypt zawiera przyk³ad klasyfikacji binarnej dla dwóch wybranych cyfr, np. 0 i 1
% zastosowano model GLM (regresja logistyczna) i IRLS jako algorytm uczenia
% Copyright (c) Marek S³oñski, 06.03.2008
clc; clear all; 

%wczytanie zbioru 
load mnist1k; 

%wybor cyfr do klasyfikacji
C1 = 1; C2 = 0;
c0 = find(data.y(:, 1)==C1);
c1 = find(data.y(:, 1)==C2);

%przygotowanie zbiorów ucz±cego i testuj±cego
nl = [c0(1:2:end, :); c1(1:2:end, :)];
nt = [c0(2:2:end, :); c1(2:2:end, :)];
xl = data.x(nl, :);                     
xt = data.x(nt, :);

%utworzenie wektora wartosci docelowych
t0 = data.y(c0);
t1 = data.y(c1);
l = [t0(1:2:end, :); t1(1:2:end, :)];
t = [t0(2:2:end, :); t1(2:2:end, :)];
tl = (l == C1);
tt = (t == C1);

%wizualizacja wybranych przyk³adów cyfr
disp('wizualizacja wybranych przyk³adów cyfr'); pause
digit=reshape(xl(1,:), 28,28)';    
subplot(121); colormap(gray); image(255*digit); 
tl(1) %symbol klasy (1 dla 1. klasy)

digit=reshape(xl(end,:), 28,28)';       
subplot(122); colormap(gray); image(255*digit); 
tl(end)
pause

%utworzenie i nauczenie modelu GLM
clc; disp('utworzenie modelu GLM');
nin = size(xl, 2); 
net = glm(nin, 1, 'logistic')
pause
disp('nauczenie modelu (IRLS)');
options = foptions;
options(1) = 1;
options(14) = 10;
%algorytm uczenia: IRLS
net = glmtrain(net, options, xl, tl)

%opcjonalnie: algorytm uczenia: SCG (scaled conjugate gradient)
%[net, options, errlog, parlog] = netopt(net, options, xl, tl, 'scg');
pause

%kontrola jako¶ci uczenia
clc; disp('kontrola jako¶ci uczenia, macierz pomy³ek'); pause
yl = glmfwd(net, xl);
[C, rate] = confmat(yl, tl)  %macierz pomy³ek
pause

%kontrola jako¶ci generalizacji
disp('kontrola jako¶ci generalizacji, macierz pomy³ek')
yt = glmfwd(net, xt);
[Ct, ratet] = confmat(yt, tt)
