matlab在其内置函数'pca'中使用的算法是什么?

计算科学 线性代数 算法 matlab 统计数据 近似
2021-12-05 06:01:18

有谁知道 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 倍左右。但我希望它与内置的结果完全相同。任何人都可以帮忙吗?

1个回答

使用奇异值分解 (SVD) 算法进行主成分分析 (PCA)。正如 Bill Barth 上面所说,主成分向量的符号选择是完全任意的。