PCA의 Scikit-learn 구현과 TruncatedSVD의 차이점


12

대수 / 정확한 수준에서 주성분 분석과 특이 값 분해 간의 관계를 이해합니다. 내 질문은 scikit-learn 구현 에 관한 입니다.

" [TruncatedSVD]는 PCA와 매우 유사하지만 공분산 행렬 대신 샘플 벡터에서 직접 작동합니다. "는 두 방법의 대수적 차이를 반영합니다. " 추정자 [TruncatedSVD]는 두 개의 알고리즘을 지원합니다. 빠른 무작위 SVD 솔버와 ARPACK을 (X * XT) 또는 (XT * X)에서 고유 한 해석기로 사용하는"순진한 "알고리즘 중 더 큰 알고리즘 효율적인. ". PCA에 대하여"데이터를 투영하기 위해 데이터의 특이 값 분해를 사용한 선형 차원 축소 ..."라고 말합니다. 그리고 PCA 구현은 동일한 두 알고리즘 (랜덤 화 및 ARPACK) 솔버와 다른 하나 인 LAPACK을 지원합니다. 코드를 살펴보면 PCA와 TruncatedSVD의 ARPACK과 LAPACK 모두 샘플 데이터 X에서 svd를 수행하고 ARPACK은 희소 행렬을 처리 할 수 ​​있습니다 (svds 사용).

따라서 다른 속성과 방법을 제외하고 PCA는 LAPACK, PCA 및 TruncatedSVD scikit-learn 구현을 사용하여 정확한 전체 특이 값 분해를 추가로 수행 할 수 있다는 점에서 정확히 동일한 알고리즘 인 것 같습니다. 첫 번째 질문 : 이것이 맞습니까?

두번째 질문 : LAPACK 및 ARPACK 사용 scipy.linalg.svd (X)과 scipy.linalg.svds (X) 인 X 샘플 행렬들은 특이 값 분해 또는 고유 분해를 계산하더라도 또는 X를 내부 X T "무작위"솔버는 제품을 계산할 필요가 없습니다. (이는 수치 안정성과 관련이 있습니다. 데이터의 SVD를 통해 데이터의 PCA가 필요한 이유는 무엇입니까? 참조 ). 이 올바른지?XTXXXT

관련 코드 : PCA 라인 415. 잘린 SVD 라인 137.


1
코드에 대한 링크를 추가 할 수 있습니까
seanv507

1
드레이크-첫 번째 질문에 동의합니다. 두 번째 질문을 이해하지 못합니다. '내부 XT * XXT * X 또는 X * XTX * XT의 특이 값 분해 또는 고유 분해를 계산합니다'라는 의미는 무엇입니까? -수치 문제는 먼저 공분산 행렬 계산 (C라고 함)을
참조한

XTXXXT

1
XXtimes()Xt_times()

@ GeoMatt22 댓글에 대해 자세히 설명해 주시겠습니까? ARPACK 또는 LAPACK 접근법은 공분산 행렬을 계산할 필요가 없기 때문에 수치 적 불안정성을 겪지 않습니까?
드레이크

답변:


13

PCA와 TruncatedSVD scikit-learn 구현은 정확히 동일한 알고리즘 인 것 같습니다.

아니오 : PCA는 중심 데이터에서 (절단 된) SVD 입니다 (피처 별 평균 빼기 기준). 데이터가 이미 중심에있는 경우이 두 클래스는 동일하게 수행됩니다.

실제로 TruncatedSVD메모리 사용량을 늘리지 않고는 중앙에 배치 할 수없는 큰 희소 데이터 세트에 유용합니다.

  • numpy.linalg.svd그리고 scipy.linalg.svd둘 다 여기에 설명 된 LAPACK _GESDD에 의존합니다 : http://www.netlib.org/lapack/lug/node32.html (드라이버 나누기 및 정복)

  • scipy.sparse.linalg.svdsXT의 고유 값 분해를 수행하기 위해 ARPACK에 의존합니다. X 또는 X Arnoldi 반복 방법을 통한 XT (데이터의 모양에 따라 다름) ARPACK의 HTML 사용자 안내서에는 계산 세부 사항을 숨기는 형식이 깨져 있지만 Arnoldi 반복은 wikipedia에 잘 설명되어 있습니다. https://en.wikipedia.org/wiki/Arnoldi_iteration

다음은 scipy의 ARPACK 기반 SVD 코드입니다.

https://github.com/scipy/scipy/blob/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L1642 (소스 코드에서 라인이 변경 될 경우 "def svds"에 대한 문자열 검색 ).


2
하나는 스파 스 데이터를 효율적으로 지원할 수 있고 (TruncatedSVD), 다른 하나는 PCA를 지원할 수 없습니다. 이것이 2 개의 수업이있는 이유입니다.
ogrisel

1
그 이유라면 혼란을 피하기 위해 SVD 및 SparseSVD (또는 유사)라고 부릅니다.
drake

2
그러나 사람들은 PCA를 원하며 PCA가 중심 데이터의 SVD 일 뿐이라는 것을 모를 수도 있습니다.
ogrisel

5
@drake 저는 "절차가 다릅니다 (PCA는 공분산 행렬을 사용하고 SVD는 데이터 행렬을 사용합니다"). PCA는 분석 유형의 이름입니다. 다른 알고리즘과 구현을 사용하여 수행 할 수 있습니다. 코브 매트릭스의 EIG는 하나의 방법이고, 중심화 된 데이터 매트릭스의 SVD는 다른 방법이며, EIG 및 SVD는 다양한 방법으로도 수행 될 수있다. 중요하지 않습니다. 모든 것이 PCA입니다.
amoeba는 Reinstate Monica

1
@amoeba 용어에 대한 설명 / 수정에 감사드립니다. 당신은 차종에게 SVD와 EIG는 대수 정리 / PCA보다 더 넓은 범위와 방법 있음을 나에게 더 의미가 주어진 말
드레이크
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.