매우 큰 희소 행렬에 PCA 적용


16

R을 사용하여 텍스트 분류 작업을 수행하고 있으며 크기가 22490 x 120,000 (0이 아닌 4 백만 개, 1 % 미만) 인 문서 용어 행렬을 얻습니다. 이제 PCA (Principal Component Analysis)를 사용하여 차원을 줄이려고합니다. 불행히도 R은이 거대한 행렬을 처리 할 수 ​​없으므로이 희소 행렬을 "매트릭스 마켓 형식"의 파일에 저장하고 다른 기술을 사용하여 PCA를 수행하기를 희망합니다.

따라서 누구나 유용한 라이브러리 (프로그래밍 언어에 관계없이)에 대한 힌트를 줄 수 있습니다.이 대규모 행렬로 PCA를 쉽게 수행하거나 직접 PCA를 수행 할 수 있습니다. 즉, 처음에 공분산 행렬을 계산하고 공분산 행렬에 대한 고유 값과 고유 벡터를 계산합니다 .

내가 원하는 것은 모든 PC (120,000)계산하고 90 % 차이를 차지하는 상위 N 개의 PC 만 선택하는 것 입니다. 분명히,이 경우에는 매우 작은 분산 값을 0으로 설정하기 위해 임계 값에 우선 순위를 부여해야합니다 (공분산 행렬에서). 그렇지 않으면 공분산 행렬은 희소하지 않으며 크기는 120,000 x 120,000입니다. 하나의 기계로 처리 할 수 ​​없습니다. 또한, 로딩 (고유 벡터)은 매우 클 것이며 희소 형식으로 저장해야합니다.

어떤 도움을 주셔서 대단히 감사합니다!

참고 : 24GB RAM과 8 개의 CPU 코어가있는 컴퓨터를 사용하고 있습니다.


매트릭스는 얼마나 드문가? 결과 SVD를 어떻게 사용합니까? 당신이 그것의 일부만 필요한 경우 아마 훨씬 저렴할 수 있습니다.
Arnold Neumaier

@ArnoldNeumaier 실례합니다. 스파 스 정보를 추가하는 것을 잊었습니다. 내 아이디어와 함께 게시물을 업데이트했습니다.
Ensom Hodder

지금까지 답변에서 제안 된 각 SLEPc, mahout 및 irlba는 귀하의 문제에 적합한 것으로 보입니다.
Arnold Neumaier

1
120k를 모두 계산하려는 이유는 무엇 입니까? 분산의 90 %를 차지하는 값을 원 하듯이 계산하는 것이 훨씬 저렴합니다.
Jed Brown

@JedBrown Hey Jed, 당신 말이 맞아요! 나는 90 % 분산을 담당하는 사람들과 해당 고유 벡터 (나중에 테스트 데이터 세트를 변환하기 위해)에 관심이 있습니다. 더 저렴한 방법을 알려 주 시겠습니까?
Ensom Hodder

답변:


4

irlba 패키지를 제안합니다-svd와 거의 동일한 결과를 생성하지만 해결하기 위해 더 작은 수의 특이 값을 정의 할 수 있습니다. 희소 행렬을 사용하여 Netflix 상을 해결하는 예는 다음에서 찾을 수 있습니다. http://bigcomputing.blogspot.de/2011/05/bryan-lewiss-vignette-on-irlba-for-svd.html


귀하의 의견에 감사드립니다. 사실, 나는 그 비디오를 보았고 어제 irlba 패키지를 사용해 보았지만 몇 가지 특이 값 을 계산 하는 데만 사용할 수있는 것처럼 보였습니다 . 그러나 게시물에 명시된 바와 같이 모든 단수 값 (120,000) 을 계산 하여 분산에 따라 적절한 수의 PC를 선택하려고합니다. 이 경우 irlba 가 더 이상 적합하지 않은 것 같습니다.
Ensom Hodder

PCA와 비슷한 방식으로 SVD 결과를 사용할 수 있습니까? PCA를 수행하기 위해 SVD를 수행하기 전에 데이터를 집중시킬 필요가 없습니까?
Zach

