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
n1=10; %počet trénovacích záznamů identifikovaných osob
n0=5; %počet trénovacích ostatních osob

s0=0;r0=0;F1celk=0;
stromu=40;
for k=1:300
zaznamID1=[];testovaci1=[];
for c=1:length(vice)
    id=vice(c);
    zaznamID=[];
    vahaPriznaku=zeros(1,priznaku);
    for i=length(priznaky):-1:1
        if priznaky(i,priznaku+1)==id
            zaznamID=[zaznamID; priznaky(i,:)];
        end
    end
    lID1=size(zaznamID,1);
    lo=randperm(lID1);
    zaznamID1=[zaznamID1;zaznamID(lo(1:n1),:)];
    testovaci1=[testovaci1;zaznamID(lo(n1+1:end),:)];
end
    zaznamElse=[];
    for i=length(priznaky):-1:1
        p=0;
        for h=1:length(vice)
            if priznaky(i,priznaku+1)==vice(h)
                break
                p=0;
            else
                p=p+1;
            end
        end
        if p==length(vice)
            zaznamElse=[zaznamElse; priznaky(i,:)];
        end
    end
    zaznamElse(:,priznaku+2)=zaznamElse(:,priznaku+1);zaznamElse(:,priznaku+1)=0;lElse=size(zaznamElse,1);
    
    lo=los(length(lideElse));
    lidetren=lideElse(lo(1:n0));
    lidetest=lideElse(lo(n0+1:end));
    testovaci0=[];trenovaciSet=zaznamID1;
        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(stromu,trenovaciSet(:,1:priznaku),trenovaciSet(:,priznaku+1),'Method','classification','OOBPrediction','on');
        label1=predict(Model,testovaci1(:,1:priznaku));
        label0=predict(Model,testovaci0(:,1:priznaku));
        [N,TR]=pocitac(label0,'0');
        TA=1-TR;
        for i=1:length(vice)
            [pocet0(i),~]=pocitac(label0,num2str(vice(i)));
        end
        
        for i=1:length(label1)
            vysledek(i,1)=str2num(label1{i});
            vysledek(i,2)=testovaci1(i,17);
        end
        for i=1:length(vice)
            vysledek(vysledek==vice(i))=i;
            
        end
        resul=zeros(length(vice)+1);
        for i=1:length(label1)
            if vysledek(i,1)==0
                resul(vysledek(i,2),length(vice)+1)=resul(vysledek(i,2),length(vice)+1)+1;
            else
                resul(vysledek(i,2),vysledek(i,1))=resul(vysledek(i,2),vysledek(i,1))+1;
            end
        end
        
        resul(length(vice)+1,:)=[pocet0 N];
        s=0;
        for i=1:length(vice)
            s=s+resul(i,i);
        end
        precision=s/(s+sum(resul(length(vice)+1,1:length(vice))));
        
        s=s/sum(sum(resul(1:length(vice),1:length(vice)+1)));
        F1=2*precision*s/(precision+s);
        r=resul(length(vice)+1,length(vice)+1)/sum(resul(length(vice)+1,:));
%         [n0 r N s]
        s0=s0+s;
        r0=r0+r;
        F1celk=F1celk+F1;

end
s0=s0/300;
r0=r0/300;
F1celk=F1celk/300;
