거대한 희소 행렬의 SVD를 계산하는 방법은 무엇입니까?


26

데이터가 매우 희소 한 매우 큰 양의 행렬 (65M x 3.4M)의 단일 값 분해 (SVD)를 계산하는 가장 좋은 방법은 무엇입니까?

행렬의 0.1 % 미만이 0이 아닙니다. 나는 그 방법이 필요하다 :

  • 메모리에 들어갈 것입니다 (온라인 방법이 있다는 것을 알고 있습니다)
  • 적당한 시간에 계산됩니다 : 3,4 일
  • 정확도는 충분하지만 정확성은 저의 주요 관심사가 아니므로 얼마나 많은 리소스를 넣었는지 제어하고 싶습니다.

그것을 구현하는 Haskell, Python, C # 등의 라이브러리가 있으면 좋을 것입니다. mathlab 또는 R을 사용하지 않지만 필요한 경우 R을 사용할 수 있습니다.


3
당신은 얼마나 많은 메모리를 가지고 있습니까? 65M * 3.4M의 0.1 %는 여전히 0이 아닌 221e9입니다. 값당 4 바이트를 사용하는 경우 오버 헤드가 없다고 가정해도 여전히 55GB를 초과하므로 희소성이 여전히 문제를 해결하지 못합니다. 전체 세트를 메모리에 한 번에로드해야합니까?
Bitwise

나는 더 정확해야했다. 32 비트 정수로 250-500mb를 넘지 않아야합니다. 아마도 훨씬 적지 만, 치수 이해는 내가 이해하는 문제입니다. 16GB 컴퓨터가 있습니다.
Sonia

이건 어때요? quora.com/…
비트 별

이 웹 페이지는 "빠르고, 증분하며, 메모리가 적은 대용량 매트릭스 SVD 알고리즘"을 구현하는 Python 라이브러리에 연결되어 있습니다. en.wikipedia.org/wiki/Latent_semantic_analysis
Bitwise

답변:


21

메모리에 적합하면 Matrix 패키지를 사용하여 R에 희소 행렬을 구성 하고 SVD에 대해 irlba 를 시도 하십시오. 결과에 원하는 특이 벡터 수를 지정할 수 있으며 이는 계산을 제한하는 또 다른 방법입니다.

그것은 꽤 큰 행렬이지만 과거에는이 방법으로 매우 좋은 결과를 얻었습니다. irlba꽤 최신 기술입니다. 그것은 사용 암시 적으로 다시 시작에는 Lanczos 양방향 대각 알고리즘을 .

넷플릭스 상금 데이터 세트 (480,189 행 x 17,770 열, 100,480,507, 0이 아닌 항목)를 밀리 초 단위로 씹을 수 있습니다. 데이터 세트가 Netflix 데이터 세트보다 ~ 200,000 배 더 크기 때문에 그보다 훨씬 오래 걸립니다. 며칠 안에 계산을 수행 할 수 있다고 예상하는 것이 합리적 일 수 있습니다.


데이터 매트릭스가 메모리에 맞으면 irlba가 메모리 효율적인 방법으로 분해를 처리 할 것인가?
Sonia

@Sonia : irlba는 메모리 효율성이 뛰어납니다. 대략적인 솔루션을 계산하고 특이 벡터의 수를 제한 할 수 있으며 희소 행렬에서 작동하도록 설계되었습니다. 내가 아는 한 부분 SVD를 계산하는 것만 큼 빠릅니다.
Zach

@ 소니아 : 행운을 빕니다!
Zach

그것을 시도해보십시오-메모리 부족 ... 실행하기 전에 삼각형 블록 형태를 계산합니다.
Sonia

@Sonia 스파 스로 저장되어 Matrix있습니까? 계산하는 특이 값의 수를 제한하십시오. 아마도 상위 10 개만 보시겠습니까?
Zach

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