% APRENDIZAJE AUTOMÁTICO: UN ENFOQUE PRÁCTICO
% Autores: Gonzalo Pajares, María Guijarro, P. Javier Herrera y Jesús M. de la Cruz
% Copyright RA-MA, 2010
% Capítulo 2: APRENDIZAJE ESTADÍSTICO

function [y,vq,Vq,Dq] = Componentes_principales(X,v,q,c)

% Entradas:
% X: matriz de datos de entrada
% v: centro de los clústeres
% q: proyección a la dimensión q
% c: número de clústeres

%Salidas:
% y:  proyección de los datos de salida (eq (2.83) libro Vsión computador)
% vp: proyección de los centros de los clústeres
% V:  autovectores
% D: autovalores

[N,n]=size(X);

% calcular la matriz de autocorrelación
  A = zeros(n);
  me = zeros(1,n);
  for i=1:n, 
    me(i) = mean(X(isfinite(X(:,i)),i)); 
    X(:,i) = X(:,i) - me(i); 
  end  
  for i=1:n, 
    for j=i:n, 
      cc = X(:,i).*X(:,j); cc = cc(isfinite(c));
      C(i,j) = sum(cc)/length(cc); C(j,i) = C(i,j); 
    end
  end
  
  % autovectores, ordenados de acuerdo a sus autovalores y normalizados
  [V,S]   = eig(C);
  eigval  = diag(S);
  [Y,ind] = sort(abs(eigval)); 
  eigval  = eigval(flipud(ind));
  V       = V(:,flipud(ind)); 
  for i=1:q
     V(:,i) = (V(:,i) / norm(V(:,i)));
  end
  
  % considerar sólo los q primeros autovectores
  Vq = V(:,1:q);
  D = abs(eigval)/sum(abs(eigval));
  Dq = D(1:q); 

% proyectar los datos utilizando los primeros q autovectores
y = X*Vq;
%centros de los clústers
vq = (v-me(ones(c,1),:))*Vq;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
