我可以通过下面的代码在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_transform
或pca.transform
后,你得到的通常被称为每个样本的“载荷”,这意味着你需要多少个组件来使用components_
(特征空间中的主轴)的线性组合来最好地描述它。
你所瞄准的投影是回到原始信号空间。这意味着你需要使用组件和载荷回到信号空间。
因此,这里有三个步骤需要澄清。以下是你可以使用PCA对象执行的步骤,以及它是如何实际计算的:
-
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_)
-
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)
-
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()