@Zach - SVD는 PCA 뒤에 주요 알고리즘은 (- prcomp 참조입니다 stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html을 ). 귀하의 질문에 따라 다양한 옵션이 있지만 (예 : 다양한 유형의 스케일링이 적용될 수도 있음) PCA를 적용하기 전에 데이터의 중심을 맞추는 것도 표준 절차입니다.
Marc 상자에

SVD 이전에 데이터를 중앙에 배치하지 않으면 얼마나 큰 거래입니까? 메모리에 맞는 희소 행렬이 있지만 가운데에 맞추면 밀도가 너무 커서 메모리에 맞지 않습니다.
Zach

@Zach-샘플을 서로 연관시키는 방법에 달려 있습니다. 메모리 제한으로 인해 중앙 집중식 데이터로 작업 할 수없는 경우 결정이 완료된 것 같습니다. 일반적으로 센터링 데이터는 PCA가 샘플의 공분산 매트릭스에서 작동하고 데이터의 센터링 및 스케일링은 상관 행렬에서 PCA가 작동합니다. 이러한 결정에 대한 자세한 정보는 stats.stackexchange.com 에서 질문 하거나 PCA에 관한 기존 답변을 검색하십시오.
Marc in the box

8

SLEPc 를 사용하여 부분 SVD를 계산하는 것이 좋습니다 . 자세한 내용은 사용 설명서의 4 장 및 SVD 매뉴얼 페이지 를 참조하십시오.


1
PCA를 원하기 때문에 SVD를 계산하기 전에 데이터를 중앙에 배치해야합니다. 이것은 희소성을 망칠 것입니다. SLEPc이이를 수용 할 수있는 방법이 있습니까?
dranxo 2:24에

3
그것은 드문 드문 + 낮은 순위입니다. SLEPc는 행렬 엔트리가 필요하지 않으며, 선형 연산자 일뿐 아니라 희소 행렬과 보정으로 적용될 수 있습니다.
제드 브라운

2

다른 NLP / TA 작업에도 적합하고 맵 / 축소를 구현하는 mahout에 투표합니다 .


예, 당신 말이 맞아요. 그러나 저는 몇 가지 "간단한"(사전 가정) 기술을 사용하여 프로토 타입을 만드는 것을 선호합니다.
Ensom Hodder

1

증분 특이 값 분해를 사용하는 것이 좋습니다. 그중 많은 문헌이 있습니다. 예를 들어 :

  • Matthew Brand 12 의 기술 보고서 는 상당히 이해하기 쉽습니다.
  • Chris Baker의 석사 논문 , 소프트웨어 IncPACK 및 이후 증분 SVD 방법에 대한 논문
  • 번치와 닐슨은 가장 오래된 알려진 논문을 출판
  • 고유 값 문제 12 업데이트에 대한 Hall의 논문
  • Levy 등의 순차적 Karhunen-Loeve 분석 ( 기본적으로 동일한 것)

이러한 모든 접근 방식은 다음과 같이 축소됩니다.

  • 작은 데이터 세트로 시작
  • 어떻게 든 SVD를 계산하십시오 (이 단계는 단일 열 행렬의 경우 간단합니다)
  • 완료 될 때까지 반복하십시오.
    • 새로운 데이터 세트 추가
    • 기존 SVD 및 업데이트 규칙을 사용하여 새 데이터 세트의 SVD 계산

응용 프로그램에서 상위 값에 대한 특이 값 임계 값의 위치를 알 수있는 경우 해당 값을 사용하여 잘린 SVD를 계산할 수 있습니다. 임계 값이 충분히 작 으면 메모리에 유지해야하는 행렬도 작아집니다 (임계 값을 초과하는 특이 값 만 단일 벡터와 함께 유지되므로 왼쪽과 오른쪽을 모두 단수로 유지할 필요조차 없습니다) 브랜드 알고리즘에서 벡터).N


0

여전히 R을 사용할 수 있습니다.

Revolution RRAM보다 큰 데이터 세트를 처리하는 R의 빌드입니다. 기능을 사용하십시오 princomp.

또한 선형 회귀, 로지스틱 회귀, Quantile 등과 같이 RAM에 맞지 않는 빅 데이터 스타일 문제를 위해 특별히 설계된 모든 범위의 통계 기능을 가지고 있습니다.

"아카데미입니다"상자를 선택하여 모든 기능을 갖춘 Academic 버전을 무료로 다운로드 할 수 있습니다.

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