% APRENDIZAJE AUTOMÁTICO: UN ENFOQUE PRÁCTICO
% Autores: María Guijarro, P. Javier Herrera y Gonzalo Pajares
% Copyright RA-MA, 2010
% Capítulo 3: COMBINACIÓN DE CLASIFICADORES

function [v,DATOS_CLASES] = validacion_particion(c,peso_exp,crit_term,max_iter,DATOS_CLASES,handles)

global X;

% Generacion del vector X, de nuevo a partir de las clases
% Se obtiene además una estima (vEstimados, media para cada clase)
hh = 0;
for ii=1:1:c
    muestras_clase = DATOS_CLASES(ii).numero_muestras;
    for jj=1:muestras_clase
        hh = hh + 1;
        X(hh,:) = DATOS_CLASES(ii).muestras(jj,:);
    end
    vEstimados(ii,:) = mean(DATOS_CLASES(ii).muestras);
end

% normalizacion al rango [0,1]
MI=min(X); %minimo
MA=max(X); %maximo
X=(X-repmat(MI,size(X,1),1))./(repmat(MA,...
    size(X,1),1)-repmat(MI,size(X,1),1));

vEstimados = (vEstimados-repmat(MI,size(vEstimados,1),1))./(repmat(MA,... %para usarlos posteriormente
    size(vEstimados,1),1)-repmat(MI,size(vEstimados,1),1));

% los datos han sido ya clasificados, por tanto los centros de las clases se
% inicializarán a las medias de la clasificación obtenida

DatosClasificados = true;
[v,U, distancia, iteraciones, Jcost] = fuzzy_clustering (X,c,peso_exp,crit_term,vEstimados,DatosClasificados,max_iter);

CvalidezFuzzy = validezFuzzy(X,v,U,distancia,peso_exp,c);

%desnormalización de v
v = (repmat(MA,size(v,1),1) - repmat(MI,size(v,1),1)).*v + ...
    repmat(MI,size(v,1),1);

for i=1:1:c
    DATOS_CLASES(i).vFuzzy = v(i,:);
    DATOS_CLASES(i).UFuzzy = U(i,:);
end

% Clasificador Bayesiano
DATOS_CLASES = Bayesian(DATOS_CLASES, c);
[Divergencia, Coseno_alpha, Jeffries_Matusita] = validezBayesian(DATOS_CLASES,c);


p1 = ['El número de clases obtenido ha sido: ',num2str(c)];
% se muestran por pantalla los diferentes coeficientes de validez Fuzzy
p2 = 'Coeficientes Fuzzy ....';
p3 = ['Coeficiente de partición   (CP): ',num2str(roundn(CvalidezFuzzy.CP,-4))];
p4 = ['Coeficiente de entropía    (CE): ',num2str(roundn(CvalidezFuzzy.CE,-4))];
p5 = ['Índice de partición        (SC): ',num2str(roundn(CvalidezFuzzy.SC,-4))];
p6 = ['Índice de partición        (S) : ',num2str(roundn(CvalidezFuzzy.S,-4))];
p7 = ['Índice de Xie-Beni         (XB): ',num2str(roundn(CvalidezFuzzy.XB,-4))];
p8 = ['Índice de Dunn             (ID): ',num2str(roundn(CvalidezFuzzy.ID,-4))];
p9 = ['Índice de Dunn Alternativo (IDA): ',num2str(roundn(CvalidezFuzzy.IDA,-4))];
p10 = 'Coeficientes de Bayes ....';

pFuzzy = [p1,char(10),char(10),char(10),p2,char(10),char(10),p3,char(10),...
    p4,char(10),p5,char(10),p6,char(10),p7,char(10),p8,char(10),...
    p9,char(10),char(10),char(10),p10,char(10),char(10),];

if (c <= 3)
    % SE MUESTRAN LOS RESULTADOS EN EL CUADRO DE INFORMACIÓN SI EL NÚMERO DE
    % CLASES ES MENOR O IGUAL A 3:    
    p11 = 'Divergencia: ';
    p12 = num2str(roundn(Divergencia,-4)); % Redondeamos a 4 decimales como mucho.
    p13 = 'Coseno Alpha: ';
    p14 = num2str(roundn(Coseno_alpha,-4));
    p15 = 'Jeffries Matussita: ';
    p16 = num2str(roundn(Jeffries_Matusita,-4));

    % La dimensión de las matrices depende del número de clases obtenidas:
    matDiv = '';
    matCos = '';
    matJef = '';
    tamMatrices = size(Divergencia,1);
    for i=1:1:tamMatrices
        matDiv = [matDiv,p12(i,:),char(10)];
        matCos = [matCos,p14(i,:),char(10)];
        matJef = [matJef,p16(i,:),char(10)];
    end

    pBayes = [p11,char(10),matDiv,char(10),...
        p13,char(10),matCos,char(10),p15,char(10),matJef];
else
    pBayes = 'Debido a las dimensiones de los resultados de los Coeficientes de Bayes para un número de clases superior a 3, los resultados no se muestran aquí.';
end

pp = [pFuzzy,pBayes,char(10),char(10),'Todos los resultados se encuentran en el archivo ''resultados_aprendizaje.txt''.'];
set(handles.text20,'String',pp); % Cuadro de información


% GUARDAMOS EN UN FICHERO DE TEXTO:

[fi,texto] = fopen('resultados_aprendizaje.txt','w');

fprintf(fi,'El número de clases obtenido ha sido: %d\n\n\n',c);
% se guardan los diferentes coeficientes de validez Fuzzy
fprintf(fi,'Coeficientes Fuzzy ....\n\n');
fprintf(fi,'Coeficiente de partición   (CP):%f\n',CvalidezFuzzy.CP);
fprintf(fi,'Coeficiente de entropía    (CE):%f\n',CvalidezFuzzy.CE);
fprintf(fi,'Índice de partición        (SC):%f\n',CvalidezFuzzy.SC);
fprintf(fi,'Índice de partición        (S) :%f\n',CvalidezFuzzy.S);
fprintf(fi,'Índice de Xie-Beni         (XB):%f\n',CvalidezFuzzy.XB);
fprintf(fi,'Índice de Dunn             (ID):%f\n',CvalidezFuzzy.ID);
fprintf(fi,'Índice de Dunn Alternativo (IDA):%f\n',CvalidezFuzzy.IDA);
fprintf(fi,'\n\n');


tamMatrices = size(Divergencia,1);
fprintf(fi,'Coeficientes de Bayes ....\n\n');
fprintf(fi,'Divergencia:\n');
for i=1:1:tamMatrices
    for j=1:1:tamMatrices
        fprintf(fi,'%f   ',Divergencia(i,j));
    end
    fprintf(fi,'\n');
end
fprintf(fi,'\n');

fprintf(fi,'Coseno Alpha:\n');
for i=1:1:tamMatrices
    for j=1:1:tamMatrices
        fprintf(fi,'%f   ',Coseno_alpha(i,j));
    end
    fprintf(fi,'\n');
end
fprintf(fi,'\n');

fprintf(fi,'Jeffries Matussita:\n');
for i=1:1:tamMatrices
    for j=1:1:tamMatrices
        fprintf(fi,'%f   ',Jeffries_Matusita(i,j));
    end
    fprintf(fi,'\n');
end

st = fclose(fi);