function [koeficient_rozlisitelnosti, metody] = shlukova_analyza_umele_zdrojeAE(features_o, metoda_normalizace_hodnot, POPIS_SHLUKOVE_ANALYZY)
% funkce vypocita koeficient, ktery vystihuje schopnost identifikovat
% jednotlive shluky pro signaly generovanymi dvema "umelymi" zdroji AE.
% VSTUPNI
%   features_o - vstupni matice pro analyzu [udalost x dimenze]
%   metoda_normalizace_hodnot - nastaveni normalizace viz nize
%   POPIS_SHLUKOVE_ANALYZY - popis pro nazev figure

% nejprve je dobre pouzit normovani vstupnich features, k dispozici jsou metody :
% 'var'     kvadraticka odchylka hodnot je nomalizovana na hodnoty 0-1.
% 'range'   hodnoty jsou normalizovany na interval 0-1.
% 'log'     na hodnoty je aplikovan prirozeny logaritmus.   
% 'logistic'hodnoty jsou transformovany pomoci logisticke funkce do intervalu [0,1].
% 'histD'   metoda ekvalizace histogramu, hodnoty jsou ve skale [0,1].
% 'histC'   aproximace ekvalizace histogramu pomoci linearizace, hodnoty
% jsou ve skale [0,1].


features = som_normalize(features_o(:,:), metoda_normalizace_hodnot);    % proved normalizaci hodnot

% redukuj dimenze puvodni matice pomoci 4 metod
DimenNu = 3;
if (length(features_o(1,:)) < DimenNu), DimenNu = length(features_o(1,:));end
try [features_redukovane{1}] = compute_mapping(features,'PCA',DimenNu);    %PCA - analyza hlavnich komponent
catch disp('PCA selhalo'); features_redukovane{1} = zeros(128,DimenNu); end
% [features_redukovane{2}] = llex(features',7,2)';
try [features_redukovane{2}] = compute_mapping(features, 'LLE', DimenNu);
catch disp('LLE selhalo'); features_redukovane{2} = zeros(128,DimenNu); end
try [features_redukovane{3}] = compute_mapping(features, 'Laplacian', DimenNu, 12);
catch disp('LEM selhalo'); features_redukovane{3} = zeros(128,DimenNu); end
try [features_redukovane{4}] = compute_mapping(features, 'tSNE', DimenNu, 8);
catch disp('tSNE selhalo'); features_redukovane{4} = zeros(128,DimenNu); end

% shlukova analyza pomoci metody kmeans
for k = 1:4
%     [codes{k},clusters{k},err] = som_kmeans('batch', features_redukovane{k}, 2, 30);
    try [clusters{k},codes{k}] = kmeans(features_redukovane{k}, 2, 'distance', 'city', 'replicates', 30);
    catch clusters{k} = ones(128,1); end
end

%% vykresli vysledek
idx1 = [1:8,33:40, 65:72,97:104];
idx2 = setdiff([1:128],idx1);

metody = {'PCA', 'LLE', 'LEM','tSNE'};
font_size = 8;      % velikost fontu
line_width = 1.5;   % tloustka car

figure('PaperPosition', [0 0 14.5 10.0], 'PaperUnits','centimeters','PaperSize',[14.5 10.0]);
set(gcf, 'Name', POPIS_SHLUKOVE_ANALYZY);
for k=1:4
    subplot(2,2,k);
    
    if DimenNu == 2
        plot(features_redukovane{k}(clusters{k}==1,1),features_redukovane{k}(clusters{k}==1,2),'.b',features_redukovane{k}(clusters{k}==2,1),features_redukovane{k}(clusters{k}==2,2),'.r');
        hold on
        if (length(features_redukovane{k}(:,1))==128)
            plot(features_redukovane{k}(idx1,1),features_redukovane{k}(idx1,2),'ok',features_redukovane{k}(idx2,1),features_redukovane{k}(idx2,2),'og');
        end
        hold off;
    else
        plot3(features_redukovane{k}(clusters{k}==1,1),features_redukovane{k}(clusters{k}==1,2),features_redukovane{k}(clusters{k}==1,3),'.b',features_redukovane{k}(clusters{k}==2,1),features_redukovane{k}(clusters{k}==2,2),features_redukovane{k}(clusters{k}==2,3),'.r');
        hold on
        if (length(features_redukovane{k}(:,1))==128)
            plot3(features_redukovane{k}(idx1,1),features_redukovane{k}(idx1,2),features_redukovane{k}(idx1,3),'ok',features_redukovane{k}(idx2,1),features_redukovane{k}(idx2,2), features_redukovane{k}(idx2,3),'og');
        end
        hold off;
        zlabel('3.komponenta','FontSize',font_size+1);
        
    end
    set(gca,'XMinorGrid','off','YMinorGrid','off','FontSize',font_size);
    ylabel('2.komponenta','FontSize',font_size+1);
    xlabel('1.komponenta','FontSize',font_size+1);
    title(metody{k});
    
    
        
end;
drawnow;



% vypocitej vzdalenosti
koeficient_rozlisitelnosti = zeros(4,1);
for k = 1:4;
    
    plselA = features_redukovane{k} ( clusters{k}(1:size(features_redukovane{k},1)) ==1, :);
    plselB = features_redukovane{k} ( clusters{k}(1:size(features_redukovane{k},1)) ==2, :);
    dist = zeros(size(plselA,1), size(plselB,1));
    for A=1:size(plselA)
        for B=1:size(plselB)
            da = plselA(A,1) - plselB(B,1);
            db = plselA(A,2) - plselB(B,2);
            dist(A,B) = sqrt (da^2 + db^2);
            if (DimenNu == 3), dc = plselA(A,3) - plselB(B,3);dist(A,B) = sqrt (da^2 + db^2+ dc^2);end
        end;
    end;
    
    dmin = min(min(dist));
    dmax = max(max(dist));
    koeficient_rozlisitelnosti(k) = dmin/dmax;
%     disp( [reductypes{red} ':  ' num2str(dmin/dmax,2)]);
    
end;

% vyhodnot data
for k =1:4
    if length(find(clusters{k}==1))>length(find(clusters{k}==2))
        goodNu = length(clusters{k})-length(setdiff(idx2, find(clusters{k}==1)));
    else
        goodNu = length(clusters{k})-length(setdiff(idx2, find(clusters{k}==2)));
    end
    
    if (abs((goodNu./128 * 100))< 90), koeficient_rozlisitelnosti(k) = 0; end
end



return 