sklearn 中的 pca.inverse_transform

lmb*_*loo 7 python pca scikit-learn

将我的数据拟合成 X = 我的数据后

pca = PCA(n_components=1)
pca.fit(X)
X_pca = pca.fit_transform(X)
Run Code Online (Sandbox Code Playgroud)

现在 X_pca 有一个维度。

当我按照定义执行逆变换时,它不应该返回原始数据,即X,二维数组吗?

当我做

X_ori = pca.inverse_transform(X_pca)
Run Code Online (Sandbox Code Playgroud)

我得到相同的尺寸但不同的数字。

另外,如果我同时绘制 X 和 X_ori 它们是不同的。

but*_*ife 10

当我根据定义执行逆变换时,它不应该返回到原始数据

不,如果您指定的组件数量与输入数据的维度相同,您只能期待这一点。对于任何小于此值的 n_components,在应用逆 PCA 变换后,您将获得与原始数据集不同的数字:下图给出了二维的说明。

在此处输入图片说明


Jon*_*oop 5

它不能这样做,因为通过使用 PCA 减少维度,您丢失了信息(检查pca.explained_variance_ratio_您仍然拥有的信息百分比)。但是,它尽量回到原来的空间,看下图 原始点与信息丢失的变换点的比较

(生成与

import numpy as np
from sklearn.decomposition import PCA
pca = PCA(1)
X_orig = np.random.rand(10, 2)
X_re_orig = pca.inverse_transform(pca.fit_transform(X_orig))

plt.scatter(X_orig[:, 0], X_orig[:, 1], label='Original points')
plt.scatter(X_re_orig[:, 0], X_re_orig[:, 1], label='InverseTransform')
[plt.plot([X_orig[i, 0], X_re_orig[i, 0]], [X_orig[i, 1], X_re_orig[i, 1]]) for i in range(10)]
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

) 如果您保持 n_dimensions 相同(设置pca = PCA(2),您确实恢复了原始点(新点位于原始点之上):
原点之上的新点