我正在MATLAB中实现PCA算法。我看到两种不同的方法来计算协方差矩阵:
C = sampleMat.' * sampleMat ./ nSamples;
和
C = cov(data);
这两种方法有什么区别?
PS 1:当我使用cov(data)
时,这是不必要的:
meanSample = mean(data,1);
data = data - repmat(data, nSamples, 1);
诗篇2:
首先,我应该使用nSamples
还是nSamples - 1
?
简而言之: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,了解为什么默认路径中有减 1。
但请注意,您的第一行使用普通转置(.'
),而cov
版本使用共轭转置('
)。这将使cov
的输出在复值数据的上下文中有所不同。
另请注意,cov
是对非内置函数的函数调用。这意味着在循环中使用cov
时会有(可能严重的)性能损失;Matlab的JIT编译器无法加速非内置函数。