在Matlab中计算协方差矩阵

时间:2012-12-04 12:37:04

标签: matlab covariance

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

C = sampleMat.' * sampleMat ./ nSamples;

C = cov(data);

这两种方法有什么区别?

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

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

PS 2:

首先,我应该使用nSamples还是nSamples - 1

1 个答案:

答案 0 :(得分: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

与第一行基本相同,除了减去列 - 均值。

阅读关于样本协方差的the wiki,了解为什么默认路径中存在减号。

但请注意,您的第一行使用普通转置(.'),而cov版本使用共轭转置(')。这将使cov的输出在复值数据的上下文中不同。

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