큰 데이터 집합이 있고 차원 축소를 수행하고 싶습니다.
이제 어디서나 PCA를 사용할 수 있다는 것을 읽었습니다. 그러나 여전히 PCA를 계산 / 수행 한 후해야 할 일을 찾지 못하는 것 같습니다. R에서는이 명령을 사용하여 쉽게 수행 할 수 있습니다 princomp
.
그러나 PCA를 계산 한 후 어떻게해야합니까? 처음 주요 구성 요소 를 사용하기로 결정한 경우 데이터 세트를 정확히 줄이려면 어떻게해야합니까?
큰 데이터 집합이 있고 차원 축소를 수행하고 싶습니다.
이제 어디서나 PCA를 사용할 수 있다는 것을 읽었습니다. 그러나 여전히 PCA를 계산 / 수행 한 후해야 할 일을 찾지 못하는 것 같습니다. R에서는이 명령을 사용하여 쉽게 수행 할 수 있습니다 princomp
.
그러나 PCA를 계산 한 후 어떻게해야합니까? 처음 주요 구성 요소 를 사용하기로 결정한 경우 데이터 세트를 정확히 줄이려면 어떻게해야합니까?
답변:
귀하의 질문에서 얻는 것이 적은 수의 주요 구성 요소 (PC)를 사용하는 데이터 잘림과 관련이 있다고 생각합니다. 이러한 연산의 경우, prcomp
재구성에 사용 된 행렬 곱셈을 시각화하는 것이 더 쉽다는 점에서 함수 가 더 예시 적이 라고 생각합니다 .
먼저 합성 데이터 세트를 제공합니다 Xt
. PCA를 수행합니다 (공분산 행렬과 관련된 PC의 설명을 위해 샘플을 중앙에 배치합니다).
#Generate data
m=50
n=100
frac.gaps <- 0.5 # the fraction of data with NaNs
N.S.ratio <- 0.25 # the Noise to Signal ratio for adding noise to data
x <- (seq(m)*2*pi)/m
t <- (seq(n)*2*pi)/n
#True field
Xt <-
outer(sin(x), sin(t)) +
outer(sin(2.1*x), sin(2.1*t)) +
outer(sin(3.1*x), sin(3.1*t)) +
outer(tanh(x), cos(t)) +
outer(tanh(2*x), cos(2.1*t)) +
outer(tanh(4*x), cos(0.1*t)) +
outer(tanh(2.4*x), cos(1.1*t)) +
tanh(outer(x, t, FUN="+")) +
tanh(outer(x, 2*t, FUN="+"))
Xt <- t(Xt)
#PCA
res <- prcomp(Xt, center = TRUE, scale = FALSE)
names(res)
결과 또는 prcomp
에서 PC ( res$x
), 고유 값 ( res$sdev
), 각 PC의 크기 및로드 ( res$rotation
) 에 대한 정보를 제공합니다 .
res$sdev
length(res$sdev)
res$rotation
dim(res$rotation)
res$x
dim(res$x)
고유 값을 제곱하면 각 PC에서 설명하는 분산을 얻을 수 있습니다.
plot(cumsum(res$sdev^2/sum(res$sdev^2))) #cumulative explained variance
마지막으로, 주요 (중요) PC 만 사용하여 잘린 버전의 데이터를 만들 수 있습니다.
pc.use <- 3 # explains 93% of variance
trunc <- res$x[,1:pc.use] %*% t(res$rotation[,1:pc.use])
#and add the center (and re-scale) back to data
if(res$scale != FALSE){
trunc <- scale(trunc, center = FALSE , scale=1/res$scale)
}
if(res$center != FALSE){
trunc <- scale(trunc, center = -1 * res$center, scale=FALSE)
}
dim(trunc); dim(Xt)
소규모 기능이 필터링되어 결과가 약간 더 부드러운 데이터 매트릭스임을 알 수 있습니다.
RAN <- range(cbind(Xt, trunc))
BREAKS <- seq(RAN[1], RAN[2],,100)
COLS <- rainbow(length(BREAKS)-1)
par(mfcol=c(1,2), mar=c(1,1,2,1))
image(Xt, main="Original matrix", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()
image(trunc, main="Truncated matrix (3 PCs)", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()
다음은 prcomp 함수 외부에서 수행 할 수있는 매우 기본적인 접근 방식입니다.
#alternate approach
Xt.cen <- scale(Xt, center=TRUE, scale=FALSE)
C <- cov(Xt.cen, use="pair")
E <- svd(C)
A <- Xt.cen %*% E$u
#To remove units from principal components (A)
#function for the exponent of a matrix
"%^%" <- function(S, power)
with(eigen(S), vectors %*% (values^power * t(vectors)))
Asc <- A %*% (diag(E$d) %^% -0.5) # scaled principal components
#Relationship between eigenvalues from both approaches
plot(res$sdev^2, E$d) #PCA via a covariance matrix - the eigenvalues now hold variance, not stdev
abline(0,1) # same results
이제 유지하는 PC를 결정하는 것은 별도의 문제는 - 내가 잠시 다시 관심 것을 하나 . 희망이 도움이됩니다.
prcomp
. 한 번 봐 가지고 res$center
와 res$scale
. IMHO 이들을 사용하는 것은 오류가 적습니다 (명시 적 호출 scale
과 호출간에 센터링 또는 스케일링에 대한 우연한 차이가 없음 prcomp
).
what to do after calculating the PCA
또는 의에 대한 OP의 질문에 답변하지 않기 때문에 확장이 필요합니다 how do I reduce my dataset exactly
. OP가 그의 샘플에 대해 PCA를 수행했다는 점을 고려할 때, 그의 질문은 그것과 관련이 있으며,이 서브 샘플과 실제로 어떤 일이 진행 되는가입니다. PCA를 수행하는 방법이 아닙니다. 우리는 E <- eigen(cov(Sample)); A<- scale(scale=F, Sample) %*% E$vectors
또한 점수를 얻는 또 다른 방법을 얻는 것을 제안 할 수도 있습니다 (실제로 princomp 가하는 것입니다 stats:::princomp.default
).
이 다른 답변은 매우 훌륭하고 상세하지만 실제로 훨씬 더 기본적인 질문을하고 있는지 궁금합니다 .PC가 있으면 어떻게해야합니까?
각 PC는 단순히 새로운 변수가됩니다. PC1이 전체 변형의 60 %를 차지하고 PC2가 30 %를 차지한다고 가정합니다. 전체 변형의 90 %가 고려되었으므로이 두 가지 새로운 변수 (PC)를 원래 변수의 단순화 된 버전으로 간단히 사용할 수 있습니다. 즉, 관심이 있다면 모델에 모델을 맞추는 것을 의미합니다. 결과를 해석 할 때가되면 각 PC와 관련된 원래 변수와 관련하여 그렇게합니다.
질문의 범위를 과소 평가했다면 죄송합니다.
실제로 PCA에서는 PC의 투영 ( "점수")을 원본 샘플의 대리 데이터로 사용합니다. 점수에 대한 모든 분석을 수행 한 후 PC를 사용하여 원래 샘플을 다시 재구성하여 원래 공간에서 발생한 결과를 찾습니다 (기본적으로 주성분 회귀 ). 분명히, 고유 벡터를 의미있는 해석기 ( "적재")로 해석 할 수 있다면 훨씬 더 나은 위치에있을 것입니다. 재구성에 전혀 신경 쓰지 않습니다. :)
일반적으로 "PCA 계산 후"는 분석 대상에 따라 다릅니다. PCA는 RSS 재구성 기준에서 최적 인 데이터의 선형 독립 서브 샘플을 제공합니다. 분류, 회귀 또는 둘 다에 사용할 수 있으며, 앞에서 언급했듯이 표본에서 의미있는 직교 변형 모드를 인식하려고 할 수 있습니다.
의견 : 유지해야 할 구성 요소의 수를 결정 하는 가장 순진한 방법은 임의의 숫자가 아닌 차원이 축소 된 샘플에 유지하려는 샘플 변동의 임계 값을 기준으로 추정하는 것입니다. user4959가 설명했듯이 $loadings
에서 생성 한 목록 개체 의 필드 아래에서 목록의 관련 필드를 확인하여 누적 변동을 확인할 수 있습니다 princomp
.
PCA를 수행 한 후 처음 두 개의 구성 요소를 선택하고 플롯 할 수 있습니다. R의 스크리닝 플롯을 사용하여 구성 요소의 변형을 볼 수 있습니다. 또한 loadings = T와 함께 요약 함수를 사용하면 구성 요소로 피처의 변형을 찾을 수 있습니다.
이 http://www.statmethods.net/advstats/factor.html 및 http://statmath.wu.ac.at/~hornik/QFS1/principal_component-vignette.pdf를 볼 수도 있습니다 .
원하는 것을 생각하십시오. PCA 분석에서 많은 것을 해석 할 수 있습니다.
최고의 아비 크