python - 为什么 sklearn 和 numpy 不同意 PCA 的乘法分量?

标签 python numpy scikit-learn 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 来获取主成分。这仅在列首先为 centered by their means 时有效.如果您检查 source code ,他们在 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]])

关于python - 为什么 sklearn 和 numpy 不同意 PCA 的乘法分量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65346203/

相关文章:

python - 安装 scikit-learn 时就地构建扩展有什么优势?

python - Django 没有模块命名设置

python - 在Python中添加两个不同大小的图像或填充白色像素以使其更大

python - 为 solve_ivp 传递参数(新的 SciPy ODE API)

python - 如何用 Pandas 计算协方差矩阵

python - 为什么在 Google Colab 中重新启动运行时 KMeans 的 silhouette_score 会发生变化?

python - 计算 A* 寻路算法的执行时间时,Python 列表中缺少项目

python - 如何在 Windows 上使用 Python 更改文件夹图标?

python - Pandas 数据框的高效展平

python - 对数据进行编码以进行插补,然后进行解码