преобразование Хоттелинга не дает желаемого результата

Я хотел применить HOTELLING TRANSFORMATION к заданным векторам и попрактиковаться, поэтому я написал следующий код в Matlab.

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);

затем я проверил его на данной матрице

A

A =

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

и после запуска кода

[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

определенно это не диагональная матрица, так что не так? заранее спасибо


person dato datuashvili    schedule 25.12.2016    source источник
comment
Где вы нашли реализованный вами алгоритм? Те, кого я знаю, выглядят совсем по-другому. (Кроме того, в цикле for ii=1:n1 вы просто вычисляете транспонированное значение V, которое есть не что иное, как V')   -  person flawr    schedule 25.12.2016
comment
не могли бы вы сказать мне точную форму алгоритма? насчет транспонирования правильно я просто усложнил :D   -  person dato datuashvili    schedule 25.12.2016
comment
Ну, до сих пор я знал только об использовании разложения по сингулярным числам, которое, вероятно, немного более стабильно.   -  person flawr    schedule 25.12.2016


Ответы (1)


Поскольку вы имеете дело с векторами строк вместо векторов столбцов, вам необходимо скорректировать их в разложении собственного значения/собственного вектора. Вместо Y=A1*centered вам нужно Y=centered*V. Тогда вы получите

covariance_matrix =

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

Таким образом, вы получите два ненулевых компонента, чего можно было бы ожидать только от трех точек в трехмерном пространстве. (Они могут образовывать только плоскость, но не объем.)

person flawr    schedule 25.12.2016
comment
в книге, которую я читал, упоминалось о замене векторов-столбцов на векторы-строки, так что вы имеете в виду, что сначала мне нужно вычислить сингулярное разложение ковариационной матрицы, а затем правую сингулярную матрицу умножить на центрированную матрицу? - person dato datuashvili; 25.12.2016