我试图检查我的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
你可以看到的误差是非零的,实际上相当明显。为什么?他们的重建和我的有何不同?在
我看到了几个问题:
点积应该是
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示例。
在进行拟合之前,您是否通过减去每列的平均值来居中
X_train
?在PCA
类自动将数据居中,并将原始平均向量存储在其.mean_
属性中。如果输入特征的平均向量非零,那么您需要将平均值添加到重建中,即my_reconstruct += pca.mean_
。相关问题 更多 >
编程相关推荐