PCA генерира първоначална матрица в гаус и елипса?

Трябва да направя PCA в Matlab за разпознаване на обекти.

Засега генерирам матрица на случаен принцип

 [a,InputMatrix] = sort(rand(100,20)); %Rows=100 Columns=20
 Average=mean(InputMatrix);
 CovarianceMatrix= cov(InputMatrix);
 %% Compute the Eigen Value and Eigen the Vector
 [EigVector,EigValue] = eigs(Matlab_Covariance);
 NewMatrix=(EigVector)*(EigValue)*(EigVector)';

 e1=EigVector(:,1); % Get the all the row at the first column
 e2=EigVector(:,2); % Get the all the row at the second column


 %% Plotting The Matrix with Eigen Value and Eigen Vector

 %creating all combinations of x and y coordinates
 [x,y]=meshgrid(1:size(InputMatrix,2),1:size(InputMatrix,1)); % 2= Columns 1= Rows
 x=x(:);
 y=y(:);

%plotting values of A such that X-Y axis represent the column and row coordinates of A
%respectively. Z-axis represents the value at that coordinate.
scatter3(x,y,InputMatrix(:),30,'rx');

%plotting the mean at the center of the coordinate system
hold on;

scatter3(mean([1:size(InputMatrix,2)]),mean([1:size(InputMatrix,1)]),
mean2(InputMatrix),60,'go','filled');
plot(e1,'k--');
plot(e2,'k--');

Но ако изпълня PCA в тази произволна матрица (InputMatrix), формата на собствените вектори e1 и e2, които получавам за PCA резултата, ще бъде грешна (когато ги начертая с InputMatrix на същата фигура).

**PCA изход**

Някой ми каза, че за входната матрица/данни, тя трябва да отговаря на условието (да бъде разпределена в нормален Гаус) и във форма на елипса (когато я начертая). Мисля, че трябва да направя ротация, мащабиране и други неща, за да го направя..

но не разбирам..

Може ли smeone да ми помогне да генерирам произволна матрица с нормален Гаус и във форма на елипса?? Моля.. помогнете ми T_T


person user3303896    schedule 18.02.2014    source източник


Отговори (1)


Това може да се постигне чрез умножаване на матрицата на скритите компоненти на шумови вектори, т.е. д., използвайки основния модел ICA. За да получите по-голяма размерност, просто променете cnum.

close all; clear all;

cnum = 2;
nnum = 500;
C = rand(cnum, cnum); % hidden components
N1 = sort(rand(cnum, nnum)); % sorted uniform noise
D1 =  C * N1; % data
N2 = rand(cnum, nnum); % uniform noise
D2 =  C * N2; % data
N3 = randn(cnum, nnum); % Gaussian noise
D3 =  C * N3; % data

[V1, R1] = eig(cov(D3'));
[V2, R2] = eig(cov(D3'));
[V3, R3] = eig(cov(D3'));

subplot(1, 3, 1);
axis equal
hold on
plot(D1(1,:), D1(2,:), '.');
line([C(1, 1) 0 C(1, 2)], [C(2, 1) 0 C(2, 2)], 'Color', [1 .0 .0])
line([V1(1, 1) 0 V1(1, 2)], [V1(2, 1) 0 V1(2, 2)], 'Color', [.0 .0 .0])
title('Sorted uniform')

subplot(1, 3, 2);
axis equal
hold on
plot(D2(1,:), D2(2,:), '.');
line([C(1, 1) 0 C(1, 2)], [C(2, 1) 0 C(2, 2)], 'Color', [1 .0 .0])
line([V2(1, 1) 0 V2(1, 2)], [V2(2, 1) 0 V2(2, 2)], 'Color', [.0 .0 .0])
title('Uniform')

subplot(1, 3, 3);
axis equal
hold on
plot(D3(1,:), D3(2,:), '.');
line([C(1, 1) 0 C(1, 2)], [C(2, 1) 0 C(2, 2)], 'Color', [1 .0 .0])
line([V3(1, 1) 0 V3(1, 2)], [V3(2, 1) 0 V3(2, 2)], 'Color', [.0 .0 .0])
title('Gaussian')

print('-dpng', 'pca.png')

Резултат

Червените линии представляват скрити компоненти, а черните линии представляват PCA компоненти.

person divanov    schedule 18.02.2014
comment
Моля, вижте актуализацията на моя въпрос с пълния код и изходното изображение, което получих!! Как да приложа вашия код в My code?? Получих грешка!! - person user3303896; 18.02.2014
comment
Вече използвах randn вместо rand. Но все още дава грешен резултат при начертаването на e1 & e2.. можете ли да погледнете моя код и да ми кажете в коя част съм направил грешни неща.. Моля - person user3303896; 18.02.2014
comment
Защото, когато премахна тази команда за сортиране от моя код, получавам тази грешка Грешка при използване на randn Твърде много изходни аргументи. - person user3303896; 18.02.2014
comment
Да, вече заменям кода си с InputMatrix= rand(100,20); %Редове=100 Колони=20, но изчертаните e1 и e2 са еднакви (все още грешка) - person user3303896; 18.02.2014
comment
2 е броят на компонентите на измерението/PCA, а 500 е броят на точките за данни. - person divanov; 18.02.2014
comment
имаш предвид Eigen Vector 1-ва колона и 2-ра колона? Но моите данни ще бъдат матрица, не 1D.. ще бъдат m*n (много функции и много данни, които представляват тези характеристики)!! - person user3303896; 18.02.2014
comment
[V,D] = eig(A) returns matrix V, whose columns are eigenvectors of A - това е написано в eig помощ. Моите данни са 2D, тъй като визуализирането на N-измерни данни не е тривиална задача. - person divanov; 18.02.2014