모형 축소를 위해 행렬 의 20 개 가장 큰 특이 값과 연관된 왼쪽 특이 벡터를 계산하려고합니다 . 여기서 N ≈ 10 6 및 k ≈ 10 3 입니다. 불행히도 내 행렬 A 는 아무런 구조없이 밀도가 높습니다.
이 크기의 임의 행렬에 대해 파이썬 svd
의 numpy.linalg
모듈에서 루틴을 호출하면 메모리 오류가 발생합니다. 이는 할당에 의한 분해 용 = V S U .
이 함정을 피하는 알고리즘이 있습니까? 예를 들어 0이 아닌 특이 값으로 연결된 특이 벡터 만 설정하여.
나는 계산 시간과 정확성을 거래 할 준비가되었습니다.
full_matrices
'0이 아닌'부분 만 계산되도록 False로 설정 하는 옵션 이 있습니다. 그럼에도 불구하고 계산을 더 줄일 수있는 방법이 있습니까?
numpy
백엔드 포트란 코드의 사용 LAPACKE_dgesvd
표준 SVD에 대한 루틴을. 그러나 일반적으로 행렬은 C_CONTIGOUS
(으로 확인 matrix.flags
)입니다. 따라서 포트란 정렬을 위해 데이터를 복사합니다. 또한 lapack 루틴 dgesvd를 실행하는 동안 매트릭스의 다른 사본 (또는 최소한 메모리)이 필요합니다. 메모리 정렬이 처음부터 포트란 스타일인지 확인하면 하나의 사본을 제거 할 수 있습니다.