How to project a new point to PCA new basis?

49 次查看(过去 30 天)
For example, I have 9 variables and 362 cases. I've made PCA calculation, and found out that first 3 PCA coordinates are enough for me.
Now, I have new point in my 9-dimensional structure, and I want to project it to principal component system coordinate. How to get its new coordinates?
% 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');
How to get coordinates of a new point projected to new principal component basis?

回答(3 个)

Wei Wang
Wei Wang 2012-11-9
When you specify a variable weight, the coefficient (W in your code) is not orthonormal, but the reconstruction rule is still Xcentered= score*coeff'. To get the score, you would have to do Xcentered/coeff' instead of Xcentered*coeff;
See the example below:
load hald;
data = ingredients;
% Weight and Mean:
wt = 1./var(data);
mu = mean(data);
% PCA, W is coefficient and Y is the score
[W,Y]=pca(data,'VariableWeights',wt,'centered',true);
% First observation of the centered data and its score
x1 = data(1,:)-mu;
y1 = Y(1,:)
% According to the reconstruction rule, we should have x1=y1*W'
% therefore, y1 = x1/W'
y = x1/W'

Jun Ming Soh
Jun Ming Soh 2022-3-8
Given X is an n observations x p variables/parameters table, after calculating the PCA with 'Economy' set as false, size(coeff) = p x p, size(score) = n x p, size(percentage_variance) = p x 1.
[coeff, score, ~,~,percentage_variance] = pca(X, 'Economy', false);
If there is a new datapoint with size of 1 x p, the corresponding principle component will be
score_new = new_datapoint * coeff;

Nikos Mp
Nikos Mp 2017-8-31
To project the old data to PC3 we should project them to PC1 then to PC2 then to PC3 ? Or we can do it using the data(:,1:3)*coeffs(:,1:3)

类别

Help CenterFile Exchange 中查找有关 Dimensionality Reduction and Feature Extraction 的更多信息

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by