簡體   English   中英

為什么 sklearn 和 numpy 不同意 PCA 的乘法分量?

[英]Why does sklearn and numpy disagree about multiplying component of PCA?

from sklearn.datasets import make_blobs
from sklearn.decomposition import PCA

SEED = 123
X, y = make_blobs(n_samples=1000, n_features=5000, cluster_std=90., random_state=SEED)
pca = PCA(2)
pca.fit(X)
pca1, pca2 = pca.components_

pcaX = pca.transform(X)
pcaXnp = np.array([X @ pca1, X @ pca2]).T

如果您打印出 pcaX 和 pcaXnp,您會發現它們很相似,但彼此不一致。 為什么這些應該不同? 似乎“.components_”應該返回sklearn將矩陣乘以的內容,是否有理由說明它只是乘法的近似值?

sklearn.decomposition 的 PCA 使用奇異值分解或 SVD 來獲取您的主成分。 這僅在列首先通過它們的方式居中時才有效。 如果您檢查源代碼,他們會在 SVD 之前進行居中:

def _fit_full(self, X, n_components):
[...]
        # Center data
        self.mean_ = np.mean(X, axis=0)
        X -= self.mean_

因此,要獲得 PCA 分數,您需要先將矩陣居中:

pcaX = pca.transform(X)
Xc = X - X.mean(axis=0)
pcaXnp = np.array([Xc @ pca1, Xc @ pca2]).T

pcaX[:3]
array([[-101.45177987,  212.45583745],
       [ 520.84541298,   87.32254399],
       [-273.26407231, -318.78493994]])

pcaXnp[:3]
array([[-101.45177987,  212.45583745],
       [ 520.84541298,   87.32254399],
       [-273.26407231, -318.78493994]])

暫無
暫無

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

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