投稿したチュートリアルの13〜20ページでは、PCAが次元削減にどのように使用されるかについて、非常に直感的な幾何学的説明を提供しています。
あなたが言及する13x13マトリックスは、おそらく「ロード」または「回転」マトリックス(元のデータに13個の変数があったと思いますか)です。
ロードマトリックスの(の絶対値)列は、各変数が各コンポーネントに比例して「寄与する」量を示します。
回転行列は、回転行列で定義された基準に基づいてデータを回転させます。したがって、2次元データがあり、そのデータに回転行列を掛けると、新しいX軸が最初の主成分になり、新しいY軸が2番目の主成分になります。
編集:この質問は多くの質問がありますので、次元削減のためにPCAを使用する際に何が起こっているのかを視覚的に詳細に説明します。
y = x +ノイズから生成された50ポイントのサンプルを考えます。以下に示すように、最初の主成分はy = xの線に沿って配置され、2番目の成分はy = -xの線に沿って配置されます。
アスペクト比は少し混乱しますが、コンポーネントは直交していると言います。PCAを適用すると、コンポーネントがx軸とy軸になるようにデータが回転します。
変換前のデータは円、後のデータは十字です。この特定の例では、データはy = -2xの線で反転するほど回転しませんでしたが、ここで説明したように、y軸を簡単に反転させて一般性を損なうことなく本当に回転させることができます。
分散の大部分、つまりデータ内の情報は、最初の主成分(データを変換した後のx軸で表される)に沿って広がります。2番目のコンポーネント(現在はy軸)に沿ってわずかな変動がありますが、情報を大幅に失うことなくこのコンポーネントを完全に削除できます。したがって、これを2次元から1に折りたたむには、最初の主成分へのデータの投影にデータを完全に記述させます。
元の軸に回転(投影、投影)することで、元のデータを部分的に復元できます。
濃い青色の点は「回復した」データであり、空の点は元のデータです。ご覧のとおり、元のデータから一部の情報、特に2番目の主成分の方向の分散が失われています。しかし、多くの目的のために、この圧縮された説明(最初の主成分に沿った投影を使用)は私たちのニーズに合うかもしれません。
これを自分で複製したい場合に、この例を生成するために使用したコードを次に示します。2行目のノイズ成分の分散を減らすと、データが最初の主成分に収束するため、PCA変換によって失われるデータの量も減少します。
set.seed(123)
y2 = x + rnorm(n,0,.2)
mydata = cbind(x,y2)
m2 = colMeans(mydata)
p2 = prcomp(mydata, center=F, scale=F)
reduced2= cbind(p2$x[,1], rep(0, nrow(p2$x)))
recovered = reduced2 %*% p2$rotation
plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Data with principal component vectors')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+abs(p2$rotation[1,1])
,y1=m2[2]+abs(p2$rotation[2,1])
, col='red')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+p2$rotation[1,2]
,y1=m2[2]+p2$rotation[2,2]
, col='blue')
plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Data after PCA transformation')
points(p2$x, col='black', pch=3)
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+abs(p2$rotation[1,1])
,y1=m2[2]+abs(p2$rotation[2,1])
, col='red')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+p2$rotation[1,2]
,y1=m2[2]+p2$rotation[2,2]
, col='blue')
arrows(x0=mean(p2$x[,1])
,y0=0
,x1=mean(p2$x[,1])
,y1=1
,col='blue'
)
arrows(x0=mean(p2$x[,1])
,y0=0
,x1=-1.5
,y1=0
,col='red'
)
lines(x=c(-1,1), y=c(2,-2), lty=2)
plot(p2$x, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='PCA dimensionality reduction')
points(reduced2, pch=20, col="blue")
for(i in 1:n){
lines(rbind(reduced2[i,], p2$x[i,]), col='blue')
}
plot(mydata, xlim=c(-1.5,1.5), ylim=c(-1.5,1.5), main='Lossy data recovery after PCA transformation')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+abs(p2$rotation[1,1])
,y1=m2[2]+abs(p2$rotation[2,1])
, col='red')
arrows(x0=m2[1], y0=m2[2]
,x1=m2[1]+p2$rotation[1,2]
,y1=m2[2]+p2$rotation[2,2]
, col='blue')
for(i in 1:n){
lines(rbind(recovered[i,], mydata[i,]), col='blue')
}
points(recovered, col='blue', pch=20)