2012-12-04 183 views
6

我在MATLAB中实现PCA算法。我看到了两个不同的方法来计算的协方差矩阵:在Matlab中计算协方差矩阵

C = sampleMat.' * sampleMat ./ nSamples; 

C = cov(data); 

的是这两种方法之间的区别?

PS 1:当我使用cov(data)是不必要的:

meanSample = mean(data,1); 
data = data - repmat(data, nSamples, 1); 

PS 2:

在第一种方法中,我应该使用nSamplesnSamples - 1

回答

10

简而言之:cov主要只是增加了公式的便利性。

如果键入

edit cov 

你会在底部一路看到了很多东西,这些行:

xc = bsxfun(@minus,x,sum(x,1)/m); % Remove mean  
if flag 
    xy = (xc' * xc)/m; 
else 
    xy = (xc' * xc)/(m-1); % DEFAULT 
end 

基本上是作为你的第1行相同,除了列装置的减法之外。

阅读样本协方差的the wiki,看看为什么在默认路径中有一个负数。

不过请注意,你的第一行使用正常的转置(.'),而cov -version采用共轭转置(')。这将使得在复数值数据的背景下cov的输出不同。

另请注意,cov是对非内置函数的函数调用。这意味着在循环中使用cov时会出现(可能是严重的)性能损失; Matlab的JIT编译器不能加速非内置函数。

+0

注意复杂数字与问题中的代码处理方式不同。 –

+0

@ BenVoigt:真的,转置是不同的,谢谢。编辑... –

+0

根据您的编辑2,使用第一行更好吗?哪一个是正确的,或者它们是否相同以使用共轭转置和转置来计算协方差? – kamaci