如何将 pca.components_ 反转为原始值

问题描述 投票:0回答:2

我正在使用温度数据(如下)、行中的样本和列中的特征(1000 hPa、925 hPa...等)进行 PCA

array([[ 25. ,  22.2,  19. , ..., -51.9, -50.3, -41.1],
       [ 26.8,  22.8,  18.4, ..., -53.1, -49.5, -41.1],
       [ 26.4,  23.4,  19.4, ..., -56.7, -49.7, -41.3],
       ...,
       [  9.4,   6.8,   3.2, ..., -57.7, -55.9, -57.9],
       [ 12.4,   7.4,   3.8, ..., -53.5, -53.9, -56.1],
       [  9.6,   5.8,   4.2, ..., -54.9, -53.1, -50.9]])

我运行了 PCA。

pca = PCA(n_components=2)
proj = pca.fit_transform(data)
inversed_data = pca.inverse_transform(proj)

(这里,反演后的数据是估计值(PC1 + PC2)。对吧?)

我使用 pca.components_ 将估计值分为 PC1 和 PC2。

pca.components_

array([[-0.33776309, -0.34230437, -0.33367396, -0.32389647, -0.36274215,
        -0.37980682, -0.33324365, -0.21884887, -0.02131457,  0.16129112,
         0.24344067,  0.15305721,  0.08841673,  0.0262782 ,  0.00574684,
         0.00390428],
       [-0.18303616, -0.29623333, -0.32912031, -0.17544341, -0.08903607,
         0.04295601,  0.37370419,  0.55664452,  0.40733697,  0.0431838 ,
        -0.21696205, -0.20124614, -0.14519851, -0.05066843, -0.01942078,
         0.031218  ]])

但是我现在遇到了麻烦。我想将 pca.components_ 与原始数据进行比较。为此,我必须反转 pca.components_ 但我不能。你有什么想法吗?
我做到了:

pca.inverse_transform(pca.components_)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-34-a389a4196f5f> in <module>()
----> 1 pca.inverse_transform(pca.components_[0])

/usr/local/lib/python3.7/dist-packages/sklearn/decomposition/_base.py in inverse_transform(self, X)
    157                             self.components_) + self.mean_
    158         else:
--> 159             return np.dot(X, self.components_) + self.mean_

<__array_function__ internals> in dot(*args, **kwargs)

ValueError: shapes (16,) and (2,16) not aligned: 16 (dim 0) != 2 (dim 0)

但是没有成功。或者我可以使用 sklearn.preprocessing.StandardScaler.inverse_transform() 来查看反转的 pca.components_ 吗?事实上它确实有效。但我不知道这是对还是错。

谢谢你

python scikit-learn pca
2个回答
2
投票

当你进行PCA并设置

n_components
<
n_features
时,你将丢失信息,因此当你转换回来时你无法获得完全相同的数据,(参见thisSO答案)。

您可以将其想象为有一张 1024x1024 的图片,然后将其缩小到 784x784,然后想要将其缩小回 1024x1024 - 这是无法 1:1 完成的。您仍然可以看到图像,但可能有点模糊


0
投票

将其他主成分设置为 0,这样您仍然可以拥有从 PCA 空间转换到特征空间的投影矩阵:

pca = PCA(n_components=data.shape[1])
pca.fit(data)
pca.singular_values_[2:]=pca.singular_values_[2:]*0

print(pca.singular_values_) #All but first 2 singular values set to 0
proj = pca.transform(data)
filtered_data = pca.inverse_transform(proj)
© www.soinside.com 2019 - 2024. All rights reserved.