2016-04-12 22 views
5

以下のコードで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)) 

答えて

13

あなたは乗算を行う方法を心配する必要はありません道

proj = pca.inverse_transform(X_train_pca) 

を行うことができます。 pca.fit_transformまたはpca.transformは通常、あなたが特徴空間におけるcomponents_(主軸の線形結合を使用して最高のそれを記述する必要がありますどのくらいの各コンポーネントの意味、各サンプルの「負荷」と呼ばれるものになった後、あなたが得る何

)。

あなたが目指している射影は元の信号空間に戻ります。これは、コンポーネントとローディングを使用して信号空間に戻る必要があることを意味します。

ここでは曖昧さを排除するための3つの手順があります。ここでは、ステップバイステップを持っている、あなたはPCAオブジェクトを使用して行うとができるか、それを実際に計算方法:

  1. pca.fit推定値を(中心XtrainにSVDを使用して)コンポーネント:

    from sklearn.decomposition import PCA 
    import numpy as np 
    from numpy.testing import assert_array_almost_equal 
    
    Xtrain = np.random.randn(100, 50) 
    
    pca = PCA(n_components=30) 
    pca.fit(Xtrain) 
    
    U, S, VT = np.linalg.svd(Xtrain - Xtrain.mean(0)) 
    
    assert_array_almost_equal(VT[:30], pca.components_) 
    
  2. pca.transformあなたは

    X_train_pca = pca.transform(Xtrain) 
    
    X_train_pca2 = (Xtrain - pca.mean_).dot(pca.components_.T) 
    
    assert_array_almost_equal(X_train_pca, X_train_pca2) 
    
  3. pca.inverse_transformが投影ONTを取得し、説明するように負荷を算出し、 Oあなたは

    X_projected = pca.inverse_transform(X_train_pca) 
    X_projected2 = X_train_pca.dot(pca.components_) + pca.mean_ 
    
    assert_array_almost_equal(X_projected, X_projected2) 
    

に興味のある信号空間内のコンポーネントは、あなたは今、投影損失

loss = ((X_train - X_projected) ** 2).mean() 
+0

は、[OK]を評価することができますので、私は、その後、コンポーネントを計算するために 'pca.fit'を呼び出すことができます投影は 'pca.fit_transform'で計算することができます(これは、データをさらに処理したいとき、次元性が還元されているため、それらをいくつかのモデルにフェッチすることです)。再構成のために、私は 'pca.invert_transform'を呼び出してMSEを計算します。あれは正しいですか? – HonzaB

+1

それはあなたが投影によって何を意味するかによって異なります。最初に、 '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

+0

投影法では、ベクトルを特徴空間に変換することを意味します。それは私の質問(2番目のステップ)でやったことで、 'pca.transform(X)'と同じです - 結果は行列_Mxk_です。ここで、_M_は選択されたコンポーネントの行数と_k_番号です。私はモデルの入力としてこれを使用します(元のデータセットを使用するよりも良い結果が期待されます) – HonzaB

関連する問題