load priznaky.mat
priznakyPopis=categorical({'QR','RS','RT','PR','PoffsetR','Delka vlny P','PQ','PonsetQ','PoffsetQ','QToffset','SToffset','ST','PT','RP amp','RT amp','PR var'});
priznakyPopis=reordercats(priznakyPopis,{'QR','RS','RT','PR','PoffsetR','Delka vlny P','PQ','PonsetQ','PoffsetQ','QToffset','SToffset','ST','PT','RP amp','RT amp','PR var'});
priznaku=16;
ID=priznaky(:,priznaku+1);
lide=unique(ID);
vice=[];kolik=[];
for i=1:length(lide)
    if sum(ID==lide(i))>10
        vice=[vice;lide(i)];
        kolik=[kolik;lide(i),sum(ID==lide(i))];
    end
end
lideElse=lide(lide~=vice(1));
for i=1:length(vice)
    lideElse=lideElse(lideElse~=vice(i));
end

for c=1:length(vice)
    id=vice(c);
    zaznamElse=[];zaznamID=[];zaznamID2=[];
    vahaPriznaku=zeros(1,priznaku);
    for i=length(priznaky):-1:1
        if priznaky(i,priznaku+1)==id
            zaznamID=[zaznamID; priznaky(i,:)];
        else
            for h=vice
                if priznaky(i,priznaku+1)==h
                    zaznamID2=[zaznamID2; priznaky(i,:)];
                else
                    zaznamElse=[zaznamElse; priznaky(i,:)];
                end
            end
        end
    end
    zaznamElse(:,priznaku+2)=zaznamElse(:,priznaku+1);zaznamElse(:,priznaku+1)=0;lElse=size(zaznamElse,1);
    zaznamID(:,priznaku+1)=1;lID1=size(zaznamID,1);
    zaznamID2(:,priznaku+1)=0;lID2=size(zaznamID2,1);
    % N=[80 80 80 60 40 40 80 60 40;80 120 160 80 80 40 100 100 100];
    
    n1=floor(kolik(c,2)*0.9); %počet trénovacích záznamů verifikované osoby
    n0=12;%počet ostatních osob, jejichž záznamy jsou použity pro trénování
%     if kolik(c,2)>40
%         n0=40;
%     elseif kolik(c,2)>24
%         n0=30;
%     elseif kolik(c,2)~=12
%         n0=20;
%     else
%         n0=12;
%     end
% %      n0=60;   
    
    experimentTA=0;experimentTR=0;experimentOOBError=0;
    for k=1:300
        lo=randperm(lID1);
        trenovaciSet=zaznamID(lo(1:n1),:);
        testovaci1=zaznamID(lo(n1+1:end),:);
    %     lo=randperm(lID2);
    %     trenovaciSet=zaznamID2(lo(1:n1),:);
    %     testovaci1=zaznamID2(lo(n1+1:end),:);

        lo=los(length(lideElse));
        lidetren=lideElse(lo(1:n0));
        lidetest=lideElse(lo(n0+1:end));
        testovaci0=[];
        for i=1:lElse
            if isempty(lidetren(lidetren==zaznamElse(i,priznaku+2)))
                testovaci0=[testovaci0;zaznamElse(i,1:priznaku+1)];
            else
                trenovaciSet=[trenovaciSet; zaznamElse(i,1:priznaku+1)];
            end
        end

        Model=TreeBagger(40,trenovaciSet(:,1:priznaku),trenovaciSet(:,priznaku+1),'Method','classification','OOBPrediction','on');
        label1=predict(Model,testovaci1(:,1:priznaku));
        label0=predict(Model,testovaci0(:,1:priznaku));

        [~,TrueAcceptance]=pocitac(label1,'1');
        [~,TrueRejection]=pocitac(label0,'0');
        FalseAcceptance=1-TrueRejection;
        FalseRejection=1-TrueAcceptance;

        vahaPriznaku=vahaPriznaku+Model.NumPredictorSplit;
        experimentTA=experimentTA+TrueAcceptance;
        experimentTR=experimentTR+TrueRejection;
        experimentOOBError=experimentOOBError+mean(oobError(Model));

    end
    TA(c)=experimentTA/k, TR(c)=experimentTR/k, FA(c)=1-TR(c), FR(c)=1-TA(c), oobE(c)=experimentOOBError/k
%     TA(ho)=experimentTA/k, TR(ho)=experimentTR/k, FA(ho)=1-TR(ho), FR(ho)=1-TA(ho), oobE(ho)=experimentOOBError/k
    
    figure
    bar(priznakyPopis,vahaPriznaku)
    title(['Váha jednotlivých příznaků, ID: ',num2str(id)],'FontSize',15)
    ylabel('Počet rozdělení příznakového prostoru','FontSize',15)

end
