PCAを逆にし、いくつかの主成分から元の変数を再構築する方法は?


113

主成分分析(PCA)は、次元削減に使用できます。このような次元削減が実行された後、少数の主成分から元の変数/機能をどのように近似的に再構築できますか?

あるいは、データから複数の主成分をどのように削除または破棄できますか?

言い換えれば、PCAを逆にする方法は?


PCAが特異値分解(SVD)と密接に関連していることを考えると、次のように同じ質問をすることができます。SVDを逆にする方法は?


10
私はこのQ&Aスレッドを投稿しています。なぜなら、このトピックに関する規範的なスレッドがないので、これを尋ねる多数の質問を見て、それらを重複として閉じることができないためです。まともな答えを持ついくつかの同様のスレッドがありますが、たとえばRのみに焦点を合わせるなど、すべてに深刻な制限があるようです。
amoeba

4
私はその努力に感謝します-PCAに関する情報、それが何をするのか、何をしないのかを1つまたは複数の高品質のスレッドにまとめる必要があると思います。これを行うためにあなた自身にそれを取ったことがうれしいです!
-Sycorax

1
この標準的な答え「クリーンアップ」がその目的に役立つとは思いません。ここにあるのは優れた一般的な質問と回答ですが、実際のP​​CAについてはそれぞれの質問に微妙な点があり、ここでは失われています。基本的に、すべての質問に答え、それらに対してPCAを実行し、下位の主要コンポーネントを破棄しました。場合によっては、豊かで重要な詳細が隠されています。また、あなたの代わりにR.あるカジュアルな統計学者の共通語を使用して、多くの人々にPCAが不透明になり、正確に何である線形代数表記を教科書に戻ってきた
トーマス・ブラウン

1
@トーマスありがとう。私たちは意見の相違があると思うので、チャットやメタでそれについて喜んで議論します。非常に簡単に:(1)各質問に個別に答えることは確かに良いかもしれませんが、厳しい現実はそれが起こらないということです。多くの質問は未回答のままです。(2)ここのコミュニティは、多くの人々に役立つ一般的な回答を強く好みます。どのような回答が最も支持されているかを確認できます。(3)数学については同意しますが、ここでRコードを提供しました。(4)共通語に関する意見の相違。個人的に、私はRを知りません
。–アメーバ

@amoebaメタディスカッションに参加したことがないので、このチャットを見つける方法がわからないのではないかと心配しています。
トーマスブラウン

回答:


147

PCAは、共分散行列(「主軸」)の固有ベクトルを計算し、それらを固有値(説明された分散の量)で並べ替えます。次に、中心データをこれらの主軸に投影して、主成分(「スコア」)を生成できます。次元削減のために、主成分のサブセットのみを保持し、残りを破棄できます。素人によるPCAの紹介については、こちらを参照してください。)

ましょであるN × Pを有するデータ行列のn列(データポイント)とp個の列(変数、または機能)。各行から平均ベクトルを減算した後、中央に配置されたデータ行列を取得します。してみましょうなるいくつかの行列我々が使用する固有ベクトル。これらはほとんどの場合、最大の固有値を持つ固有ベクトルです。次に、PCA投影(「スコア」)の行列は、によって簡単に与えられます。Xrawn×pnpX Vの P × k個のk個のK のn × k個のZ = X VμXVp×kkkn×kZ=XV

これを次の図に示します。最初のサブプロットは、いくつかの中心データ(リンクされたスレッドのアニメーションで使用するものと同じデータ)と、最初の主軸上の投影を示します。2番目のサブプロットは、この投影法の値のみを示しています。次元が2から1に削減されました。

ここに画像の説明を入力してください

この1つの主成分から元の2つの変数を再構成できるようにするために、して次元にマップし直すことができます。実際、各PCの値は、投影に使用されたのと同じベクトルに配置する必要があります。サブプロット1と3を比較します。結果は与えられます。上記の3番目のサブプロットに表示しています。最終的な再構成を取得するには、平均ベクトルを追加する必要があります。VX = ZのV = X V VX μpVX^=ZV=XVVX^rawμ

PCA reconstruction=PC scoresEigenvectors+Mean

に行列を乗算することにより、最初のサブプロットから3番目のサブプロットに直接移動できることに注意してください。それは射影行列と呼ばれます。すべての個の固有ベクトルが使用される場合、は単位行列です(次元削減は実行されないため、「再構成」は完全です)。固有ベクトルのサブセットのみが使用される場合、それは同一性ではありません。V Vのp VのVXVVpVV

これは、PC空間の任意の点します。元の空間にマッピングできます。、X = ZのVzx^=zV

主要なPCの破棄(削除)

場合によっては、先頭のPCを保持して(上記のように)残りを破棄するのではなく、1つまたはいくつかの主要なPCを破棄(削除)して残りを保持したいことがあります。この場合、すべての式はまったく同じままですが、は、破棄するものを除くすべての主軸で構成する必要があります。言い換えれば、は常に保持したいすべてのPCを含める必要があります。VV

相関に関するPCAに関する注意事項

