主成分分析(PCA)は、次元削減に使用できます。このような次元削減が実行された後、少数の主成分から元の変数/機能をどのように近似的に再構築できますか?
あるいは、データから複数の主成分をどのように削除または破棄できますか?
言い換えれば、PCAを逆にする方法は?
PCAが特異値分解(SVD)と密接に関連していることを考えると、次のように同じ質問をすることができます。SVDを逆にする方法は?
主成分分析(PCA)は、次元削減に使用できます。このような次元削減が実行された後、少数の主成分から元の変数/機能をどのように近似的に再構築できますか?
あるいは、データから複数の主成分をどのように削除または破棄できますか?
言い換えれば、PCAを逆にする方法は?
PCAが特異値分解(SVD)と密接に関連していることを考えると、次のように同じ質問をすることができます。SVDを逆にする方法は?
回答:
PCAは、共分散行列(「主軸」)の固有ベクトルを計算し、それらを固有値(説明された分散の量)で並べ替えます。次に、中心データをこれらの主軸に投影して、主成分(「スコア」)を生成できます。次元削減のために、主成分のサブセットのみを保持し、残りを破棄できます。(素人によるPCAの紹介については、こちらを参照してください。)
ましょであるN × Pを有するデータ行列のn列(データポイント)とp個の列(変数、または機能)。各行から平均ベクトルを減算した後、中央に配置されたデータ行列を取得します。してみましょうなるいくつかの行列我々が使用する固有ベクトル。これらはほとんどの場合、最大の固有値を持つ固有ベクトルです。次に、PCA投影(「スコア」)の行列は、によって簡単に与えられます。X Vの P × k個のk個のK のn × k個のZ = X V
これを次の図に示します。最初のサブプロットは、いくつかの中心データ(リンクされたスレッドのアニメーションで使用するものと同じデータ)と、最初の主軸上の投影を示します。2番目のサブプロットは、この投影法の値のみを示しています。次元が2から1に削減されました。
この1つの主成分から元の2つの変数を再構成できるようにするために、して次元にマップし直すことができます。実際、各PCの値は、投影に使用されたのと同じベクトルに配置する必要があります。サブプロット1と3を比較します。結果は与えられます。上記の3番目のサブプロットに表示しています。最終的な再構成を取得するには、平均ベクトルを追加する必要があります。V ⊤ X = ZのV ⊤ = X V V ⊤ X生 μ
に行列を乗算することにより、最初のサブプロットから3番目のサブプロットに直接移動できることに注意してください。それは射影行列と呼ばれます。すべての個の固有ベクトルが使用される場合、は単位行列です(次元削減は実行されないため、「再構成」は完全です)。固有ベクトルのサブセットのみが使用される場合、それは同一性ではありません。V V ⊤のp VのV ⊤
これは、PC空間の任意の点します。元の空間にマッピングできます。、X = ZのV ⊤
主要なPCの破棄(削除)
場合によっては、先頭のPCを保持して(上記のように)残りを破棄するのではなく、1つまたはいくつかの主要なPCを破棄(削除)して残りを保持したいことがあります。この場合、すべての式はまったく同じままですが、は、破棄するものを除くすべての主軸で構成する必要があります。言い換えれば、は常に保持したいすべてのPCを含める必要があります。
相関に関するPCAに関する注意事項
PCAが(共分散行列ではなく)相関行列で行われる場合、生データは、減算 することでされるだけでなく、各列を標準偏差除算することによってスケーリングされます。この場合、元のデータを再構築するには、の列をでバックスケールしてから、平均ベクトルを追加し直す必要があります。 μ σ I X σ I μ
このトピックは、画像処理のコンテキストでよく取り上げられます。Lennaを考えてみてください-画像処理に関する文献の標準的な画像の1つです(リンクをたどって、それがどこから来たかを見つけてください)。左下に、このイメージのグレースケールバリアントを表示します(ファイルはこちらから入手できます)。
このグレースケール画像をデータ行列として扱うことができ。それに対してPCAを実行し、最初の50個の主成分を使用してを計算します。結果は右側に表示されます。X生X生
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は
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
nComp