거대한 희소 행렬의 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.