我在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
?
答案 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编译器无法加速非内置函数。