Самый быстрый способ вычислить k наибольших собственных значений и соответствующих собственных векторов с numpy

Я имею большую NxN плотную симметричную матрицу и хочу, чтобы собственные векторы соответствовали k наибольшим собственным значениям. Каков наилучший способ их поиска (желательно, используя numpy, но, возможно, вообще используя blas / atlas / lapack, если это единственный способ пойти)? В общем случае N намного больше k (скажем N> 5000, k <10).

Кажется, что у Numpy есть только функции для нахождения k больших собственных значений, если моя стартовая матрица разрежена.

2 Solutions collect form web for “Самый быстрый способ вычислить k наибольших собственных значений и соответствующих собственных векторов с numpy”

В SciPy вы можете использовать функцию linalg.eigh с параметром eigvals .

eigvals: tuple (lo, hi) Индексы наименьшего и наибольшего (в порядке возрастания) собственных значений и соответствующих собственных векторов, которые должны быть возвращены: 0 <= lo <hi <= M-1. Если опущено, все собственные значения и собственные векторы возвращаются.

Что в вашем случае должно быть установлено (Nk,N-1) .

На самом деле разреженные подпрограммы работают и для плотных массивов numpy, я думаю, что они используют какую-то итерацию подпространства Крылова, поэтому им нужно вычислить несколько матрично-векторных произведений, а это означает, что если ваш k << N, разреженные процедуры могут быть (незначительно? ) Быстрее.

Ознакомьтесь с документами http://docs.scipy.org/doc/scipy/reference/tutorial/arpack.html.

и следующий код (пойдите, чтобы взять хороший кофе с друзьями, пока это не закончится)

 import numpy as np from time import clock from scipy.linalg import eigh as largest_eigh from scipy.sparse.linalg.eigen.arpack import eigsh as largest_eigsh np.set_printoptions(suppress=True) np.random.seed(0) N=5000 k=10 X = np.random.random((N,N)) - 0.5 X = np.dot(X, XT) #create a symmetric matrix # Benchmark the dense routine start = clock() evals_large, evecs_large = largest_eigh(X, eigvals=(Nk,N-1)) elapsed = (clock() - start) print "eigh elapsed time: ", elapsed # Benchmark the sparse routine start = clock() evals_large_sparse, evecs_large_sparse = largest_eigsh(X, k, which='LM') elapsed = (clock() - start) print "eigsh elapsed time: ", elapsed 
  • Вычисление коэффициента корреляции между двумя многомерными массивами
  • scipy.optimize.leastsq со связанными ограничениями
  • SciPy и scikit-learn - ValueError: несоответствие размеров
  • scipy.sparse dot чрезвычайно медленный в Python
  • режущие массивы в numpy / scipy
  • коэффициенты интерполяции сплайна в scipy
  • Факториал в numpy и scipy
  • Подмножество матричного умножения, быстрого и разреженного
  • Python - лучший язык программирования в мире.