function [ w ] = teht4( X, Y, X2, Y2 )
% TEHT4 Johdatus koneoppimiseen harjoitus 4 tehtävät 4-5
%
% (a) Sovella edellisen tehtävän Perceptron-algoritmia edellisten laskuharjoitusten
% tehtävän 2 dataan. Koska data on moniluokkaista, joudut käyttämään
% luennoilla esiteltyä menetelmää moniluokkaisen luokitteluongelman
% ratkaisemiseksi lineaarisin luokittelijoin.
%

%train_size = 500;
%X = X(1:train_size,:);
%Y = Y(1:train_size,:);

X = [X, ones(size(X,1),1)]; % Lisätään opetusdatan perään vakiotermi, jotta saadaan ei-origon kautta kulkevat hypertasot mukaan.
X2 = [X2, ones(size(X2,1),1)]; % Sama testidatalle

disp(sprintf('Luodaan ennustaja %d:stä syötteestä', length(X)));
tic;
for luokka = 0:max(Y),
    disp(sprintf('Luodaan ennustaja luokalle %d', luokka));
    LUOKKA = (Y == luokka) * 2 - 1;
    w(luokka+1, :) = perceptron(X, LUOKKA, false);
end
toc;

%perceptron_ennusta(w, X2, Y2);

%
% (b) Vertaa viime kerralla toteutetun k lähintä naapuria -menetelmän ja
% kohdassa (a) toteutetun Perceptron-pohjaisen menetelmän luokittelutarkkuutta
% toisiinsa.
%
% KNN antaa noin 5% virhettä kun k on noin 5.

%
%
% (c) Vertaa edellä mainittujen menetelmien opetus- ja ennustusvaiheiden
% nopeutta toisiinsa.
%
% Yksinkertaisesti toteutetussa KNN:ssä ei kulu opetusvaiheessa aikaa.
% Perceptronin opetusvaihe hidastuu kun opetusjoukko kasvaa.
%
% Perceptron on ennustaessa nopeampi.
% Perceptronkin hidastuu jos eri ennustettavien luokkien määrä on todella iso.
%
% (d) Pohdi menetelmien hyviä ja huonoja puolia eri tilanteissa.
%
% Perceptronin ennustaja ei vie juuri ollenkaan tilaa.
% KNN:n ennustaja vie opetusjoukon verran tilaa.
%
% Mikäli ennustusvaihe on intensiivinen, ei KNN ole järkevää ennustusvaiheen hitauden vuoksi.
% Mikäli ennusteita halutaan vain pieniä määriä samasta datasta, ja
% datajoukko vaihtuu usein, ei Perceptronin opetusvaiheeseen kuluva aika ole mielekästä.
%
