2015-10-31 6 views
2

Я хотел бы получить собственные векторы разреженной симметричной матрицы с лучшей точностью, доступной в данный момент времени.
В настоящее время я использую следующие с scipy.sparse.eigsh:python scipy eigs: вернуть собственный вектор после максимального количества итераций независимо от допуска сходимости

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

Если не сходится к tol точности по maxiter итераций, он поднимает ArpackNoConvergence ошибку, которая содержит собственные векторы/значения, которые сходились, но не те, которые сделали не. Тем не менее, я предпочитаю иметь вектор с точностью 1.e-14 вместо 1.e-15, а не без вектора вообще. Есть ли способ заставить возвращать собственные векторы, которые еще не сходились (возможно, с другой библиотекой)?
Как и в Matlab, где функция 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

Я попытаюсь обновить свой ответ, когда у меня будет время. –

 Смежные вопросы

  • Нет связанных вопросов^_^