//calculo da PCA (rotacao para os eixos principais)
mode(0);//evita o ecoo dos comandos no prompt do scilab
clc;
//Dados duas dimensoes (x,y) mx2 
Data = [2.5 2.4;
        0.5 0.7;
        2.2 2.9;
        1.9 2.2;
        3.1 3.0;
        2.3 2.7;
        2.0 1.6;
        1.1 1.0;
        1.5 1.6;
        1.1 0.9];
u=mean(Data,'r');//toma a media
//DataAdjust(:,1)=Data(:,1) - u(1);//x - mediax 
//DataAdjust(:,2)=Data(:,2) - u(2);//y - mediay
DataAdjust = Data - ones(n,1)*u
K=cov(Data);//calculo da matriz de covariancia
//calculo dos autovetores e autovalores da matriz de covariancia
                   //     
[v,lambda]=spec(K);// v*lambda = K
                   //
v
lambda
input('<ENTER>');
//os autovalores se encontram na diagonal, dai toma-se a diagonal
lamb=diag(lambda);

//ordena-se os autovalores por ordem decrescente
[lb,ind]=mtlb_sort(lamb,1,'descend');

//toma os autovetores de acordo com a ordem decrescente dos autovalores
NewVet=v(:,ind);//Cada vetor é um vetor coluna, mx1
                //Os vetores são os novos eixos, perpendiculares entre si  
//calculo dos eixos para plotagem, 

rmax=[u-10*(NewVet(:,1)).'; u+10*(NewVet(:,1)).'];
rmin=[u-10*(NewVet(:,2)).'; u+10*(NewVet(:,2)).'];

//*************************************************************************
//Rotacionando dados ajustados
//*************************************************************************
RowFeature=NewVet.';//Matriz transposta dos autovetores para PCA
                    //         |    |                     -V1-
                    //Antes   V1   V2  transposto ==>  
                    //         |    |                     -V2- 
RowDataAdjust=DataAdjust.';//Matriz dados ajustados para PCA. De mxn para nxm
FinalDataAdjust=(RowFeature*RowDataAdjust).';//Dados ajustados rotacionados 
                                             //  -V1-      -X-
                                             //        * 
                                             //  -V2-      -y-
                                             
//AutoVet(n,n)' x Dados(m,n)' = NovosDados(n,m)'=DadoRotacionados(m,n)
//*************************************************************************
//Impressao dos dados brutos
//*************************************************************************
scf();subplot(2,2,1);plot2d(Data(:,1),Data(:,2),rect=[-1,-1,4,4],style=-4);
plot2d(rmax(:,1),rmax(:,2),rect=[-1,-1,4,4],style=2);
plot2d(rmin(:,1),rmin(:,2),rect=[-1,-1,4,4],style=5);xtitle('Dados brutos');
set(gca(),"grid",[1,1]);
a=gca();
p=a.children.children(2);
p.thickness=2;
rmax=[-10*(NewVet(:,1)).'; 10*(NewVet(:,1)).'];
rmin=[-10*(NewVet(:,2)).'; 10*(NewVet(:,2)).'];
subplot(2,2,2);
plot2d(DataAdjust(:,1),DataAdjust(:,2),rect=[-2,-2,2,2],style=-4);
plot2d(rmax(:,1),rmax(:,2),rect=[-2,-2,2,2],style=2);
plot2d(rmin(:,1),rmin(:,2),rect=[-2,-2,2,2],style=5);
xtitle('Dados ajustados (media zero)');
set(gca(),"grid",[1,1]);
a=gca();
p=a.children.children(2);
p.thickness=2;

//***************************************************************************
//Rotacionando dados ajustados.
//Caso queiramos cortar algum dado, simplesmente cortamos os autovetores 
//menos significativos. O resultado será uma matriz de dados com menos 
//dimensoes (colunas). Exemplo: Se temos colunas (x,y), teremos dois 
//autovetores, cortando o ultimo e multiplicando este pela matriz original
//aparecera somente os dados x
//***************************************************************************
FinalData=((NewVet.')*(Data.')).'; //DadosRotacionados=(Autovet.'*Dados.').'
udat=mean(FinalData,'m');
xdat=[-1 udat(2);5 udat(2)];
ydat=[udat(1) -1;udat(1) 4];

//plotagem dos dados no grafico
subplot(2,2,3);plot2d(FinalData(:,1),FinalData(:,2),rect=[-1,-1,4,4],style=-4);
//Matriz de eixos principais para plotagem
plot2d(xdat(:,1),xdat(:,2),rect=[-1,-1,4.5,4],style=2);
plot2d(ydat(:,1),ydat(:,2),rect=[-1,-1,4.5,4],style=5);
xtitle("DadosRotacionados=([Autovetores]T.[Dados]T)T");
set(gca(),'grid',[1,1]);
a=gca();
p=a.children.children(2);
p.thickness=3;
rmax=[-2 0; 2 0];//eixos x e y normais
rmin=[-0 -2; 0 2];
subplot(2,2,4);
plot2d(FinalDataAdjust(:,1),FinalDataAdjust(:,2),rect=[-2,-2,2,2],style=-4);
plot2d(rmax(:,1),rmax(:,2),rect=[-2,-2,2,2],style=2);
plot2d(rmin(:,1),rmin(:,2),rect=[-2,-2,2,2],style=5);
xtitle('Dados media zero rotacionados pelo maior eixo (grosso)');
set(gca(),"grid",[1,1]);
a=gca();
p=a.children.children(2);
p.thickness=3;
