2017-02-10 11 views
0

私は現在、Principal Component Analysis(PCA)を使用するプロジェクトに取り組んでいます。幸運なことに、Pythonにはscikitlearn.decompositionの非常に便利なモジュールがあります。これはほとんどの作業を行うようです。私が本当にそれを使用し始める前に、私はそれが何をしているのかを正確に把握しようとしています。Pythonでscikitlearn PCA.transform関数を理解する

私はこのようなルックスでテストされてきたデータフレーム:私はPCA.fitを(呼び出し)してからコンポーネントを表示するとき

0 1 
0 1 2 
1 3 1 
2 4 6 
3 5 3 

は、そして私が手:私はむしろから

array([[ 0.5172843 , 0.85581362], 
    [ 0.85581362, -0.5172843 ]]) 

PCAの限られた知識、私はこれがどのように計算されたのか把握していますが、私が紛失するのはPCA.transformを呼び出すときです。これは、私に与え出力されます。

array([[-2.0197033 , -1.40829634], 
     [-1.84094831, 0.8206152 ], 
     [ 2.95540408, -0.9099927 ], 
     [ 0.90524753, 1.49767383]]) 

誰かが潜在的にそれが本来のデータフレームや部品を取り、この新しい配列に変換する方法を通じて、私を歩いてもらえますか?正確な計算を理解できるようにしたいので、スケールアップするときに何が起こっているのかが分かりやすくなります。ありがとう!

答えて

3

コールフィットPCAは、データの次元を縮小するためにデータを投影できるベクトルを計算します。データの各行は2次元なので、データを投影できる最大2つのベクトルがあり、それぞれのベクトルは2次元です。 PCA.components_の各行は、物事が投影される単一のベクトルであり、トレーニングデータの列数と同じサイズになります。あなたは完全なPCAを行ったので、2つのベクトルが得られますので、2x2の行列が得られます。これらのベクトルの最初のものは、投影されるデータの分散を最大化します。 2番目は最初の投影後に残っているものの分散を最大化します。通常は、入力データの次元よりも小さいn_componentsの値を渡しました。これにより、より少ない行が返され、幅が広いが、背は高くないcomponents_配列が返されます。

transformに電話すると、sklearnに実際に投影を依頼しています。つまり、fitが呼び出されたときに学習されたベクトル空間にデータの各行を投影するように求めています。 transformに渡すデータの各行に対して、出力に1行があり、その行の列数はfit段階で学習されたベクトルの数になります。つまり、列の数はコンストラクタに渡されたn_componentsの値に等しくなります。

ソースデータに多数のカラムがあり、できるだけ多くの情報を保持しながらカラム数を減らしたい場合、通常はPCAを使用します。 100行のデータセットがあり、各行に500列があるとします。 PCA(n_components = 10)のようなPCAを構築してfitと呼んだ場合、components_には10個の行があり、要求されたコンポーネントごとに1つ、入力ディメンションとして500個の列があります。 transformを呼び出すと、データの100行すべてがこの10次元空間に投影されるので、出力には100行(入力ごとに1つ)がありますが、10列しかないため、データの次元が小さくなります。

これがどのように行われるかについての簡単な答えは、PCAが特異値分解を計算し、それらの行列の1つの列の一部のみを保持することです。 Wikipediaには、これの背後にある実際の線形代数に関するもっと多くの情報があります。これはStackOverflowの答えが少し長くなっています。

+0

これは実際に何が起こっているのかを理解する上で大きな助けとなります。私は間違いなくウィキペディアをチェックして、PCAについて何が言いたいのかを見ていきます。ありがとう! – JSolomonCulp