2016-02-26 125 views
0

我正在使用PCA,並且我發現Python中sklearn中的PCA和Matlab中的pca()會產生不同的結果。這裏是我正在使用的測試矩陣。Matlab和Python爲PCA產生不同的結果

a = np.array([[-1,-1], [-2,-1], [-3, -2], [1,1], [2,1], [3,2]]) 

對於Python sklearn,我

p = PCA() 
print(p.fit_transform(a)) 

[[-1.38340578 0.2935787 ] 
[-2.22189802 -0.25133484] 
[-3.6053038 0.04224385] 
[ 1.38340578 -0.2935787 ] 
[ 2.22189802 0.25133484] 
[ 3.6053038 -0.04224385]] 

MATLAB的,我

pca(a', 'Centered', false) 

[0.2196 0.5340 
0.3526 -0.4571 
0.5722 0.0768 
-0.2196 -0.5340 
-0.3526 0.4571 
-0.5722 -0.0768] 

爲什麼這種差異觀察?


感謝Dan的回答。現在的結果看起來非常合理。但是,如果我使用隨機矩陣進行測試,似乎Matlab和Python產生的結果不是彼此的標量倍數。爲什麼會發生?

test matrix a: 

[[ 0.36671885 0.77268624 0.94687497] 
[ 0.75741855 0.63457672 0.88671836] 
[ 0.20818031 0.709373 0.45114135] 
[ 0.24488718 0.87400025 0.89382836] 
[ 0.16554686 0.74684393 0.08551401] 
[ 0.07371664 0.1632872 0.84217978]] 

Python的結果:

p = PCA() 
p.fit_transform(a)) 

[[ 0.25305509 -0.10189215 -0.11661895] 
[ 0.36137036 -0.20480169 0.27455458] 
[-0.25638649 -0.02923213 -0.01619661] 
[ 0.14741593 -0.12777308 -0.2434731 ] 
[-0.6122582 -0.08568121 0.06790961] 
[ 0.10680331 0.54938026 0.03382447]] 

Matlab的結果:

pca(a', 'Centered', false) 

0.504156973865138 -0.0808159771243340 -0.107296852182663 
0.502756555190181 -0.174432053627297 0.818826939851221 
0.329948209311847 0.315668718703861 -0.138813345638127 
0.499181592718705 0.0755364557146097 -0.383301081533716 
0.232039797509016 0.694464307249012 -0.0436361728092353 
0.284905319274925 -0.612706345940607 -0.387190971583757 

感謝所有丹的幫助下,通過這一點。事實上,我發現這是對Matlab函數的誤用。 Matlab默認返回主分量係數。使用[〜,score] = pca(a,'Centered',true)將獲得與Python相同的結果。

回答

7

PCA關閉特徵向量。只要向量是平行的,幅度是無關的(只是一個不同的normalizaton)。

在你的情況下,兩者是彼此的標量倍數。嘗試(在MATLAB中)

Python = [-1.38340578 0.2935787 
      -2.22189802 -0.25133484 
      3.6053038 0.04224385 
      1.38340578 -0.2935787 
      2.22189802 0.25133484 
      3.6053038 -0.04224385] 

Matlab = [ 0.2196 0.5340 
      0.3526 -0.4571 
      0.5722 0.0768 
      -0.2196 -0.5340 
      -0.3526 0.4571 
      -0.5722 -0.0768] 

現在可以看到B(:,1)*-6.2997基本上等於A(:,1)。或換句話說

A(:,n)./B(:,n) 

給你(大致)相同的數字爲每一行。這意味着這兩個矢量具有相同的方向(即它們只是彼此的標量倍數),所以你得到的是相同的主成分。

這是另一個例子:https://math.stackexchange.com/a/1183707/118848

+0

非常感謝您的快速回復。這次我得到了同樣的結果。但是,如果我使用隨機矩陣,結果似乎不是彼此的標量倍數。我把新的測試矩陣和結果放在原始問題中。你介意看看它嗎?非常感謝。 – user3451228

+0

目前不在MATLAB中,但它們也可能只是以不同的順序......所以如果你重新排列了其中一個矩陣的列,你應該能夠得到它們的標量倍數。我的猜測是排列的特徵值的大小應該解決它。 – Dan

+0

非常感謝您的幫助。我終於弄清楚了這個問題。 – user3451228

相關問題