부분 Singular Value Decompositions (SVD)의 메모리 효율적인 구현


10

모형 축소를 위해 행렬 의 20 개 가장 큰 특이 값과 연관된 왼쪽 특이 벡터를 계산하려고합니다 . 여기서 N 10 6k 10 3 입니다. 불행히도 내 행렬 A 는 아무런 구조없이 밀도가 높습니다.아르 자형,케이106케이10

이 크기의 임의 행렬에 대해 파이썬 svdnumpy.linalg모듈에서 루틴을 호출하면 메모리 오류가 발생합니다. 이는 할당에 의한 분해 용 = V S U .V아르 자형,=V에스

이 함정을 피하는 알고리즘이 있습니까? 예를 들어 0이 아닌 특이 값으로 연결된 특이 벡터 만 설정하여.

나는 계산 시간과 정확성을 거래 할 준비가되었습니다.


1
흥미롭게도, Numpy는 얇은 SVD 를 수행하는 방법을 모르는 것 같습니다 .
JM

힌트 주셔서 감사합니다. 실제로 numpy.linalg.svd에는 full_matrices'0이 아닌'부분 만 계산되도록 False로 설정 하는 옵션 이 있습니다. 그럼에도 불구하고 계산을 더 줄일 수있는 방법이 있습니까?
Jan

3
numpy백엔드 포트란 코드의 사용 LAPACKE_dgesvd표준 SVD에 대한 루틴을. 그러나 일반적으로 행렬은 C_CONTIGOUS(으로 확인 matrix.flags)입니다. 따라서 포트란 정렬을 위해 데이터를 복사합니다. 또한 lapack 루틴 dgesvd를 실행하는 동안 매트릭스의 다른 사본 (또는 최소한 메모리)이 필요합니다. 메모리 정렬이 처음부터 포트란 스타일인지 확인하면 하나의 사본을 제거 할 수 있습니다.
Bord

답변:


6

단수의 값 / 벡터 만 원하는 경우 ARPACK 이 트릭을 수행해야합니다. SVD의 문서가 잘되지이며, 이 분포는 최신 상태로 더 많은 것이다.

편집 : 파이썬 에서이 작업을 수행하려면 SciPy에 래퍼가 있습니다. 행렬이 밀도가 높으므로 BSR ( block sparse row ) 형식을 시도 할 수 있습니다.


ARPACK이 파이썬과 어떻게 통합되는지 살펴 보겠습니다.
Jan

1
scipy에 래퍼가있는 것 같습니다. 본문에 답글을 추가하겠습니다.
Max Hutchinson



2

인텔 MKL은 새로운 Jacobi-SVD 알고리즘을 구현합니다. 구현 세부 사항은 다음과 같습니다. http://www.netlib.org/lapack/lawnspdf/lawn169.pdf http://www.fernuni-hagen.de/MATHPHYS/veselic/downloads/j02.pdf

LAPACK 루틴 : http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-732F9EE1-BCEC-4D9B-9B93-AF5499B21140.htm#DRMAC08-1

작업 크기는 물론 조정 가능합니다. Cython, SWIG 또는 기타 래핑 메커니즘을 사용하여 Python에서 C 함수를 쉽게 호출 할 수 있습니다.

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