[英]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 的結果在技術上不是 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.