이 스레드에서 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 의이 대화 형 자습서 는 데이터 클라우드가 수정 될 때 고유 벡터의 변경 사항에 대한 즉각적인 피드백을 제공합니다.