【问题标题】:PCA matrix with sklearn带有 sklearn 的 PCA 矩阵
【发布时间】:2020-07-31 14:51:05
【问题描述】:

我对一些数据进行了 PCA,我想提取 PCA 矩阵。这是我的代码(不包括加载数据):

from sklearn.decomposition import PCA
pca = PCA(n_components=5)
pca_result = pca.fit_transform(recon.data.cpu().numpy())
M = pca.components_

我认为 M 应该是 PCA 矩阵。但是,当我打印 pca_result(前几行)时,我得到了这个:

[-21.08167   ,  -5.67821   ,   0.17554353,  -0.732398  ,0.04658243],
[-25.936056  ,  -6.535223  ,   0.6887493 ,  -0.8394666 ,0.06557591],
[-30.755266  ,  -6.0098953 ,   1.1643354 ,  -0.82322127,0.07585468]

但是当我打印 np.transpose(np.matmul(M,np.transpose(recon))) 时,我得到了这个:

[-27.78438   ,  -2.5913327 ,   0.87771094,  -1.0819707 ,0.1037216 ],
[-32.63887   ,  -3.4483302 ,   1.3909296 ,  -1.1890743 ,0.12274324],
[-37.45802   ,  -2.9229708 ,   1.8665184 ,  -1.1728177 ,0.13301012]

我做错了什么,如何获得实际的 PCA 矩阵?谢谢!

【问题讨论】:

  • 请更新您的帖子,以明确您所说的“PCA 矩阵”是什么意思——这不是一个标准术语。你是说PC组件吗?转换后的数据?
  • @s.k 是的,官方文档是我检查的第一件事。这就是我最初编写上面代码的方式。我只是不确定为什么这两种方法不一致。
  • @desertnaut 在 PCA 中,您从 n 维空间转到不同的(旋转的)n 维空间。此更改是使用 nxn 矩阵完成的。我不确定如何调用该矩阵。我一直称它为 PCA 矩阵。

标签: python scikit-learn pca


【解决方案1】:

在 PCA 中,您从一个 n 维空间转到另一个(旋转的)n 维空间。此更改是使用 nxn 矩阵完成的

这确实是pca.components_返回的矩阵;当乘以 PCA 转换的数据时,它给出了原始数据 X 的重建。

这是一个带有虹膜数据的演示:

import numpy as np
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

X = load_iris().data
mu = np.mean(X, axis=0) # mean value

pca = PCA()
X_pca = pca.fit_transform(X)
M = pca.components_
M
# result:
array([[ 0.36138659, -0.08452251,  0.85667061,  0.3582892 ],
       [ 0.65658877,  0.73016143, -0.17337266, -0.07548102],
       [-0.58202985,  0.59791083,  0.07623608,  0.54583143],
       [-0.31548719,  0.3197231 ,  0.47983899, -0.75365743]])

即确实是一个 4x4 矩阵(虹膜数据有 4 个特征)。

让我们使用所有 PC 重建原始数据:

X_hat = np.matmul(X_pca, M)
X_hat = X_hat + mu # add back the mean
print(X_hat[0]) # reconstructed
print(X_[0])    # original

结果:

[5.1 3.5 1.4 0.2]
[5.1 3.5 1.4 0.2]

即完美重构。

用更少的 PC 进行重建,比如说 2 台(共 4 台):

n_comp = 2
X_hat2 = np.matmul(X_pca[:,:n_comp], pca.components_[:n_comp,:])
X_hat2 = X_hat2 + mu
print(X_hat2[0])

结果:

[5.08303897 3.51741393 1.40321372 0.21353169]

即由于使用过的 PC 被截断(2 台而不是全部 4 台),我们应该预料到的重建不太准确。

(代码改编自 Cross Validated 上的伟大线程 How to reverse PCA and reconstruct original variables from several principal components?。)

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 2013-10-14
    • 1970-01-01
    • 2015-07-26
    • 2017-07-21
    • 2021-02-02
    • 2021-03-24
    • 2017-07-19
    • 2017-10-01
    相关资源
    最近更新 更多