我正在使用温度数据(如下)、行中的样本和列中的特征(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_ 吗?事实上它确实有效。但我不知道这是对还是错。
谢谢你
当你进行PCA并设置
n_components
<n_features
时,你将丢失信息,因此当你转换回来时你无法获得完全相同的数据,(参见thisSO答案)。
您可以将其想象为有一张 1024x1024 的图片,然后将其缩小到 784x784,然后想要将其缩小回 1024x1024 - 这是无法 1:1 完成的。您仍然可以看到图像,但可能有点模糊
将其他主成分设置为 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)