2015-10-31 32 views
2

我想獲得稀疏對稱矩陣的特徵向量,在給定時間內負擔得起的最佳精度。
目前我使用了與scipy.sparse.eigsh如下:python scipy eigs:無論收斂容差最大迭代次數後返回eigenvector

evals, evecs = eigsh(MyMatrix, 2,which='LM' ,tol=1.e-15, maxiter=1000000) 

如果它不maxiter迭代收斂到tol精度,它提出了一個ArpackNoConvergence錯誤,包含收斂的特徵向量/值,但不是說做的那些不。然而,我更喜歡使用精度爲1.e-14的矢量而不是1.e-15而不是矢量。有沒有辦法強制返回尚未收斂的特徵向量(可能與另一個庫)?
像在M​​atlab中一樣,eigs函數無論如何都會返回特徵向量,如果沒有達到所需的精度,只需要一個額外的警告。

謝謝!

回答

0

ArpackNoConvergence例外具有包含部分結果.eigenvalues.eigenvectors屬性:

import numpy as np 
from scipy.sparse.linalg import eigsh, ArpackNoConvergence 

M = np.random.RandomState(0).randn(100, 100) 

try: 
    w, v = eigsh(M, 5, maxiter=20) 
except ArpackNoConvergence as e: 
    print(e) 
    w = e.eigenvalues 
    v = e.eigenvectors 
    print(w.shape, v.shape) 

打印:

ARPACK error -1: No convergence (21 iterations, 2/5 eigenvectors converged) 
((2,), (100, 2)) 
+0

謝謝!但我想要的是訪問正在計算並且沒有完全收斂的eingenvalue/vector。例外只包含那些已經收斂到所需精度的例外。我想在給定次數的迭代中獲得最佳精度。 –

+1

我認爲一個快速的解決方法是迭代地減小容差,直到'eigs'不再在指定的迭代次數內收斂。除此之外,我認爲應該可以通過手動構建['scipy.sparse.linalg.arpack._SymmetricArpackParams'](https://github.com/scipy/scipy/blob)來獲得部分收斂的特徵值/矢量/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L370-L585)對象,在其上調用'.iterate()',然後在迭代失敗時使用'.extract()'恢復特徵值/向量。 –

+0

我會盡量在有空的時候更新我的答案。 –