PCA의 구성 요소가 실제로 분산의 백분율을 나타 냅니까? 100 % 이상으로 합산 할 수 있습니까?


13

O'Reilly의 "해커를위한 기계 학습"에 따르면 각 주요 구성 요소는 분산의 백분율을 나타냅니다. 아래 페이지의 관련 부분을 인용했습니다 (8 장, 207 페이지). 다른 전문가와 이야기하면서, 그들은 그것이 백분율이라고 동의했습니다.

그러나 24 개 구성 요소의 합계는 133.2095 %입니다. 어떻게 그렇게 될수 있니?

우리가 PCA를 사용할 수 있다고 확신 한 후에 R에서 어떻게 할 수 있습니까? 여기서도 R이 빛을 발하는 곳입니다. PCA 전체를 한 줄의 코드로 수행 할 수 있습니다. princomp 함수를 사용하여 PCA를 실행합니다.

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])

pca를 R에 입력하면 주요 구성 요소에 대한 간단한 요약을 볼 수 있습니다.

Call:
princomp(x = date.stock.matrix[, 2:ncol(date.stock.matrix)])
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7
29.1001249 20.4403404 12.6726924 11.4636450 8.4963820 8.1969345 5.5438308
Comp.8 Comp.9 Comp.10 Comp.11 Comp.12 Comp.13 Comp.14
5.1300931 4.7786752 4.2575099 3.3050931 2.6197715 2.4986181 2.1746125
Comp.15 Comp.16 Comp.17 Comp.18 Comp.19 Comp.20 Comp.21
1.9469475 1.8706240 1.6984043 1.6344116 1.2327471 1.1280913 0.9877634
Comp.22 Comp.23 Comp.24
0.8583681 0.7390626 0.4347983
24 variables and 2366 observations.

이 요약에서 표준 편차는 서로 다른 주성분에 의해 데이터 세트의 분산이 얼마나 많이 설명되어 있는지 알려줍니다. Comp.1이라는 첫 번째 성분은 분산의 29 %를 차지하고 다음 성분은 20 %를 차지합니다. 결국 마지막 성분 인 Comp.24는 분산의 1 % 미만을 차지합니다. 즉, 첫 번째 주요 구성 요소 만 살펴보면 데이터에 대해 많은 것을 배울 수 있습니다.

[코드와 데이터는 github 에서 찾을 수 있습니다 .]


6
저자의 해석 Standard deviations은 약간 벗어난 것 같습니다. 표준 편차는 실제로 표준 편차이므로 각 성분이 나타내는 분산의 양을 확인하려면 제곱해야합니다. 첫 번째 구성 요소는 100 × 29.1001249 2를 나타냅니다. 총 분산의 2 %입니다. 100×29.1001249229.10012492++0.43479832
가정 정상

4
이 질문은 두 가지 기본적인 실수에서 비롯됩니다. (1) 숫자가 "표준 편차"라고 알리는 제목을 놓치고 분산으로 실수합니다. (2) 그 숫자는 퍼센트라고 가정하지만 그렇지 않습니다. (단위는 주식으로 측정되는 모든 것 : 연간 달러 또는 퍼센트 변화 또는 기타입니다.) 전혀 버그가 없습니다. @Max의 주석은 총 분산의 백분율을 찾는 방법을 설명합니다.
whuber

1
@whuber 아마도 "bug"대신 "typo"를 사용해야했을까요? :-) " Comp.1, 분산의 29 %를 차지합니다 "가 잘못되었으며 " Comp.1, 분산의 46 %를 차지합니다 "
Darren Cook

1
감사합니다, 대런 : 혼란이 책에 존재한다는 것을 오해했으며 R소프트웨어 자체 를 언급하기 위해 "버그"를 사용했습니다 . 그 오류를 발견하는 것은 좋은 발견이었습니다 (PCA에서 실제로 무슨 일이 일어나고 있는지 알아내는 것이 보람 있기를 바랍니다)!
whuber

5
그렇습니다. 이것은 의심 할 여지없이이 책의 버그입니다. 분산 대신 표준 편차를 잘못 사용한 곳이 몇 군데 있습니다. (예를 들어, RSE 제곱을 계산하기 위해 MSE 대신 RMSE를 사용하는 시점이 있습니다.) 가까운 시일 내에 이러한 종류의 버그를 수정하고 수정할 시간이 있기를 바랍니다.
John Myles White

답변:


11

summary.princomp"분산의 비율"및 "누적 비율"을 보는 데 사용 합니다.

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])
summary(pca)

1
여호수아 감사합니다. 따라서 첫 번째 성분은 실제로 분산의 46 %입니다. 책에 버그 보고서를 보내겠습니다.
대런 쿡

"분산의 비율"은 어떻게 계산됩니까? 표시된 숫자는 0.4600083입니다. 그러나 sqrt(pca$sdev[1]/sum(pca$sdev))(대략 sqrt(29.1/133.2)) 0.4673904를 제공합니다.
대런 쿡

3
@DarrenCook : 표준 편차 , 즉 분산의 제곱근 (또는sdev 보고 있음을 나타 냅니다.λipca$sdev[1]^2/sum(pca$sdev^2)

2
@DarrenCook : 소스 사용 ... stats:::print.summary.princompsdev성분의 제곱 임을 stats:::princomp.default표시 sqrt합니다. 이는 고유 값입니다.
Joshua Ulrich

11

100 %.

pXΣ

tr(Σ)=σ11+σ22++σpp.

λ1λ2λp.

tr(Σ)=λ1++λp
λiΣλp0

eiXeii1λi

Var(eiX)=eiΣei=λieiei=λi
k
(λ1++λkλ1++λp100) %
100 %k=p

1
질문에 @Max의 (최근) 주석이 보입니까? 그는 답을 얻었습니다.
whuber

@ whuber : 나는 그것을 보지 못 했으므로 감사합니다. 나는 여호수아의 대답에 대해 비슷한 말을했습니다.
MånsT

4

다음은 이전 답변을 보완하는 일부 R 코드 pca[["sdev"]]입니다 (일반적으로 작성 pca$sdev되지만 아래 스 니펫에서 형식이 잘못됨).

# Generate a dummy dataset.
set.seed(123)
x <- matrix(rnorm(400, sd=3), ncol=4)
# Note that princomp performs an unscaled PCA.
pca1 <- princomp(x)
# Show the fraction variance of each PC.
pca1[["sdev"]]^2
cumsum(pca1[["sdev"]]^2)/sum(pca1[["sdev"]]^2)
# Perform a scaled PCA.
pca2 <- princomp(x, cor=TRUE)
pca2[["sdev"]]^2
cumsum(pca2[["sdev"]]^2)/sum(pca2[["sdev"]]^2)

따라서 @Max가 지적했듯이 표준 편차 대신 분산으로 작업하고 총 분산으로 나누는 것을 잊지 않는 것이 문제를 해결합니다.

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