R에서 PCA를 사용하여 차원 축소를 수행하는 방법


30

큰 데이터 집합이 있고 차원 축소를 수행하고 싶습니다.

이제 어디서나 PCA를 사용할 수 있다는 것을 읽었습니다. 그러나 여전히 PCA를 계산 / 수행 한 후해야 할 일을 찾지 못하는 것 같습니다. R에서는이 명령을 사용하여 쉽게 수행 할 수 있습니다 princomp.

그러나 PCA를 계산 한 후 어떻게해야합니까? 처음 주요 구성 요소 를 사용하기로 결정한 경우 데이터 세트를 정확히 줄이려면 어떻게해야합니까?100


이 질문은 명확하지 않지만 (100 대의 PC 차원이 축소 된 데이터 세트 임) 구체적으로 원래 변수를 재구성하는 방법 (허용 된 답변의 주제)을 참조하십시오. PCA를 반대로 바꾸고 여러 주요 구성 요소에서 원래 변수를 재구성하는 방법은 무엇입니까?
amoeba는

답변:


35

귀하의 질문에서 얻는 것이 적은 수의 주요 구성 요소 (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를 결정하는 것은 별도의 문제는 - 내가 잠시 다시 관심 것을 하나 . 희망이 도움이됩니다.


2
마크, 센터와 스케일을 명시 적으로 기록 할 필요는 없습니다 prcomp. 한 번 봐 가지고 res$centerres$scale. IMHO 이들을 사용하는 것은 오류가 적습니다 (명시 적 호출 scale과 호출간에 센터링 또는 스케일링에 대한 우연한 차이가 없음 prcomp).
cbeleites는 Monica를 지원합니다

1
이 답변은 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).
usεr11852는 Reinstate Monic이

1
@ user11852-질문은 구체적으로 데이터 세트 감소 (즉, 여기에서 설명한 잘림)를 참조합니다. 나는 이것이 그가 찾고 있던 것인지 아닌지를 결정하기 위해 그에게 맡길 것입니다.
Marc in the box

1
@Marc, 답변 주셔서 감사합니다. 위의 답변 중 하나가 차원 축소를 처리하는 방식에 붙어 있기 때문에 물러서서 다시 모든 것을 다시 읽어야 할 수도 있습니다. 보여 주듯이 dim (trunc) = dim (Xt). 그것의 이점은 무엇입니까, 차원은 줄어들지 않았습니다.
B_Miner

2
@B_Miner-잘림은 데이터의 주요 패턴에 초점을 맞추고 소규모 패턴 및 노이즈를 필터링하는 데 사용됩니다. 잘린 데이터의 크기는 작지만 "더 깨끗합니다". 그러나 잘림은 몇 개의 벡터로 전체 행렬을 재구성 할 수 있다는 점에서 데이터 양을 줄입니다. 좋은 예는 이미지 압축을 위해 PCA를 사용하는 것인데, 더 적은 수의 PC를 사용하여 이미지를 재구성 할 수 있습니다. 벡터의이 작은 부분 집합은 더 적은 메모리를 차지하지만 재구성은 소규모 세부 사항에서 약간의 손실이 있습니다.
Marc in the box

3

이 다른 답변은 매우 훌륭하고 상세하지만 실제로 훨씬 더 기본적인 질문을하고 있는지 궁금합니다 .PC가 있으면 어떻게해야합니까?

각 PC는 단순히 새로운 변수가됩니다. PC1이 전체 변형의 60 %를 차지하고 PC2가 30 %를 차지한다고 가정합니다. 전체 변형의 90 %가 고려되었으므로이 두 가지 새로운 변수 (PC)를 원래 변수의 단순화 된 버전으로 간단히 사용할 수 있습니다. 즉, 관심이 있다면 모델에 모델을 맞추는 것을 의미합니다. 결과를 해석 할 때가되면 각 PC와 관련된 원래 변수와 관련하여 그렇게합니다.

질문의 범위를 과소 평가했다면 죄송합니다.


2

나는λ나는Σ케이=1λ케이=784λ

실제로 PCA에서는 PC의 투영 ( "점수")을 원본 샘플의 대리 데이터로 사용합니다. 점수에 대한 모든 분석을 수행 한 후 PC를 사용하여 원래 샘플을 다시 재구성하여 원래 공간에서 발생한 결과를 찾습니다 (기본적으로 주성분 회귀 ). 분명히, 고유 벡터를 의미있는 해석기 ( "적재")로 해석 할 수 있다면 훨씬 더 나은 위치에있을 것입니다. 재구성에 전혀 신경 쓰지 않습니다. :)

일반적으로 "PCA 계산 후"는 분석 대상에 따라 다릅니다. PCA는 RSS 재구성 기준에서 최적 인 데이터의 선형 독립 서브 샘플을 제공합니다. 분류, 회귀 또는 둘 다에 사용할 수 있으며, 앞에서 언급했듯이 표본에서 의미있는 직교 변형 모드를 인식하려고 할 수 있습니다.

의견 : 유지해야 할 구성 요소의 수를 결정 하는 가장 순진한 방법은 임의의 숫자가 아닌 차원이 축소 된 샘플에 유지하려는 샘플 변동의 임계 값을 기준으로 추정하는 것입니다. user4959가 설명했듯이 $loadings에서 생성 한 목록 개체 의 필드 아래에서 목록의 관련 필드를 확인하여 누적 변동을 확인할 수 있습니다 princomp.


1
주성분 회귀 분석을 언급했듯이 R에서 패키지 pls가 제공합니다. 유지해야 할 성분의 수에 관해서는, %에 대한 % 분산을 결정하는 실질적인 이점은 없습니다. @ Marc-in-the-box가 언급했듯이 적절한 PC 수를 결정하는 다양한 방법이 있으며 전략은 ( – 데이터 유형과 데이터 분석 유형에 따라
다름

plsprincomp {stats}KKD

1
예, 순진합니다. 설명 된 분산의 임의 %를 설정하면 다른 임의 컷오프의 본질적인 이점이 있다는 데 동의하지 않습니다. 그러나 이것은 OP에 대해 싸울 가치가 없다. a) OP는 결코 아니오를 선택하는 것에 대한 조언을 요구하지 않았다. b) 우리는 PCA 모델의 적절한 검사가 어쨌든 수행되어야한다는 데 동의합니다.
cbeleites는 Monica를 지원합니다

문제 없어; 어쨌든 대답하기 전에 한 의견이었습니다. (내가 말하고 싶은 것을 명확하게하기보다는 당황
스럽게

0

PCA를 수행 한 후 처음 두 개의 구성 요소를 선택하고 플롯 할 수 있습니다. R의 스크리닝 플롯을 사용하여 구성 요소의 변형을 볼 수 있습니다. 또한 loadings = T와 함께 요약 함수를 사용하면 구성 요소로 피처의 변형을 찾을 수 있습니다.

http://www.statmethods.net/advstats/factor.htmlhttp://statmath.wu.ac.at/~hornik/QFS1/principal_component-vignette.pdf를 볼 수도 있습니다 .

원하는 것을 생각하십시오. PCA 분석에서 많은 것을 해석 할 수 있습니다.

최고의 아비 크

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.