有谁知道 MATLAB 在其内置函数“pca”中使用的算法是什么?
我有以下数据集:
148.9820 55.8438 210.2150
149.3030 56.8891 208.4280
151.4400 55.8180 208.9240
146.5530 55.9677 211.5800
146.5770 57.2682 209.3680
145.5330 58.4735 207.6970
153.9680 55.8386 207.9600
143.6960 57.2371 211.1020
152.5960 57.3995 206.2770
144.1070 56.1439 212.9730
149.6670 58.8746 205.1560
142.8440 58.1240 209.7220
143.2190 59.3990 207.0410
146.3050 60.2445 204.1980
156.7100 55.9361 207.4610
141.0470 57.3240 212.4660
其中行数是观察数,每个观察的维度为 3。
我想对这个数据集进行主成分分析,所以我写了
P = pca(A)
其中 A 是上述矩阵。我得到的答案是
0.9480 0.2104 0.2387
-0.0980 -0.5204 0.8483
-0.3027 0.8276 0.4727
但是,当我使用以下程序时:
function [evects,evals] = pca_test(dataset)
if (size(dataset,1)>size(dataset,2))
dataset = dataset';
end
N = size(dataset,2);
mm = mean(dataset,2);
dataset = dataset - mm*ones(1,N);
cc = cov(dataset',1);
[cvv,cdd] = eig(cc);
[~,ii] = sort(diag(cdd));
ii = flip(ii,1);
evects = cvv(:,ii);
cdd = diag(cdd);
evals = cdd(ii);
它给
evects =
-0.9480 0.2104 0.2387
0.0980 -0.5204 0.8483
0.3027 0.8276 0.4727
第一列与内置 pca 生成的结果符号相反。为什么会有这样的变化?
我问这个是因为我认为 matlab 内置的 pca 真的很慢。上面的 pca_test 比内置函数快 3 倍左右。但我希望它与内置的结果完全相同。任何人都可以帮忙吗?