6

私はMATLABでPCAアルゴリズムを実装しています。共分散行列を計算するための2つの異なるアプローチがあります。

C = sampleMat.' * sampleMat ./ nSamples;

C = cov(data);

これら2つの方法の違いは何ですか?

PS 1:私が使うときcov(data)はそんなに不必要です:

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

PS 2:

最初のアプローチは使用する必要がありますnSamplesnSamples - 1

4

1 に答える 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

これは基本的に最初の行と同じですが、列平均の減算を除いてです。

サンプルの共分散に関するwikiを読んで、デフォルトのパスにマイナス1がある理由を確認してください。

ただし、最初の行は通常の転置(.')を使用しているのに対し、cov-versionは共役転置()を使用していることに注意してください'covこれにより、複素数値データのコンテキストで出力が異なります。

covまた、これは組み込み関数以外の関数呼び出しであることに注意してください。つまりcov、ループで使用すると、(場合によっては重大な)パフォーマンスの低下が発生します。MatlabのJITコンパイラは、組み込み関数以外を高速化することはできません。

于 2012-12-04T12:39:23.600 に答える