6

我正在 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:

一开始我应该使用nSamplesornSamples - 1吗?

4

1 回答 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

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

阅读有关示例协方差的 wiki,以了解为什么默认路径中有减一。

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

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

于 2012-12-04T12:39:23.600 回答