이 스레드에서 JD Long의 훌륭한 게시물을 읽은 후 간단한 예제와 PCA를 생성하는 데 필요한 R 코드를 찾은 다음 원래 데이터로 돌아갑니다. 그것은 나에게 직접적인 기하학적 직감을 부여했고, 내가 얻은 것을 공유하고 싶습니다. 데이터 세트와 코드는 직접 복사하여 R 형식으로 Github에 붙여 넣을 수 있습니다 .
여기 에서 반도체에서 온라인으로 찾은 데이터 세트를 사용했으며 플로팅을 용이하게하기 위해 "원자 번호"와 "용융점"의 2 차원으로 잘라 냈습니다.
주의 사항은이 아이디어가 전적으로 계산 과정을 설명하는 것입니다. PCA는 두 개 이상의 변수를 몇 가지 파생 주성분으로 줄이거 나 여러 피쳐의 경우 공선 성을 식별하는 데 사용됩니다. 따라서 두 변수의 경우에는 많은 응용 프로그램을 찾지 못하고 @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][0.7,0.7]
e_vectors[,1] = - e_vectors[,1]; colnames(e_vectors) <- c("PC1","PC2")
결과 고유 값은 및 입니다. 최소한의 조건에서이 결과는 포함 할 고유 벡터를 결정하는 데 도움이되었습니다 (최대 고유 값). 예를 들어, 첫 번째 고유 값의 상대적 기여는 : 이며 이는 데이터 변동성의 를 합니다. 두 번째 고유 벡터 방향의 변동성은 입니다. 이것은 일반적으로 고유 값의 값을 나타내는 scree plot에 표시됩니다.0.7035783 64.8 % ~ 65 % 35.2 %1.29642170.703578364.8%eigen(C)$values[1]/sum(eigen(C)$values) * 100∼65%35.2%

이 장난감 데이터 세트 예제의 작은 크기를 고려하여 두 고유 벡터를 모두 포함 할 것입니다. 고유 벡터 중 하나를 제외하면 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의 "로드"에 반영됩니다. 우리의 경우, 두 번째 고유 벡터의 두 번째 성분에있는 음의 부호 는 PC2를 생성하는 선형 조합의 녹는 점 값의 부호를 바꾸는 반면 첫 번째 고유 벡터의 효과는 지속적으로 양의 값을 갖습니다. [0.7,−0.7]

고유 벡터의 크기는 로 조정됩니다 .1
> apply(e_vectors, 2, function(x) sum(x^2))
PC1 PC2
1 1
반면 ( loading )은 고유 값에 의해 스케일링 된 고유 벡터입니다 (아래에 표시된 내장 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
결과는 다음과 같습니다. 먼저 개별 점에서 첫 번째 고유 벡터까지의 거리와 두 번째 플롯에서 두 번째 고유 벡터까지의 직교 거리를 나타냅니다.

대신 점수 행렬 (PC1 및 PC2)의 값을 더 이상 "melting.point"및 "atomic.no"로 플롯하지 않고 실제로 고유 벡터를 기준으로 한 점 좌표의 기준 변경 인 경우 이러한 거리는 다음과 같습니다. 보존되지만 xy 축에 수직으로 자연스럽게 나타납니다.

비결은 이제 원래 데이터 를 복구하는 것이 었습니다 . 점들은 고유 벡터에 의한 간단한 행렬 곱셈을 통해 변형되었습니다. 이제 데이터 포인트의 위치에 현저한 변화가있는 고유 벡터 행렬의 역수를 곱하여 데이터를 다시 회전 시켰습니다 . 예를 들어, 왼쪽 상단 사분면 (아래 왼쪽 그림의 검은 색 원)에서 분홍색 점 "GaN"이 바뀌고 왼쪽 하단 사분면의 초기 위치 (아래 오른쪽 그림의 검은 색 원)로 돌아갑니다.
이제 우리는이 "회전 방지 된"행렬에서 원래 데이터를 복원했습니다.

PCA에서 데이터의 회전 좌표 변경을 넘어서서 결과를 해석해야하며,이 프로세스 biplot는 데이터 포인트가 새로운 고유 벡터 좌표와 관련하여 그려지고 원래 변수가 다음과 같이 겹쳐 지는 경향이 있습니다. 벡터. (따르는 그래프의 좌측으로) ( "XY 축 = 고유 벡터와 스코어") 위의 회전 그래프의 두 번째 행의 그래프의 점의 위치에서 동등한 흥미 롭다 및 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 의이 대화 형 자습서 는 데이터 클라우드가 수정 될 때 고유 벡터의 변경 사항에 대한 즉각적인 피드백을 제공합니다.