2016-08-05 4 views
3

私はそれを理解しているかどうかを確認するためにPCAの実装をチェックしようとしていましたが、MNISTデータセット(私はそれを正規化したテンソルフローインターフェイスを使っています)で12コンポーネントを使ってPCAを実行しようとしました。私は次のようにsklearnによって与え主成分とその後作ら再構成を得た:マニュアルPCAの再構成が、pythonのsklearnの再構成と一致しないのはなぜですか?

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

と、エラーをチェック:

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によって与えられる再構成インタフェースを使用しました(行がデータポイントと列の機能なので)次のように:

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 

あなたが見ることができるように、エラーがゼロと実際には非常に顕著です。それはなぜです?彼らの復興は私のものとどう違うのですか?

+0

自分でPCAを実装したことはありませんが、ソースを調べることを検討しましたか?彼らの操作は非常に異なっている(リンク:https://github.com/scikit-learn/scikit-learn/blob/51a765a/sklearn/decomposition/pca.py)(これは、さまざまなアルゴリズム/内部データ構造についてのヒントを与える)。 – sascha

答えて

1

私は問題のカップルを参照してください。

  1. 内積はX_pca.dot(pca.components_)する必要があります。

    X 電車 = U・S・VᵀPCAはSVDを使用してX_train行列をfactorizes。ここ

    pca.components_Vᵀ(k, n_features)マトリックス)、ないU(n_datapoints, k)マトリックス)に相当します。

    PCAのsklearnの実装は非常に読みやすく、hereです。私はまた、this previous answerに純粋な数値の例を書いています。

  2. X_trainは、フィッティングを行う前に各列の平均値を差し引いていましたか?

    PCAクラスは自動的にデータの中心を置き、元の平均ベクトルをその.mean_属性に格納します。入力フィーチャの平均ベクトルがゼロでない場合は、再構成に平均値を追加する必要があります(my_reconstruct += pca.mean_)。

関連する問題