데이터의 SVD를 통해 PCA가 필요한 이유는 무엇입니까?


22

이 질문은 주요 구성 요소를 계산하는 효율적인 방법에 관한 것입니다.

  1. linear PCA의 많은 텍스트는 대소 문자 데이터 의 단일 값 분해를 사용하여 옹호 합니다 . 우리는 데이터가있는 경우 즉, 하고, 변수 (그 교체 할 열을 주요 구성 요소), 우리가 할 SVD : (제곱. 고유치의 뿌리), 특이 값의 주요 대각선을 점유은 , 오른쪽 고유 벡터 는 axes-components에 대한 axis-variables의 직교 회전 행렬이며, 왼쪽 고유 벡터 는 와 같습니다 . 그런 다음 컴포넌트 값을 로 계산할 수 있습니다 .XX=USVSVUVC=XV=US

  2. 변수의 PCA를 수행하는 다른 방법은 제곱 행렬 을 분해하는 것입니다 (즉, 변수 간의 상관 또는 공분산 등일 수 있음 ). 분해는 고유 분해 또는 특이 값 분해 일 수 있습니다. 정사각형 양의 반 정밀도 행렬을 사용하면 앞에서 설명한대로 의 대각선 과 의 대각선과 같은 고유 값을 갖는 동일한 결과 가 나타납니다 . 구성 요소 값은 입니다.R=XXR R=VLVLVC=XV

이제 내 질문 : data 가 큰 행렬이고 사례 수가 변수 수보다 훨씬 많으면 (1) 방법 (1) 방법 (2)보다 훨씬 느릴 것으로 예상됩니다 ), 방법 (1)은 SVD와 같은 상당히 비싼 알고리즘을 큰 행렬에 적용하기 때문에; 그것은 우리가 실제로 필요하지 않은 거대한 행렬 (변수의 PCA)를 계산하고 저장 합니다. 경우 그렇다면, 이렇게 많은 texbooks는 옹호에 보이거나 단지 유일한 방법은 (1)을 언급? 어쩌면 그것은 이다 효율적이고 내가 뭔가를 놓친거야?XU


2
일반적으로 우리는 대부분의 차이를 설명하는 몇 가지 주요 구성 요소에만 관심이 있습니다. 감소 된 SVD를 수행 할 수 있습니다. 예를 들어, 만약 치수 인 N × P 여기서 P < < N은 다음 의 기능은 제 계산한다 (P)는 왼쪽과 오른쪽 기본적 특이 벡터. XN×pp<<NRsvdp
M. Berk

1
그러나 @ M.Berk : 는 두 가지 접근 방식에서 동일합니다. 동일한 결과를냅니다 (서명 변경과 동일). 또한, 예를 들어 R 은 요청 된 경우에만 C를 계산 합니다. pC
cbeleites는 Monica를 지원합니다 Monica

길에 대한 언급이 있습니까 (1)? 공분산 행렬에서 SVD를 통해 PCA가 구현되는 것만 알고 있습니다 (즉, 방법 2). 이는 일부 수치 문제를 피하고 데이터 세트 크기가 아닌 차원에 따라 분명히 확장됩니다. 방법 (1) 나는 PCA가 아닌 SVD를 호출 할 것입니다. 순수한 SVD 컨텍스트에서만 보았습니다. 실제로는 완전한 분해를 수행하지 않습니다.
Anony-Mousse

@ Anony-Mousse, 한 가지 언급 할 것은 Joliffe, Principal component analysis, 2nd ed.실제로 Joliffe는 두 가지 방법을 모두 설명하지만 PCA의 핵심 장에서 내가 기억할 수있는 한 방법 1에 대해서만 말합니다.
ttnphns

@ Anony-Mousse, Way 1은 PCA가 간단한 대응 분석 과 직접 관련되는 방식을 명확하게 보여주기 때문에 이론적 인 관점에서 중요 합니다 .
ttnphns

답변:


7

