매우 큰 희소 행렬에 PCA 적용 라이브러리 (프로그래밍

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 코어가있는 컴퓨터를 사용하고 있습니다.



답변

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


답변

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


답변

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


답변

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

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

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

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

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

N

답변

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

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

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

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