在Matlab中计算协方差矩阵

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:

首次接触时,我应该使用 nSamples 还是 nSamples - 1

注:此处的 nSamples 是指样本数量。
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

这句话与您的第一行基本相同,唯一不同之处在于减去了列均值。

阅读维基关于样本协方差的内容,可以看到为什么默认路径中有一个减一。

请注意,您的第一行使用普通转置(.'),而cov版本使用共轭转置(')。这将使得在复数数据的情况下,cov的输出结果不同。

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


根据您的第二次编辑,是否更好使用第一行?哪一个是正确的,或者它们使用共轭转置和转置来计算协方差时都是相同的? - kamaci
我只会运行一次,但我的数据太大了,所以仍然使用cov可以吗? - kamaci
@kamaci:你说的“太大”是什么意思?有多大? - Rody Oldenhuis
@kamaci:仅进行性能分析:tic; cov(data); toctic; sampleMat.' * sampleMat ./ nSamples; toc。我怀疑对于仅运行1次,差异将微不足道。 - Rody Oldenhuis
我只是使用了cov(data),那个标志怎么会改变呢? - kamaci
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接