Hola
[email protected] !!!
Este es un cógido de PCA implementado en MATLAB con dos nubes aleatorias (X1X2), lo que hace es mapear a un nuevo espacio representado por las rectas que se muestran en la figura.
Tambien se puede hacer con la nube X1 que está comentada....
Hasta luego,
José Armando.
% ------------------------------------------------------
clc
%X1 = [2 1.5 0.7 0.5 0.5 0.7; 2 0.5 0.5 1.5 0.7 0.7]';
X1 = [randn(1,20); randn(1,20)]';
X2 = [randn(1,10); randn(1,10)]';
[fX1,cX1]=size(X1);
[fX2,cX2]=size(X2);
s1 = cov(X1);
s2 = cov(X2);
lamda1 = eig(s1);
lamda2 = eig(s2);
ec1 = s1 - max(lamda1)*eye(cX1);
[fil1,col1]=size(ec1);
a1=[1;ec1(1:fil1-1,2:col1)^-1*(-ec1(1:fil1-1,1))];
a1=a1/norm(a1);
ang1 = atan2(a1(2),a1(1));
z1=X1*a1;
z1_x=z1*cos(ang1);
z1_y=z1*sin(ang1);
ec2 = s2 - max(lamda2)*eye(cX2);
[fil2,col2]=size(ec2);
a2=[1;ec2(1:fil2-1,2:col2)^-1*(-ec2(1:fil2-1,1))];
a2=a2/norm(a2);
ang2 = atan2(a2(2),a2(1));
z2=X2*a2;
z2_x=z2*cos(ang2);
z2_y=z2*sin(ang2);
min_x1=min(z1_x);
max_x1=max(z1_x);
plot(X1(:,1),X1(:,2),'*');
hold on;
plot([0 a1(1)],[0 a1(2)]);
plot([min_x1 max_x1],[(a1(2)/a1(1))*min_x1 (a1(2)/a1(1))*max_x1],'--');
plot(z1_x,z1_y,'or')
min_x2=min(z2_x);
max_x2=max(z2_x);
plot(X2(:,1),X2(:,2),'*g');
plot([0 a2(1)],[0 a2(2)],'g');
plot([min_x2 max_x2],[(a2(2)/a2(1))*min_x2 (a2(2)/a2(1))*max_x2],'--g');
plot(z2_x,z2_y,'ok')
% ------------------------------------------------------