여기 주제에 대한 2ct가 있습니다.

  • 처음 PCA가 솔루션 (2)을 사용한다는 것을 알게 된 화학 측정 강의는 수치 지향적이지 않았으며, 수치 강의는 단지 소개 일 뿐이며 제가 기억하는 한 SVD에 대해서는 논의하지 않았습니다.

  • 내가 이해한다면 홈즈 : 대규모 행렬에 대한 빠른 SVD 제대로을, 당신의 생각은 긴 행렬의 계산 빠른 SVD를 얻기 위해 사용되어왔다.
    그것은 적절한 행렬을 만나면 좋은 SVD 구현이 내부적으로 (2) 따라갈 수 있음을 의미합니다 (아직 더 나은 가능성이 있는지 모르겠습니다). 이는 높은 수준의 구현의 경우 SVD (1)를 사용하고 내부적으로 사용할 알고리즘을 처리하기 위해 SVD를 BLAS에 두는 것이 좋습니다.

  • 빠른 실제 검사 : OpenBLAS의 SVD는 5e4 × 100의 매트릭스에,이 구분을하지 않는 것, svd (X, nu = 0)동안, 평균 3.5의 취 svd (crossprod (X), nu = 0)(와 R에서 호출 54 밀리 초 소요 microbenchmark).
    물론 고유 값의 제곱은 빠르며 두 호출의 결과는 동일합니다.

    timing  <- microbenchmark (svd (X, nu = 0), svd (crossprod (X), nu = 0), times = 10)
    timing
    # Unit: milliseconds
    #                      expr        min         lq    median         uq        max neval
    #            svd(X, nu = 0) 3383.77710 3422.68455 3507.2597 3542.91083 3724.24130    10
    # svd(crossprod(X), nu = 0)   48.49297   50.16464   53.6881   56.28776   59.21218    10
    

업데이트 : Wu, W.를보십시오. Massart, D. & de Jong, S .: 넓은 데이터를위한 커널 PCA 알고리즘. 1 부 : 이론 및 알고리즘, 화학 및 지능 실험실 시스템, 36, 165-172 (1997). DOI : http://dx.doi.org/10.1016/S0169-7439(97)00010-5

이 논문은 SVD, 고유 분해 (EVD), NIPALS 및 POWER의 PCA에 대한 4 가지 알고리즘의 수치 및 계산 특성에 대해 설명합니다.

다음과 같이 관련됩니다.

computes on      extract all PCs at once       sequential extraction    
X                SVD                           NIPALS    
X'X              EVD                           POWER

논문의 맥락은 넓은 이며 X X ' (커널 PCA)에서 작동합니다-이것은 당신이 요구하는 것과 반대되는 상황입니다. 따라서 긴 행렬 동작에 대한 질문에 대답하려면 "커널"과 "클래식"의 의미를 교환해야합니다.X(30×500)XX

성능 비교

놀랍게도 EVD와 SVD는 클래식 알고리즘과 커널 알고리즘 중 어느 것을 사용하는지에 따라 위치가 변경됩니다. 이 질문의 맥락에서 이것은 매트릭스의 모양에 따라 하나 또는 다른 것이 더 나을 수 있음을 의미합니다.

