2012-12-04 23 views
6

MATLAB'de bir PCA algoritması uyguluyorum.Matlab'da Kovaryans Matrisinin Hesaplanması

C = sampleMat.' * sampleMat ./ nSamples; 

ve

C = cov(data); 

Bu iki yöntem arasındaki fark nedir: Ben kovaryans matrisi hesaplamak için iki farklı yaklaşım görüyor musunuz?

PS 1:

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

PS 2:

İlk yaklaşımda azından ben nSamples veya nSamples - 1 kullanmalıdır Ben cov(data) kullanmak gereksiz olduğunu?

cevap

10

Kısaca: cov temel olarak sadece çıplak formüle kolaylık katıyor.

Eğer

edit cov 

Sen tüm yol alt kısmında bu hatları ile, bir sürü şey göreceksiniz yazarsanız: aslında ilk satırda aynıdır

xc = bsxfun(@minus,x,sum(x,1)/m); % Remove mean  
if flag 
    xy = (xc' * xc)/m; 
else 
    xy = (xc' * xc)/(m-1); % DEFAULT 
end 

, Sütun araçlarının çıkarılması için kaydedin. Varsayılan yolunda neden bir eksi-var olduğunu görmek için örnek kodlamalarda the wiki kodunu okuyun.

Ancak, ilk satırınızda normal dönüşüm (.') kullanılıyor, oysa cov - dönüşüm, konjugat-aktarım (') kullanıyor. Bu, karmaşık değerli veriler bağlamında cov çıktısını farklı hale getirecektir.

Ayrıca, cov'un yerleşik olmayan bir işlev için bir işlev çağrısı olduğunu unutmayın. Bir döngüde cov kullanırken (muhtemelen ciddi) bir performans cezası olacak demektir; Matlab'ın JIT derleyicisi, yerleşik olmayan işlevleri hızlandıramaz.

+0

Uyarı ile karmaşık sayıların söz konusu koddan farklı şekilde ele alınması. –

+0

@BenVoigt: true, transpoze farklıdır, teşekkürler. Düzenleme ... –

+0

Düzenleme 2'ye göre, ilk satırı kullanmak daha mı iyi? ve hangisi doğrudur ya da kovaryansı hesaplamak için konjugat-transpoz ve transpoze kullanmak için aynı mıdır? – kamaci