以下のコードでscikitでPCAを実行できます。 X_trainには279180行と104列があります。今ScikitでのPCA射影と再構築
from sklearn.decomposition import PCA
pca = PCA(n_components=30)
X_train_pca = pca.fit_transform(X_train)
、私は特徴空間への固有ベクトルを投影したい場合、私は、次の作業を行う必要があります。
""" Projection """
comp = pca.components_ #30x104
com_tr = np.transpose(pca.components_) #104x30
proj = np.dot(X_train,com_tr) #279180x104 * 104x30 = 297180x30
しかしScikit documentationが言うので、私は、このステップで迷っています:
components_:配列、[n_components、n_features]
fの主軸データの最大分散の方向を表す固有空間を含む。
すでに投影されているようですが、ソースコードをチェックすると、固有ベクトルだけが返されます。
どのように投影するのが適切ですか?
最終的に、私は再構成のMSEを計算することを目指しています。
""" Reconstruct """
recon = np.dot(proj,comp) #297180x30 * 30x104 = 279180x104
""" MSE Error """
print "MSE = %.6G" %(np.mean((X_train - recon)**2))
は、[OK]を評価することができますので、私は、その後、コンポーネントを計算するために 'pca.fit'を呼び出すことができます投影は 'pca.fit_transform'で計算することができます(これは、データをさらに処理したいとき、次元性が還元されているため、それらをいくつかのモデルにフェッチすることです)。再構成のために、私は 'pca.invert_transform'を呼び出してMSEを計算します。あれは正しいですか? – HonzaB
それはあなたが投影によって何を意味するかによって異なります。最初に、 'pca.fit_transform(X)'は 'pca.fit(X).transform(X)'(これは最適化されたショートカットです)と同じ結果を与えることに注意してください。第2に、投影は一般に、ある空間から同じ空間に入るものです。ここでは、信号空間から信号空間まで、それを2回適用するというプロパティは一度適用するようなものです。ここで 'f = lambda X:pca.inverse_transform(pca.transform(X))'となります。あなたは 'f(f(X))== f(X) 'を確認することができます。 'pca.transform'はローディングを取得しています。結局のところ、それはちょうど終了です。 – eickenberg
投影法では、ベクトルを特徴空間に変換することを意味します。それは私の質問(2番目のステップ)でやったことで、 'pca.transform(X)'と同じです - 結果は行列_Mxk_です。ここで、_M_は選択されたコンポーネントの行数と_k_番号です。私はモデルの入力としてこれを使用します(元のデータセットを使用するよりも良い結果が期待されます) – HonzaB