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 помочь мне сгенерировать случайную матрицу с нормальным гауссовым и в форме эллипса ?? Пожалуйста.. помогите мне Т_Т


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
Пожалуйста, смотрите мое обновление вопроса с полным кодом и выходным изображением, которое я получил! Как применить ваш код в моем коде ?? у меня ошибка!! - 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); % Rows = 100 Columns = 20, но построенные e1 и e2 одинаковы (все еще ошибка) - person user3303896; 18.02.2014
comment
2 — количество компонентов измерения/PCA, а 500 — количество точек данных. - person divanov; 18.02.2014
comment
Вы имеете в виду собственный вектор 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 справке. Мои данные двумерные, так как визуализация N-мерных данных — нетривиальная задача. - person divanov; 18.02.2014