2012-12-04 230 views
6

我在MATLAB中實現PCA算法。我看到了兩個不同的方法來計算的協方差矩陣:在Matlab中計算協方差矩陣

C = sampleMat.' * sampleMat ./ nSamples; 

C = cov(data); 

的是這兩種方法之間的區別?

PS 1:當我使用cov(data)是不必要的:

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

PS 2:

在第一種方法中,我應該使用nSamplesnSamples - 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 

基本上是作爲你的第1行相同,除了列裝置的減法之外。

閱讀樣本協方差的the wiki,看看爲什麼在默認路徑中有一個負數。

不過請注意,你的第一行使用正常的轉置(.'),而cov -version採用共軛轉置(')。這將使得在複數值數據的背景下cov的輸出不同。

另請注意,cov是對非內置函數的函數調用。這意味着在循環中使用cov時會出現(可能是嚴重的)性能損失; Matlab的JIT編譯器不能加速非內置函數。

+0

注意複雜數字與問題中的代碼處理方式不同。 –

+0

@ BenVoigt:真的,轉置是不同的,謝謝。編輯... –

+0

根據您的編輯2,使用第一行更好嗎?哪一個是正確的,或者它們是否相同以使用共軛轉置和轉置來計算協方差? – kamaci