% 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 [DATOS_CLASES,c] = algoritmo_cuantizacion_vectorial()

global X X1;
global umb_dif_clases;

% se ha elegido la opción de determinar el número de clústeres de forma
% automática a través del algoritmo de cuantización vectorial
[N,n] = size(X);

% inicialización
DATOS_CLASES(1).centroCVectorial = X1(1,:);
DATOS_CLASES(1).muestras(1,:)    = X1(1,:);
DATOS_CLASES(1).numero_muestras = 1; %numero de patrones
c = 1; %numero de clases

for j=2:1:N % punto B: número de muestras
    % se computa la distancia del nuevo patron a los centros
    nueva_clase = false;
    for h=1:1:c
        d(h) = norm(X1(j,:)-DATOS_CLASES(h).centroCVectorial);
    end

    %calcular la distancia mínima a los centros de cada clase, con indicación de la clase (h)
    dmin = min(d);
    h = find(d == dmin);

    % si esa distancia mínima es inferior a un umbral determinado, añadir el
    % patrón a la clase, de otro modo crear una nueva clase
    if dmin < umb_dif_clases
        DATOS_CLASES(h).numero_muestras = DATOS_CLASES(h).numero_muestras + 1;
        DATOS_CLASES(h).muestras(DATOS_CLASES(h).numero_muestras,:) = X1(j,:);
        % en este caso se recalculan los centros de la clase como el
        % valor medio
        DATOS_CLASES(h).centroCVectorial = mean(DATOS_CLASES(h).muestras);

    else % hay que crear una nueva clase
        nueva_clase = true;
    end

    % creación de la nueva clase
    if nueva_clase
        c = c + 1;
        DATOS_CLASES(c).numero_muestras  = 1;
        DATOS_CLASES(c).muestras(1,:)    = X1(j,:);
        DATOS_CLASES(c).centroCVectorial = X1(j,:);

    end

end % punto B