簡體   English   中英

從頭開始的 PCA 和 Sklearn PCA 給出不同的 output

[英]PCA from scratch and Sklearn PCA giving different output

我正在嘗試從頭開始實施 PCA。 以下是代碼:

sc = StandardScaler()  #standardization
X_new = sc.fit_transform(X)
Z = np.divide(np.dot(X_new.T,X_new),X_new.shape[0])  #covariance matrix
eig_values, eig_vectors = np.linalg.eig(Z)           #eigen vectors calculation 
eigval_sorted = np.sort(eig_values)[::-1]             
ev_index  =np.argsort(eigval_sorted)[::-1]
pc = eig_vectors[:,ev_index]                         #eigen vectors sorts on the basis of eigen values
W = pc[:,0:2]                                        #extracting 2 components
print(W)

並獲得以下組件:

[[ 0.52237162 -0.37231836]
[-0.26335492 -0.92555649]
[ 0.58125401 -0.02109478]
[ 0.56561105 -0.06541577]]

當我使用 sklearn 的 PCA 時,我得到以下兩個組件:

array([[ 0.52237162, -0.26335492,  0.58125401,  0.56561105],
       [ 0.37231836,  0.92555649,  0.02109478,  0.06541577]])

投影到新的特征空間給出以下不同的數字:

從頭開始 PCA

Sklearn PCA

我在哪里做錯了,可以做些什么來解決問題?

PCA 的結果在技術上不是 n 個向量,而是一個維度為 n 的子空間。 該子空間由跨越該子空間的 n 個向量表示。

在您的情況下,雖然向量不同,但跨越的子空間是相同的,因此 PCA 的結果是相同的。

如果您想使您的解決方案與 sklearn 解決方案完美對齊,您需要以同樣的方式規范您的解決方案。 顯然 sklearn 更喜歡正值而不是負值? 您需要深入研究他們的文檔。


編輯:是的,當然,我寫的是錯誤的。 該算法本身返回有序的正交基向量。 因此,長度為 1 且彼此正交的向量按照它們對數據集的“重要性”進行排序。 所以比子空間更多的信息。

但是,如果 v, w, u 是 PCA 的解,那么 +/- v, w, u 也應該是。


編輯:似乎 np.linalg.eig 沒有機制保證它也會返回代表特征空間的同一組特征向量,另請參見此處: NumPy linalg.eig

因此,新版本的 numpy,或者只是今天的星星排列方式,可以改變你的結果。 雖然,對於 PCA,它應該只在 +/-

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM