【问题标题】:Sklearn PCA, how to restore mean in lower dimension?Sklearn PCA,如何恢复低维均值?
【发布时间】:2019-08-11 07:28:43
【问题描述】:

这个问题是关于在执行 PCA 之后如何去中心和“恢复”较低维度的数据。

我正在用 sklearn 做一个简单的principal component analysis。据我了解,实现应该注意(1)在创建组件时使数据居中,(2)在转换后使数据去中心。但是,在转换数据后,它仍然居中。如何在保留原始数据特征的同时将数据投影到低维空间?鉴于我会对高维数据进行降维,我不会对每个主成分都有适当的均值,如何推导出来?

将 3 个维度减少为 2 个维度:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

X = np.array([[-1, -1, -1], [-2, -1, -1], [-3, -2, -3], [1, 1, 1], [2, 1, 2], [3, 2, 3]]) + 3
X.shape

(6, 3)

fig = plt.figure(figsize=(10, 8), dpi= 80, facecolor='w', edgecolor='k')
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X[:,0], X[:,1],X[:,2], '*')
plt.title('original')
plt.show()

具有 2 个组件的 PCA:

pca = PCA(n_components=2)
pca.fit(X)
X_trans =pca.transform(X)
X_trans.shape

(6, 2)

plt.plot(X_trans[:,0], X_trans[:,1], '*')
plt.show()

在这个阶段我想做的是在这个较低维度中“恢复”我的数据,使数据点的值与原始数据相对应。它仍然应该只有 2 个维度,但不能以均值为中心。

执行逆变换,如下所示,实际上让我回到了 3 维

X_approx = pca.inverse_transform(X_trans) 
X_approx.shape

(6, 3)

我想保持二维,但我的数据仍然尽可能接近原始形式,而不是以平均值为中心。

【问题讨论】:

  • 我同意这个答案,但我认为您的实际目标不是“恢复”数据,而是以某种方式将手段投射到低维空间中。对吗?
  • @kazemakase:我猜这就是这里正在做的事情。新恢复的数据是在二维空间中投影的相同数据,因为在拟合期间n_components=2
  • 将我的措辞改为“去中心化”
  • @Mountain_sheep:我现在看到了问题所在。阅读我的评论和我编辑的答案

标签: python scikit-learn mean pca dimensionality-reduction


【解决方案1】:

您只是在拟合数据并绘制转换后的数据。要在较低维度中恢复原始数据,您需要使用 inverse_transform 它会返回原始数据,如下图所示。来自docs

inverse_transform(X)

将数据转换回原来的空间。

pca = PCA(n_components=2)
pca.fit(X)

X_trans =pca.transform(X)
X_original = pca.inverse_transform(X_trans)
plt.plot(X_original[:,0], X_original[:,1], 'r*')

【讨论】:

  • 谢谢,但数据仍以 y 轴为中心...?
  • @Mountain_sheep:原始数据只是一个自变量与一个因变量的关系
  • @Mountain_sheep:我现在看到了问题。您只是使用pca.fit(X) 进行拟合,但随后您必须将pca 应用于原始数据以使用transform 将其转换为X_trans。转换后,您可以使用 inverse_transform 转换回原始数据
  • 就像我在新编辑中描述的那样,这种方法让我回到原来的维度,我想保持在较低的维度,但让我的数据去中心化。
猜你喜欢
  • 2018-12-20
  • 2017-11-11
  • 2016-01-10
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 2016-05-22
  • 2017-07-19
  • 2018-05-02
相关资源
最近更新 更多