为什么我的手动PCA重建与python的sklearn重建不匹配?

2024-09-27 02:16:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图检查我的PCA实现,看看我是否理解它,我尝试用MNIST数据集上的12个组件(我使用tensorflow接口为我规范化了它)来进行PCA。我得到了sklearn给出的主成分,然后进行了如下重建:

pca = PCA(n_components=k)
pca = pca.fit(X_train)
X_pca = pca.transform(X_train)
# do manual PCA
U = pca.components_
my_reconstruct = np.dot(  U.T , np.dot(U, X_train.T) ).T

然后我使用sklearn给出的重建界面尝试重建如下:

^{pr2}$

然后按如下方式检查错误(因为行是数据点和列特性):

print 'X_recon - X_my_reconstruct', (1.0/X_my_reconstruct.shape[0])*LA.norm(X_my_reconstruct - X_reconstruct)**2
#X_recon - X_my_reconstruct 1.47252586279

你可以看到的误差是非零的,实际上相当明显。为什么?他们的重建和我的有何不同?在


Tags: 数据mytensorflownpcomponents组件trainsklearn
1条回答
网友
1楼 · 发布于 2024-09-27 02:16:59

我看到了几个问题:

  1. 点积应该是X_pca.dot(pca.components_)PCA使用SVD分解X_train矩阵:

    X列车=U·S·Vᵀ。在

    这里,pca.components_对应于Vᵀ(一个(k, n_features)矩阵),而不是U(一个(n_datapoints, k)矩阵)。在

    PCA的sklearn实现非常可读,可以在here中找到。我还在this previous answer中写了一个纯numpy示例。

  2. 在进行拟合之前,您是否通过减去每列的平均值来居中X_train?在

    PCA类自动将数据居中,并将原始平均向量存储在其.mean_属性中。如果输入特征的平均向量非零,那么您需要将平均值添加到重建中,即my_reconstruct += pca.mean_

相关问题 更多 >

    热门问题