[英]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.