PCA投影和重构在scikit-learn中

我可以通过下面的代码在scikit中执行PCA:X_train有279180行和104列。

from sklearn.decomposition import PCApca = PCA(n_components=30)X_train_pca = pca.fit_transform(X_train)

现在,当我想将特征向量投影到特征空间时,我必须执行以下操作:

""" 投影 """comp = pca.components_ #30x104com_tr = np.transpose(pca.components_) #104x30proj = np.dot(X_train,com_tr) #279180x104 * 104x30 = 297180x30

但我对这一步有些犹豫,因为Scikit的文档中提到:

components_: array, [n_components, n_features]

特征空间中的主轴,表示数据中最大方差的方向。

在我看来,它似乎已经投影好了,但当我检查源代码时,它只返回了特征向量。

正确的投影方法是什么?

最终,我的目标是计算重构的均方误差(MSE)。

""" 重构 """recon = np.dot(proj,comp) #297180x30 * 30x104 = 279180x104"""  MSE 误差 """print "MSE = %.6G" %(np.mean((X_train - recon)**2))

回答:

你可以这样做

proj = pca.inverse_transform(X_train_pca)

这样你就不必担心如何进行乘法运算了。

在执行pca.fit_transformpca.transform后,你得到的通常被称为每个样本的“载荷”,这意味着你需要多少个组件来使用components_(特征空间中的主轴)的线性组合来最好地描述它。

你所瞄准的投影是回到原始信号空间。这意味着你需要使用组件和载荷回到信号空间。

因此,这里有三个步骤需要澄清。以下是你可以使用PCA对象执行的步骤,以及它是如何实际计算的:

  1. pca.fit估计组件(使用居中后的Xtrain进行SVD):

     from sklearn.decomposition import PCA import numpy as np from numpy.testing import assert_array_almost_equal #这个变量应该是X_train而不是Xtrain吗? X_train = np.random.randn(100, 50) pca = PCA(n_components=30) pca.fit(X_train) U, S, VT = np.linalg.svd(X_train - X_train.mean(0)) assert_array_almost_equal(VT[:30], pca.components_)
  2. pca.transform计算你描述的载荷

     X_train_pca = pca.transform(X_train) X_train_pca2 = (X_train - pca.mean_).dot(pca.components_.T) assert_array_almost_equal(X_train_pca, X_train_pca2)
  3. pca.inverse_transform获得你感兴趣的信号空间中对组件的投影

     X_projected = pca.inverse_transform(X_train_pca) X_projected2 = X_train_pca.dot(pca.components_) + pca.mean_ assert_array_almost_equal(X_projected, X_projected2)

你现在可以评估投影损失

loss = np.sum((X_train - X_projected) ** 2, axis=1).mean()

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注