값의 0.1 % 미만이 0이 아닌 큰 대칭 사각형 희소 행렬 (최대 30000x30000)의 가장 작은 고유 값에 해당하는 소수 (5-500) 고유 벡터를 계산하려고합니다.
나는 현재 scipy.sparse.linalg.eigsh를 shift-invert 모드 (sigma = 0.0)로 사용하고 있는데, 주제에 대한 다양한 게시물을 통해 알아 낸 해결책입니다. 그러나 대부분의 경우 문제를 해결하는 데 최대 1 시간이 걸립니다. 반면에 문서에서 예상 한 최대 고유 값 (시스템의 서브 초)을 요청하면 함수가 매우 빠릅니다.
직장에서 Matlab에 대해 더 잘 알고 있기 때문에 Octave에서 문제를 해결하려고 시도했는데 몇 초 만에 eigs (sigma = 0)를 사용하여 동일한 결과를 얻었습니다 (10 초 미만). 고유 벡터 계산을 포함하여 알고리즘의 매개 변수 스윕을 수행하고 싶기 때문에 이러한 종류의 시간 이득은 파이썬에서도 유용합니다.
먼저 매개 변수 (특히 공차)를 변경했지만 시간 척도에서는 그다지 바뀌지 않았습니다.
Windows에서 Anaconda를 사용하고 있지만 scipy가 사용하는 LAPACK / BLAS를 (매우 큰 Anaconda) mkl (기본 Anaconda)에서 OpenBlas (문서에 따라 Octave에서 사용)로 전환하려고했지만 변경 사항을 볼 수 없었습니다. 공연.
중고 ARPACK에 대해 변경할 것이 있었는지 여부와 그 방법을 알 수 없었습니까?
아래 코드에 대한 테스트 케이스를 다음 dropbox-folder에 업로드했습니다 : https://www.dropbox.com/sh/l6aa6izufzyzqr3/AABqij95hZOvRpnnjRaETQmka?dl=0
파이썬에서
import numpy as np
from scipy.sparse import csr_matrix, csc_matrix, linalg, load_npz
M = load_npz('M.npz')
evals, evecs = linalg.eigsh(M,k=6,sigma=0.0)
옥타브에서 :
M=dlmread('M.txt');
M=spconvert(M);
[evecs,evals] = eigs(M,6,0);
도움이 필요합니다!
의견과 제안에 따라 시도한 추가 옵션은 다음과 같습니다.
옥타브 :
eigs(M,6,0)
그리고 eigs(M,6,'sm')
나에게 동일한 결과를 제공합니다 :
[1.8725e-05 1.0189e-05 7.5622e-06 7.5420e-07 -1.2239e-18 -2.5674e-16]
에 eigs(M,6,'sa',struct('tol',2))
수렴하는 동안
[1.0423 2.7604 6.1548 11.1310 18.0207 25.3933]
공차 값이 2를 초과하는 경우에만 훨씬 빠르지 만, 그렇지 않으면 전혀 수렴하지 않고 값이 크게 다릅니다.
파이썬 :
eigsh(M,k=6,which='SA')
그리고 eigsh(M,k=6,which='SM')
모두하지 수렴 (NO 융합에 ARPACK 오류에 도달). eigsh(M,k=6,sigma=0.0)
가장 작은 값의 옥타브와 다른 고유 값 (약 1 시간 후) 만 제공합니다 (1 개의 추가 작은 값이 발견 된 경우에도).
[3.82923317e-17 3.32269886e-16 2.78039665e-10 7.54202273e-07 7.56251500e-06 1.01893934e-05]
공차가 충분히 높으면에서 결과를 얻 eigsh(M,k=6,which='SA',tol='1')
습니다.
[4.28732218e-14 7.54194948e-07 7.56220703e-06 1.01889544e-05, 1.87247350e-05 2.02652719e-05]
다른 수의 작은 고유 값으로 다시. 계산 시간은 여전히 거의 30 분입니다. 서로 다른 매우 작은 값은 이해할 수 있지만 0의 배수를 나타낼 수 있기 때문에 다른 다중성이 나를 방해합니다.
또한 SciPy와 Octave에는 근본적인 차이점이 있지만 아직 알 수 없습니다.