% Kombinerer settene 1 og 3 til ett
% større sett, og deler dette opp i 5
% deler med nesten like mange obs-
% ervasjoner i hver del.
% Utfører krysvalidering med alle delene
% og beregner kombinert estimat for
% feilrate.
% Skriver ut verdien av k, estimat for
% 2-dimensjonale vektorer, og estimat
% for 39-dimensjonale vektorer
clc, clear all, close all

% Velg hvilke verdier av k som skal brukes
kstart = 1;
kend = 20;

% Last inn data
load taledata.mat

% Slå sammen labels- og MFCC-vektorer. Merk at labels-
% vektorene er radvektorer og må konkateneres horisontalt,
% mens MFCC-vektorene er kolonnevektorer og må konkateneres
% vertikalt.
labels_vel_kombinert = [labels_vel_1 labels_vel_3];
mfcc_2D_kombinert = [mfcc_2D_1; mfcc_2D_3];
mfcc_39D_kombinert = [mfcc_39D_1; mfcc_39D_3];

% 1568 + 180 = 3*350 + 2*349
n1 = 350;

% Del opp 2D-vektorene
fold1_2D = mfcc_2D_kombinert(1:n1,:);
fold2_2D = mfcc_2D_kombinert(n1+1:2*n1,:);
fold3_2D = mfcc_2D_kombinert(2*n1+1:3*n1,:);
fold4_2D = mfcc_2D_kombinert(3*n1+1:4*n1,:);
fold5_2D = mfcc_2D_kombinert(4*n1+1:end,:);

% Del opp 39D-vektorene
fold1_39D = mfcc_39D_kombinert(1:n1,:);
fold2_39D = mfcc_39D_kombinert(n1+1:2*n1,:);
fold3_39D = mfcc_39D_kombinert(2*n1+1:3*n1,:);
fold4_39D = mfcc_39D_kombinert(3*n1+1:4*n1,:);
fold5_39D = mfcc_39D_kombinert(4*n1+1:end,:);

% Del opp labels-vektoren
fold1_labels = labels_vel_kombinert(1:n1);
fold2_labels = labels_vel_kombinert(n1+1:2*n1);
fold3_labels = labels_vel_kombinert(2*n1+1:3*n1);
fold4_labels = labels_vel_kombinert(3*n1+1:4*n1);
fold5_labels = labels_vel_kombinert(4*n1+1:end);

% Vis tabelloverskrift
fprintf('k\t\tFeilrate (2D)\t\tFeilrate (39D)\n')

% Opprett vektorer for å lagre gjennomsnittsfeilen
% for hver verdi av k
avg_error_2D = zeros(kend-kstart,1);
avg_error_39D = zeros(kend-kstart,1);

for k = kstart:kend

    % Opprett vektor for feilerate-stimatene for gjeldende verdi av k
    errors_2D = zeros(5,1);
    errors_39D = zeros(5,1);

    % Beregn estimert feilrate for 2D-vektorene
    outClass = knn(fold1_2D, [fold2_2D; fold3_2D; fold4_2D; fold5_2D], [fold2_labels fold3_labels fold4_labels fold5_labels]', k);
    errors_2D(1) = computeError(outClass,fold1_labels');

    outClass = knn(fold2_2D, [fold1_2D; fold3_2D; fold4_2D; fold5_2D], [fold1_labels fold3_labels fold4_labels fold5_labels]', k);
    errors_2D(2) = computeError(outClass,fold2_labels');

    outClass = knn(fold3_2D, [fold1_2D; fold2_2D; fold4_2D; fold5_2D], [fold1_labels fold2_labels fold4_labels fold5_labels]', k);
    errors_2D(3) = computeError(outClass,fold3_labels');

    outClass = knn(fold4_2D, [fold1_2D; fold2_2D; fold3_2D; fold5_2D], [fold1_labels fold2_labels fold3_labels fold5_labels]', k);
    errors_2D(4) = computeError(outClass,fold4_labels');

    outClass = knn(fold5_2D, [fold1_2D; fold2_2D; fold3_2D; fold4_2D], [fold1_labels fold2_labels fold3_labels fold4_labels]', k);
    errors_2D(5) = computeError(outClass,fold5_labels');


    % Beregn estimert feilrate for 39D-vektorene
    outClass = knn(fold1_39D, [fold2_39D; fold3_39D; fold4_39D; fold5_39D], [fold2_labels fold3_labels fold4_labels fold5_labels]', k);
    errors_39D(1) = computeError(outClass,fold1_labels');

    outClass = knn(fold2_39D, [fold1_39D; fold3_39D; fold4_39D; fold5_39D], [fold1_labels fold3_labels fold4_labels fold5_labels]', k);
    errors_39D(2) = computeError(outClass,fold2_labels');

    outClass = knn(fold3_39D, [fold1_39D; fold2_39D; fold4_39D; fold5_39D], [fold1_labels fold2_labels fold4_labels fold5_labels]', k);
    errors_39D(3) = computeError(outClass,fold3_labels');

    outClass = knn(fold4_39D, [fold1_39D; fold2_39D; fold3_39D; fold5_39D], [fold1_labels fold2_labels fold3_labels fold5_labels]', k);
    errors_39D(4) = computeError(outClass,fold4_labels');

    outClass = knn(fold5_39D, [fold1_39D; fold2_39D; fold3_39D; fold4_39D], [fold1_labels fold2_labels fold3_labels fold4_labels]', k);
    errors_39D(5) = computeError(outClass,fold5_labels');

    % Beregn kombinerte estimat for feilratene
    avg_error_2D(k) = sum(errors_2D)/numel(errors_2D);
    avg_error_39D(k) = sum(errors_39D)/numel(errors_39D);
	
    % Vis resultat
    fprintf('%i\t\t%.4f\t\t\t%.4f\n',k,avg_error_2D(k),avg_error_39D(k))
    
end

% Lag figur
figure(1), hold on
plot(1:20,avg_error_2D,'rs-','LineWidth',1.6)
plot(1:20,avg_error_39D,'bo-','LineWidth',1.6)
xlabel('k')
ylabel('Estimert feilrate')
legend('2D','39D')
box on
title('Gjennomsnittlig feilrate etter kryssvalidering med {1 \leq k \leq 20}','FontWeight','bold')
hold off
    
    
    
    
    
    
