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

时间:2012-08-28 21:16:19

标签: python numpy scipy linear-algebra

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

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

2 个答案:

答案 0 :(得分:15)

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

  

eigvals:元组(lo,hi)最小和最大的索引(in   升序)特征值和相应的特征向量   返回:0&lt; = lo&lt;嗨&lt; = M-1。如果省略,则所有特征值和   返回特征向量。

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

答案 1 :(得分:4)

实际上稀疏例程也适用于密集的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