% Kryssvalidering for fonemklassifisering
% i 39D.
% 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.
% Validerer også med sett nr. 3 som test-
% og 1 som treningssett.
% Viser estimatene i kommandovinduet og
% plotter dem mot k
% Det meste av koden er felles med 
% kryssvalider.m, men labels-vektorene er
% ulike, og de todimensjonale MFCC-vektorene
% er utelatt her.
clc, clear all, close all

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

% Last inn data
load taledata.mat

% Setter sammen labels og MFCC-vektorer
labels_phones_kombinert = [labels_phones_1 labels_phones_3];
mfcc_39D_kombinert = [mfcc_39D_1; mfcc_39D_3];

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

% Del opp MFCC-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_phones_kombinert(1:n1);
fold2_labels = labels_phones_kombinert(n1+1:2*n1);
fold3_labels = labels_phones_kombinert(2*n1+1:3*n1);
fold4_labels = labels_phones_kombinert(3*n1+1:4*n1);
fold5_labels = labels_phones_kombinert(4*n1+1:end);

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

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

% Opprett en vektor for å lagre feilen (fra "vanlig"
% validering) for hver verdi av k
error_39D = zeros(kend-kstart,1);

for k = kstart:kend

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

    % Beregn estimert feilrate (kryssvalidering)
    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 feilraten (gjennomsnitt)
    avg_error_39D(k) = sum(errors_39D)/numel(errors_39D);
    
    % Beregn estimat for feilraten ("vanlig" validering)
    outClass = knn(mfcc_39D_3,mfcc_39D_1,labels_phones_1,k);
    error_39D(k) = computeError(outClass,labels_phones_3);  
    
    % Vis resultatet
    fprintf('%i\t\t%.4f\t\t\t%.4f\n',k,error_39D(k),avg_error_39D(k))
    
end

% Lag figur
figure(1), hold on
plot(1:20,avg_error_39D,'bo-','LineWidth',1.6)
plot(1:20,error_39D,'bo--','LineWidth',1.6)
xlabel('k')
ylabel('Estimert feilrate')
legend('Kryssvalidering','Sett nr. 3 som utviklingssett')
box on
title('Estimert feilrate etter validering med {1 \leq k \leq 20}','FontWeight','bold')
hold off
    
    
    
    
    
    