그러나 "고전적인"SVD 및 EVD에 대한 논의에서 의 분해가 PCA를 계산하는 매우 일반적인 방법 이라는 것이 분명합니다 . 그러나 Matlab의 기능 을 사용하는 것 이외의 SVD 알고리즘을 지정하지는 않습니다 .XXsvd ()


    > sessionInfo ()
    R version 3.0.2 (2013-09-25)
    Platform: x86_64-pc-linux-gnu (64-bit)

    locale:
     [1] LC_CTYPE=de_DE.UTF-8       LC_NUMERIC=C               LC_TIME=de_DE.UTF-8        LC_COLLATE=de_DE.UTF-8     LC_MONETARY=de_DE.UTF-8   
     [6] LC_MESSAGES=de_DE.UTF-8    LC_PAPER=de_DE.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
    [11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C       

    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     

    other attached packages:
    [1] microbenchmark_1.3-0

loaded via a namespace (and not attached):
[1] tools_3.0.2

$ dpkg --list libopenblas*
[...]
ii  libopenblas-base              0.1alpha2.2-3                 Optimized BLAS (linear algebra) library based on GotoBLAS2
ii  libopenblas-dev               0.1alpha2.2-3                 Optimized BLAS (linear algebra) library based on GotoBLAS2

따라서 테스트 (3.5 초 대 54 msec)는 "way 1"이 상당히 느리다는 내 선을 지원합니다. 권리?
ttnphns

1
@ttnphns : 그렇습니다. 그러나 svd는 BLAS에 의해 제공되므로 다른 BLAS와 다를 수 있습니다. 잘 최적화 된 BLAS는 이와 같은 작업을 수행 할 것으로 예상했습니다. 그러나 OpenBLAS의 경우는 그렇지 않습니다. 다른 BLAS를 확인하기에는 너무 게으르지 만 몇 명의 사람들이 다른 BLAS를 확인하여이 경우에 최적화 된 것과 그렇지 않은 것을 찾을 수 있습니다. (저는 OpenBLAS 개발자에게 이메일을 보냈고이 질문에 대한 링크를 보냈으므로 svd (X'X)긴 행렬 의 경우 알고리즘을 전환하지 않는 이유와 같은 정보를 추가 할 수 있습니다 .)
cbeleites는 Monica

XXn<pXXun+1=XXun/||XXun||v1XXXX×(Xun)

XXT

Nipals와 관련된 귀하의 업데이트에 대해 이야기했습니다. Nipals가 Lapack의 SVD에 관여하지 않았 음을 확인합니다. 벤치 마크 실험에 microbenchmark(X <- matrix(rnorm(5e6), ncol=100), Y <- t(X), svd(X), svd(Y), control=list(order="inorder"), times = 5)대해서는 흥미로운 내용도 있습니다.
Elvis

18

SVD는 느리지 만 수치 정확도가 높기 때문에 선호되는 방법으로 간주되는 경우가 많습니다.

X1n1XXXXnp

MATLAB의 pca()함수 도움말에 작성된 내용은 다음과 같습니다 .

주요 구성 pca요소 분석을 수행 하는 데 사용되는 주요 구성 요소 알고리즘 [...] :

'svd'-기본값입니다. X의 특이 값 분해 (SVD)

np

마지막 문장은 여기서 중요한 속도 정확도 트레이드 오프를 강조합니다.

1000×100

X = randn([1000 100]);

tic; svd(X); toc         %// Elapsed time is 0.004075 seconds.
tic; svd(X'); toc        %// Elapsed time is 0.011194 seconds.
tic; eig(X'*X); toc      %// Elapsed time is 0.001620 seconds.
tic; eig(X*X'); toc;     %// Elapsed time is 0.126723 seconds.

npXX

XXXX

X=(111ϵ000ϵ000ϵ),
3+ϵ2ϵ2ϵ2ϵ=105
eps = 1e-5;
X = [1 1 1; eye(3)*eps];
display(['Squared sing. values of X: ' num2str(sort(svd(X),'descend').^2')])
display(['Eigenvalues of X''*X:       ' num2str(sort(eig(X'*X),'descend')')])

동일한 결과 얻기 :

Squared sing. values of X: 3       1e-10       1e-10
Eigenvalues of X'*X:       3       1e-10       1e-10

ϵ=1010

Squared sing. values of X: 3       1e-20       1e-20
Eigenvalues of X'*X:       3           0 -3.3307e-16

XX

필자는이 잠재적 인 [작은] 정밀도 손실을 무시하고보다 빠른 방법을 사용하는 것이 종종 기쁘다는 것을 덧붙여 야합니다.


1
XTX

답변과 장단점을 충분히 고려해 주셔서 감사합니다.
ttnphns

아메바, eig()접근에 의해 수치 적 안정성이 떨어지는 구체적인 예를 보여줄 시간이 있을까요? (독서가 도움을 줄 것입니다 : 속도와 안정성 사이에 절충점이 있습니다. 구체적인 실제 상황에서 어떻게 결정할 수 있습니까?)
ttnphns

@ttnphns 나는 구체적인 예를 제공하면서 전체 답변을 다시 작성했습니다. 보세요.
아메바는 모니카 주립대 모니카

1
@amoeba, 다시와 주셔서 감사합니다! 나는 SPSS에서 엡실론 예제를 모두 시도하고 마지막 줄을 제외하고는 당신의 것과 같은 결과를 얻었습니다 : 3 0 -3.3307e-16spss 의 eigen 대신 나를 반환했습니다 3 0 0. 함수에 내장 및 고정 된 공차 값이있는 것 같습니다. 이 예에서 함수는 작은 고유 값 인 "0"과 "-16"을 모두 0으로 만들어 수치 불안정성 매듭을 해킹하는 것처럼 보입니다.
ttnphns
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.