用numpy计算k个最大特征值和相应特征向量的最快方法



我有一个大的NxN稠密对称矩阵,并且想要对应于k个最大特征值的特征向量。找到它们的最佳方法是什么(最好使用numpy,但如果这是唯一的方法,那么通常可能使用blas/atlas/lapack)?一般来说,N比k大得多(比如N>5000,k<10)。

如果我的起始矩阵是稀疏的,Numpy似乎只有找到k个最大特征值的函数。

在SciPy中,您可以使用带有eigvals参数的linalg.eigh函数。

eivals:tuple(lo,hi)最小和最大(in升序)特征值和相应的特征向量返回:0<=lo<嗨<=M-1.如果省略,则所有特征值和返回特征向量。

在您的情况下,应将其设置为(N-k,N-1)

实际上稀疏例程也适用于密集numpy数组,我认为它们使用了一些一种Krylov子空间迭代,因此他们需要计算几个矩阵向量产品,这意味着如果您的k<lt;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, X.T) #create a symmetric matrix
# Benchmark the dense routine
start = clock()
evals_large, evecs_large = largest_eigh(X, eigvals=(N-k,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

相关内容

  • 没有找到相关文章