2016-06-09 85 views
0
我可以得到

最近的比賽是運行:差異在Matlab結果使用PCA()和PCACOV()時

data=rand(100,10); % data set 
    [W,pc] = pca(cov(data)); 

那就不要貶低

data2=data 
    [W2, EvalueMatrix2] = eig(cov(data2)); 
    [W3, EvalueMatrix3] = svd(cov(data2)); 

在這種情況下W2W3同意和W是他們的轉置?

還不清楚爲什麼W應該是另外兩個的轉置?

作爲一個額外的檢查我用pcacov

[W4, EvalueMatrix4] = pcacov(cov(data2)); 

它再次同意WEW3但就是W轉置?

+3

也許'pca'計算協方差矩陣的特徵向量? [http://math.stackexchange.com/questions/3869/what-is-the-intuitive-relationship-between-svd-and-pca](http://math.stackexchange.com/questions/3869/what-是-SVD和pca之間的直觀關係) – shamalaia

+0

你試過'eig'或'svd'嗎? – Dan

+0

它上面的鏈接表示,pca將數據集中並使用svd(因此可能會期望pca結果的某些差異,但這些結果完全不同?)。它還表示,輸入應該由一個n * p矩陣來表示,其中n是觀察值,而p是不建議使用協方差矩陣的變量? – Bazman

回答

2

結果是不同的,因爲你正在減去數據矩陣的每一行的平均值。根據計算事物的方式,數據矩陣的行對應於數據點,列對應於維度(這也是pca()函數的工作原理)。有了這個設置,你應該減去每列的平均值,而不是行。這對應於「居中」數據;沿每個維度的平均值設置爲零。一旦你這樣做,結果應該相當於pca(),直到符號翻轉。

編輯以解決編輯的問題: 居中問題現在看起來不錯。在協方差矩陣上運行特徵值分解時,請記住按降序特徵值的順序排列特徵向量。這應該與pcacov()的輸出相匹配。當調用pca()時,必須將它傳遞給數據矩陣,而不是協方差矩陣。

+0

我意識到它變得混亂,所以我簡化了。仍然讓我感到奇怪的是,pca(cov(data))和pcacpv(cov(data))應該是不同的。 – Bazman

+0

編輯瞭解決此問題的答案 – user20160