% Tester knn-algoritmen på fonemklassifisering
% med sett nr. 1 eller 1 og 3 som treningsdata,
% og sett nr. 2 som testdata.
% Tester med og uten normalisering av MFCC-vektorene
% Beregner konfidensintervall for forskjellen i
% feilrate med og uten normaliserte data
% Koden i dette scriptet er stort sett den samme som i 
% testk.m, med unntak av labels-vektorene. I tillegg er
% de todimensjonale MFCC-vektorene utelatt her.
clc, clear all, close all

% Last inn data
load taledata.mat

% Sett verdien til k
k = 11;

% Beregn estimert feilrate
outClass = knn(mfcc_39D_2,mfcc_39D_1,labels_phones_1,k);
p_1_2_39D = computeError(outClass,labels_phones_2);

outClass = knn(mfcc_39D_2,[mfcc_39D_1; mfcc_39D_3],[labels_phones_1 labels_phones_3],k);
p_13_2_39D = computeError(outClass,labels_phones_2);

% Beregn empirisk forventningsverdi og standard-
% avvik for treningssettet
xbar_2D = mean(mfcc_2D_1);
xbar_39D = mean(mfcc_39D_1);
s_2D = std(mfcc_2D_1);
s_39D = std(mfcc_39D_1);

% Normaliser data (bruker emprisk forventningsverdi og standardavvik til
% sett nr. 1 også for å normalisere sett nr. 2 og 3.)
for i = 1:39
    mfcc_39D_1(:,i) = (mfcc_39D_1(:,i)-mean(mfcc_39D_1(:,i)))/std(mfcc_39D_1(:,i));
    mfcc_39D_2(:,i) = (mfcc_39D_2(:,i)-mean(mfcc_39D_1(:,i)))/std(mfcc_39D_1(:,i));
    mfcc_39D_3(:,i) = (mfcc_39D_3(:,i)-mean(mfcc_39D_1(:,i)))/std(mfcc_39D_1(:,i));
end

% Gjenta testen med normaliserte data
outClass = knn(mfcc_39D_2,mfcc_39D_1,labels_phones_1,k);
p_1_2_39D_N = computeError(outClass,labels_phones_2);

outClass = knn(mfcc_39D_2,[mfcc_39D_1; mfcc_39D_3],[labels_phones_1 labels_phones_3],k);
p_13_2_39D_N = computeError(outClass,labels_phones_2);

% Vis resultater
fprintf('Estimerte feilrater\n')
fprintf('Treningssett\tTestsett\tp (uten normalisering)\tp´ (med normalisering)\n')
fprintf('1\t\t2\t\t%.4f\t\t\t%.4f\n',p_1_2_39D,p_1_2_39D_N)
fprintf('1,3\t\t2\t\t%.4f\t\t\t%.4f\n\n',p_13_2_39D,p_13_2_39D_N)

% Antall MFCC-vektorer i testsettet
ntest = length(mfcc_39D_2);

% Beregn konfidensintervaller
alpha = 0.05;
z = icdf('normal',1-alpha/2,0,1);

L_1_2_39D = p_1_2_39D_N - p_1_2_39D - z*sqrt(p_1_2_39D*(1-p_1_2_39D) + p_1_2_39D_N*(1-p_1_2_39D_N))/sqrt(ntest);
U_1_2_39D = p_1_2_39D_N - p_1_2_39D + z*sqrt(p_1_2_39D*(1-p_1_2_39D) + p_1_2_39D_N*(1-p_1_2_39D_N))/sqrt(ntest);

L_13_2_39D = p_13_2_39D_N - p_13_2_39D - z*sqrt(p_13_2_39D*(1-p_13_2_39D) + p_13_2_39D_N*(1-p_13_2_39D_N))/sqrt(ntest);
U_13_2_39D = p_13_2_39D_N - p_13_2_39D + z*sqrt(p_13_2_39D*(1-p_13_2_39D) + p_13_2_39D_N*(1-p_13_2_39D_N))/sqrt(ntest);

% Vis konfidensintervallene
fprintf('%i-prosent konfidensintervall for p`-p\n',100*(1-alpha))
fprintf('Treningssett\tTestsett\tKonfidensintervall\n')
fprintf('1\t\t2\t\t(%.4f,%.4f)\n',L_1_2_39D,U_1_2_39D)
fprintf('1,3\t\t2\t\t(%.4f,%.4f)\n',L_13_2_39D,U_13_2_39D)

