2016-12-25 1 views
0

je voulais appliquer hotelling TRANSFORMATIONS aux vecteurs de donner et de faire pratiquer mon auto, que pourquoi je l'ai écrit le code suivant dans Matlabtransformation Hotteling il ne donne pas résultat désiré

function [Y covariance_matrix]=hotteling_trasform(X) 
% this function take X1,X2,X3,,Xn as a matrix and apply hottleing 
%transformation to get new set of vectors y1, y2,..ym so that covariance 
%matrix of matrix consiist by yi vectors are almost diagonal 
%% determine size of given matrix 
[m n]=size(X); 
%% compute mean of columns of given matrix 
means=mean(X); 
%% substract mean from given matrix 
centered=X-repmat(means,m,1); 
%% calculate covariance matrix 
covariance=(centered'*centered)/(m-1); 
%% Apply eigenvector decomposition 
[V,D]=eig(covariance); 
%% determine dimension of V 
[m1 n1]=size(V); 

%% arrange matrix so that eigenvectors are as rows,create matrix with size n1 m1 
A1=zeros(n1,m1); 
for ii=1:n1 
    A1(ii,:)=V(:,ii); 
end 
%% applying hoteling transformation 
Y=A1*centered; %% because centered matrix is original -means 
%% calculate covariance matrix 
covariance_matrix=cov(Y); 

alors je l'ai testé à la étant donné la matrice

A 

A = 

    4  6 10 
    3 10 13 
    -2 -6 -8 

et après l'exécution de code

[Y covariance_matrix]=hotteling_trasform(A); 
covariance_matrix 

covariance_matrix = 

    8.9281 22.6780 31.6061 
    22.6780 66.5189 89.1969 
    31.6061 89.1969 120.8030 

certainement ce n'est pas une matrice diagonale, alors qu'est-ce qui ne va pas? merci à l'avance

+0

Où avez-vous trouvé l'algorithme que vous avez implémenté? Ceux que je connais ont l'air assez différents. (Aussi dans la boucle 'for ii = 1: n1' vous calculez simplement la transposée de' V', qui n'est autre que 'V'') – flawr

+0

pourriez-vous me dire la forme exacte de l'algorithme? à propos de transposer à droite je viens de compliqué: D –

+0

Eh bien jusqu'à présent, je n'étais conscient de l'utilisation de la décomposition de la valeur singulière, qui est probablement un peu plus stable. – flawr

Répondre

1

Comme vous avez affaire à vecteurs de ligne au lieu de colonne vecteurs dont vous avez besoin pour tenir compte dans la valeur propre/vecteur propre-decomposiiton. Au lieu de Y=A1*centered, vous avez besoin de Y=centered*V. Ensuite, vous aurez donc

covariance_matrix = 

    0.0000 -0.0000 0.0000 
    -0.0000 1.5644 -0.0000 
    0.0000 -0.0000 207.1022 

vous obtiendrez deux composants nonzéro qui est ce que vous pourriez attendre de seulement trois points dans l'espace 3D. (Ils peuvent seulement former un plan, mais pas un volume.)

+0

dans le livre que j'ai lu, il a été mentionné de changer les vecteurs colonne en vecteurs de ligne, donc vous voulez dire que je dois d'abord décomposer la matrice de covariance et ensuite multiplier la matrice singulière vers la matrice centrée? –

+0

Je l'ai eu, merci d'avance –