Как да проектирам нова точка към новата основа на PCA?

Например имам 9 променливи и 362 случая. Направих PCA изчисление и установих, че първите 3 PCA координати са ми достатъчни.

Сега имам нова точка в моята 9-измерна структура и искам да я проектирам към системната координата на главния компонент. Как да получа новите му координати?

%# here is data (362x9)
load SomeData

[W, Y] = pca(data, 'VariableWeights', 'variance', 'Centered', true);

%# orthonormal coefficient matrix
W = diag(std(data))\W;

% Getting mean and weights of data (for future data)
[data, mu, sigma] = zscore(data);
sigma(sigma==0) = 1;

%# New point in original 9dim system
%# For example, it is the first point of our input data
x = data(1,:);
x = bsxfun(@minus,x, mu);
x = bsxfun(@rdivide, x, sigma);

%# New coordinates as principal components
y0 = Y(1,:); %# point we should get in result
y = (W*x')'; %# our result

%# error
sum(abs(y0 - y)) %# 142 => they are not the same point

%# plot
figure()
plot(y0,'g'); hold on;
plot(y,'r');

въведете описание на изображението тук

Как да получа координати на нова точка, проектирана към нова основа на главния компонент?


person Larry Cinnabar    schedule 09.11.2012    source източник
comment
Имате ли документация за функцията pca()? Обикновено в matlab използвам princomp().   -  person Isaac    schedule 09.11.2012
comment
Y(1,:) и y в една и съща посока ли са?   -  person Isaac    schedule 09.11.2012
comment
Сега се опитвам в нова версия на Matlab. Там функцията princomp() се насочва към pca(). Добре, ще пробвам в по-стари версии, още повече, че ми трябва да работи в стария Matlab   -  person Larry Cinnabar    schedule 09.11.2012
comment
@Isaac, да, и Y(1,:), и y са 1x9.   -  person Larry Cinnabar    schedule 09.11.2012
comment
Посока, не измерение. Y(1,:) приблизително кратно ли е на y?   -  person Isaac    schedule 09.11.2012
comment
@Isaac, съжалявам, не съм разбрал. Актуализирах публикацията си   -  person Larry Cinnabar    schedule 09.11.2012


Отговори (1)


Основната грешка беше в действие, която преобразува точките в нова база:

y = (W*x')';

Уикипедия казва:

Проектираните вектори са колоните на матрицата

Y = W*·Z, 

където Y is L×N, W is M×L, Z is M×N,

но pca() връща W с размер L×M и Y с размер NxL

така че правилното уравнение в Matlab е:

y = x*W

По-долу е коригираният код:

[W, Y] = pca(data, 'VariableWeights', 'variance', 'Centered', true);
W = diag(std(data))\W;

%# Getting mean and weights of data (for future data)
[~, mu, we] = zscore(data);
we(we==0) = 1;

%# New point in original 9dim system
%# For example, it is the first point of our input data
x = data(1,:); 
x = bsxfun(@minus,x, mu);
x = bsxfun(@rdivide, x, we);

%# New coordinates as principal components
y = x*W;
y0 = Y(1,:);
sum(abs(y0 - y)) %# 4.1883e-14 ~= 0
person Larry Cinnabar    schedule 09.11.2012