Самый быстрый способ вычислить 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 
  • Эффективно получить индексы гистограмм в Python
  • Scikit-learn train_test_split с индексами
  • Использование диапазона при фантазии индексирования?
  • Фиксирование (гауссово) со Scipy против ROOT и др.
  • Как применить кусочно-линейную посадку в Python?
  • Scipy.optimize.root не сходится в Python, а Matlab fsolve работает, почему?
  • ImportError: невозможно импортировать имя NUMPY_MKL
  • Имеет ли смысл использовать как countvectorizer, так и tfidfvectorizer в качестве векторов объектов для кластеризации текста с помощью KMeans?
  • Python - лучший язык программирования в мире.