PCAが(共分散行列ではなく)相関行列で行われる場合、生データは、減算 することでされるだけでなく、各列を標準偏差除算することによってスケーリングされます。この場合、元のデータを再構築するには、の列をでバックスケールしてから、平均ベクトルを追加し直す必要があります。 μ σ I X σ I μXrawμσiX^σiμ


画像処理例

このトピックは、画像処理のコンテキストでよく取り上げられます。Lennaを考えてみてください-画像処理に関する文献の標準的な画像の1つです(リンクをたどって、それがどこから来たかを見つけてください)。左下に、このイメージのグレースケールバリアントを表示します(ファイルはこちらから入手できます)。512×512

Lennaイメージの2つのグレースケールバージョン。 右側のものは粗いですが、間違いなく認識できます。

このグレースケール画像をデータ行列として扱うことができ。それに対してPCAを実行し、最初の50個の主成分を使用してを計算します。結果は右側に表示されます。XX512×512XrawX^raw


SVDを元に戻す

PCAは特異値分解(SVD)と非常に密接に関連しています。SVDとPCAの関係を参照してください SVDを使用してPCAを実行する方法 詳細については。もし行列としてSVD-EDで及び一方が選択する次元ベクトル "縮小"の点を表し -spaceを寸法、その後に戻ってそれをマッピングするため一つでそれを乗算する必要寸法。X X = U S V kはZ Uのk個のp S 1 K 1 k個の V 1 kはn×pXX=USVkzUkpS1:k,1:kV:,1:k


R、Matlab、Python、およびStataの例

Fisher Irisデータで PCAを実行し、最初の2つの主成分を使用してデータを再構築します。私は相関行列ではなく共分散行列でPCAを実行しています。つまり、ここでは変数をスケーリングしていません。しかし、まだ平均値を追加する必要があります。Stataなどの一部のパッケージは、標準の構文を使用してこれを処理します。@StasKと@Kodiologistにコードを手伝ってくれてありがとう。

最初のデータポイントの再構築を確認します。

5.1        3.5         1.4        0.2

Matlab

load fisheriris
X = meas;
mu = mean(X);

[eigenvectors, scores] = pca(X);

nComp = 2;
Xhat = scores(:,1:nComp) * eigenvectors(:,1:nComp)';
Xhat = bsxfun(@plus, Xhat, mu);

Xhat(1,:)

出力:

5.083      3.5174      1.4032     0.21353

R

X = iris[,1:4]
mu = colMeans(X)

Xpca = prcomp(X)

nComp = 2
Xhat = Xpca$x[,1:nComp] %*% t(Xpca$rotation[,1:nComp])
Xhat = scale(Xhat, center = -mu, scale = FALSE)

Xhat[1,]

出力:

Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   5.0830390    3.5174139    1.4032137    0.2135317

画像のPCA再構成のRの例については、この回答も参照してください。

Python

import numpy as np
import sklearn.datasets, sklearn.decomposition

X = sklearn.datasets.load_iris().data
mu = np.mean(X, axis=0)

pca = sklearn.decomposition.PCA()
pca.fit(X)

nComp = 2
Xhat = np.dot(pca.transform(X)[:,:nComp], pca.components_[:nComp,:])
Xhat += mu

print(Xhat[0,])

出力:

[ 5.08718247  3.51315614  1.4020428   0.21105556]

これは、他の言語の結果とわずかに異なることに注意してください。これは、PythonバージョンのIrisデータセットにミスが含まれているためです。

スタタ

webuse iris, clear
pca sep* pet*, components(2) covariance
predict _seplen _sepwid _petlen _petwid, fit
list in 1

  iris   seplen   sepwid   petlen   petwid    _seplen    _sepwid    _petlen    _petwid  
setosa      5.1      3.5      1.4      0.2   5.083039   3.517414   1.403214   .2135317  

1
MATLABでは、標準のPCA出力からmuを取得できます。また、入力にコンポーネントの数を指定できます。
アクサカル

2
@Aksakal私は、3つのコードの抜粋すべてを可能な限り類似(および明確)にしようとしました。特に、pca()を呼び出す前に手動でを計算し、すべてのコンポーネントでPCAを実行し、スコアと固有ベクトル間のドット積を実行するときにコンポーネントのみを使用したいと考えました。同じパターンに従うようにPythonコードを変更しました。μnComp
アメーバ

3
そのかわいい女の子の画像や画像処理など、質問に対する直接的な答えとは関係のない答えからすべてを削除します。誰かが画像に興味がない場合、消費が難しくなります。質問をしている人は誰でもすでに混乱していることを覚えておいてください。
アクサカル

5
レナは、アイリスと同じくらい標準的なデータセットです。
StasK

2
@amoebaサイズ、ビット深度、境界の黒いピクセルについても話していました。決定版はありませんhttp://www.ece.rice.edu/~wakin/images/:「レナ(別名「レナ」)テストイメージには多くのバージョンがあるようです。この問題はシャピロによって指摘されました。彼の1993年のゼロツリーペーパーで、今日でも驚くほど真実です」
ローランデュバル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.