このスレッドでのJD Longのすばらしい投稿の後、簡単な例を探し、PCAを生成して元のデータに戻るために必要なRコードを探しました。いくつかの直接的な幾何学的な直感を与えてくれたので、得たものを共有したいと思います。データセットとコードを直接コピーして、RフォームGithubに貼り付けることができます。
ここで半導体でオンラインで見つけたデータセットを使用し、プロットを容易にするために、「原子番号」と「融点」の2つの次元にトリミングしました。
注意事項として、この概念は計算プロセスの単なる説明です。PCAは、2つ以上の変数をいくつかの派生主成分に減らすため、または複数の特徴の場合に共線性を識別するために使用されます。したがって、2つの変数の場合にはあまり適用されず、@ amoebaで指摘されているように相関行列の固有ベクトルを計算する必要もありません。
さらに、個々のポイントを追跡するタスクを簡単にするために、観測値を44から15に切り捨てました。最終的な結果は、スケルトンデータフレーム(dat1
)です。
compounds atomic.no melting.point
AIN 10 498.0
AIP 14 625.0
AIAs 23 1011.5
... ... ...
「化合物」列は、半導体の化学組成を示し、行名の役割を果たします。
これは次のように再現できます(Rコンソールでコピーして貼り付ける準備ができています)。
dat <- read.csv(url("http://rinterested.github.io/datasets/semiconductors"))
colnames(dat)[2] <- "atomic.no"
dat1 <- subset(dat[1:15,1:3])
row.names(dat1) <- dat1$compounds
dat1 <- dat1[,-1]
次に、データをスケーリングしました。
X <- apply(dat1, 2, function(x) (x - mean(x)) / sd(x))
# This centers data points around the mean and standardizes by dividing by SD.
# It is the equivalent to `X <- scale(dat1, center = T, scale = T)`
線形代数のステップは次のとおりです。
C <- cov(X) # Covariance matrix (centered data)
⎡⎣⎢at_nomelt_pat_no10.296melt_p0.2961⎤⎦⎥
相関関数cor(dat1)
は、スケーリングされていないデータでも、スケーリングされたデータの関数と同じ出力を提供しcov(X)
ます。
lambda <- eigen(C)$values # Eigenvalues
lambda_matrix <- diag(2)*eigen(C)$values # Eigenvalues matrix
⎡⎣⎢λPC11.2964220λPC200.7035783⎤⎦⎥
e_vectors <- eigen(C)$vectors # Eigenvectors
12√⎡⎣⎢PC111PC21−1⎤⎦⎥
最初の固有ベクトルは最初にとして返されるため、組み込み式との一貫性をこれをに変更することを選択します。∼[−0.7,−0.7][0.7,0.7]
e_vectors[,1] = - e_vectors[,1]; colnames(e_vectors) <- c("PC1","PC2")
結果の固有値はおよび。最小限度の条件では、この結果はどの固有ベクトルを含めるかを決定するのに役立ちます(最大固有値)。たとえば、最初の固有値の相対的な寄与は:です。これは、データの変動性のを占めることを意味します。2番目の固有ベクトルの方向の変動はです。これは通常、固有値の値を表すスクリープロットに表示されます。1.29642170.703578364.8%eigen(C)$values[1]/sum(eigen(C)$values) * 100
∼65%35.2%
この玩具データセットの例のサイズが小さい場合、両方の固有ベクトルを含めます。固有ベクトルの1つを除外すると、次元の削減につながることを理解します-PCAの背後にある考え方。
スコア行列は、行列乗算として決定されたスケーリングされたデータ(X
による)の固有ベクトル(または「回転」)のマトリックス。
score_matrix <- X %*% e_vectors
# Identical to the often found operation: t(t(e_vectors) %*% t(X))
概念は、各固有ベクトルの行で重み付けされた中央の(この場合はスケーリングされた)データの各エントリ(この場合は行/主題/観測/超伝導体)の線形結合を必要とします。スコアマトリックス、データの各変数(列)(全体)からの寄与を見つけます。ただし、対応する固有ベクトルのみが計算に関与します(つまり、最初の固有ベクトルは次のように、(主成分1)およびへのに貢献し。X
PC[0.7,0.7]T[ 0.7 、− 0.7 ] T PCPC1[0.7,−0.7]TPC2
したがって、各固有ベクトルは各変数に異なる影響を与え、これはPCAの「負荷」に反映されます。この場合、2番目の固有ベクトルの2番目の成分の負符号は、PC2を生成する線形結合の融点値の符号を変更しますが、1番目の固有ベクトルの効果は常に正になります。 [0.7,−0.7]
固有ベクトルはスケーリングされます。1
> apply(e_vectors, 2, function(x) sum(x^2))
PC1 PC2
1 1
一方、(loadings)は固有値でスケーリングされた固有ベクトルです(下に表示される組み込みR関数の用語はわかりにくいですが)。したがって、負荷は次のように計算できます。
> e_vectors %*% lambda_matrix
[,1] [,2]
[1,] 0.9167086 0.497505
[2,] 0.9167086 -0.497505
> prcomp(X)$rotation %*% diag(princomp(covmat = C)$sd^2)
[,1] [,2]
atomic.no 0.9167086 0.497505
melting.point 0.9167086 -0.497505
回転したデータクラウド(スコアプロット)には、固有値に等しい各コンポーネント(PC)に沿った分散があることに注意してください。
> apply(score_matrix, 2, function(x) var(x))
PC1 PC2
53829.7896 110.8414
> lambda
[1] 53829.7896 110.8414
組み込み関数を使用して、結果を複製できます。
# For the SCORE MATRIX:
prcomp(X)$x
# or...
princomp(X)$scores # The signs of the PC 1 column will be reversed.
# and for EIGENVECTOR MATRIX:
prcomp(X)$rotation
# or...
princomp(X)$loadings
# and for EIGENVALUES:
prcomp(X)$sdev^2
# or...
princomp(covmat = C)$sd^2
あるいは、特異値分解()メソッドを適用して、PCAを手動で計算できます。実際、これはで使用されている方法です。手順は次のように綴ることができます。UΣVTprcomp()
svd_scaled_dat <-svd(scale(dat1))
eigen_vectors <- svd_scaled_dat$v
eigen_values <- (svd_scaled_dat$d/sqrt(nrow(dat1) - 1))^2
scores<-scale(dat1) %*% eigen_vectors
結果を以下に示します。最初に、個々の点から最初の固有ベクトルまでの距離、2番目のプロットでは、2番目の固有ベクトルまでの直交距離を示します。
代わりに、スコアマトリックス(PC1およびPC2)の値をプロットした場合、「melting.point」および「atomic.no」ではなく、固有ベクトルを基準としたポイント座標の基底の変化である場合、これらの距離は保存されますが、自然にxy軸に垂直になります:
トリックは、元のデータを回復することでした。点は、固有ベクトルによる単純な行列乗算によって変換されていました。これで、データは、固有ベクトルの行列の逆数とデータポイントの位置の顕著な変化を乗算することにより、逆回転されました。たとえば、左上の象限(下の左のプロットの黒丸)のピンクのドット「GaN」の変化に注目してください。左下の象限(下の右のプロットの黒丸)の初期位置に戻ります。
これで、最終的にこの「逆回転」行列で元のデータが復元されました。
PCAのデータの回転座標の変化を超えて、結果を解釈する必要があり、このプロセスではbiplot
、新しい固有ベクトル座標に対してデータポイントがプロットされ、元の変数がベクトル。(追従プロットで左)(「XY軸=固有ベクトルとスコア」)は、上記回転グラフの2行目のプロットとの間の点の位置に同等に注意することは興味深いことである、とbiplot
します(右):
赤い矢印はの解釈へのパスを提供するように、元の変数の重畳PC1
両方と方向(又は正の相関を有する)のベクトルとしてatomic no
、およびmelting point
、およびのPC2
増加する値に沿った成分として、atomic no
負の相関が melting point
あり、固有ベクトルの値と一致します:
PCA$rotation
PC1 PC2
atomic.no 0.7071068 0.7071068
melting.point 0.7071068 -0.7071068
Victor Powellによるこのインタラクティブなチュートリアルは、データクラウドが変更されたときの固有ベクトルの変化について即座にフィードバックを提供します。