【问题标题】:Why are my manual PCA reconstructions not matching python's sklearn's reconstructions?为什么我的手动 PCA 重建与 python 的 sklearn 重建不匹配?
【发布时间】:2016-12-12 10:59:13
【问题描述】:

我试图检查我的 PCA 实现,看看我是否理解它,并尝试使用 MNIST 数据集上的 12 个组件进行 PCA(我使用 tensorflow 接口为我进行了规范化)。我得到了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给出的重构接口尝试重构如下:

pca = PCA(n_components=k)
pca = pca.fit(X_train)
X_pca = pca.transform(X_train)
X_reconstruct = pca.inverse_transform(X_pca)

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

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

您可以看到的错误是非零的,实际上非常明显。为什么?他们的重建与我的有何不同?

【问题讨论】:

  • 我自己从未实现过 PCA,但您是否考虑过查看源代码。他们的操作非常不同link(这暗示了不同的算法/内部数据结构)。

标签: python machine-learning scipy scikit-learn pca


【解决方案1】:

我发现了几个问题:

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

    Xtrain = 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_

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2019-07-02
    • 2017-09-14
    • 2016-11-02
    • 2020-09-02
    相关资源
    最近更新 更多