Python numpy计算第一个特征值和特征向量

9

我在想是否有一个Python包,无论是numpy还是其他,有一个计算小矩阵(比如2x2)的第一个特征值和特征向量的函数。我可以使用numpy中的linalg包来实现以下操作。

import numpy as np

def whatever():
    A = np.asmatrix(np.rand(2, 2))
    evals, evecs = np.linalg.eig(A)
    #Assume that the eigenvalues are ordered from large to small and that the
    #eigenvectors are ordered accordingly.
    return evals[0], evecs[:, 0]

但是这需要很长时间。我怀疑这是因为numpy通过某种迭代过程计算特征向量。所以我想知道是否有一种更快的算法只返回第一个(最大的)特征值和特征向量,因为我只需要第一个。
当然,对于2x2矩阵,我可以自己编写一个函数,分析计算特征值和特征向量,但是在浮点运算时会出现问题,例如当我将一个非常大的数字除以一个非常小的数字时,我会得到无穷大或NaN。有谁知道这方面的知识吗?请帮帮我!提前感谢你的帮助!

嗯,你所说的“长时间”是什么意思? %timeit np.linalg.eig(np.random.rand(2,2)) 的结果是 10000 loops, best of 3: 208 us per loop。我必须说这已经相当快了。 - Avaris
1
对于2x2矩阵,numpy由于开销较大而变慢,只需使用:http://www.math.harvard.edu/archive/21b_fall_04/exhibits/2dmatrices/index.html - tillsten
@Avaris,在你的计时测试中不要包含对随机数生成器的调用! - Ahmed Fasih
3个回答

7

选择/点赞仅包含链接的答案在长期内并没有帮助(显然在短期内也没有,因为eigs函数似乎不是一个有效的解决方案)。该网站鼓励真正的答案,比如这个 - mins

2

Greg Willden 评论:在这里应该使用evecs.T,将转置添加到zip语句中的evecs。zip函数将特征值与evecs的行相关联,但应该与evecs的列相关联。 - Rup

1

似乎没有numpy等价于Matlab的eigs(A,B,k)用于查找前k个特征向量。

如果您感兴趣,Enthought编制了一张表格,显示了Matlab和numpy之间的差异。这对回答这类问题应该有所帮助:链接

另一个想法是,对于2x2矩阵,我认为eigs(A,B,1)也不会有帮助。计算第一个特征对需要的工作量使得矩阵转换到第二个特征对直接出现的位置。只有3x3及以上才有好处。


1
在scipy.sparse.linalg.eigen.arpack中有一个eigs(根据scipy版本可能会有不同的名称),但与使用numpy.linalg.eig处理3x3矩阵相比,它要慢得多,这并不奇怪。当你有巨大的稀疏矩阵时,它是非常好用的。 - Justin Peel
我明白了,谢谢Hettinger先生。我想我只能使用某种任意精度浮点包编写自己的分析算法,以便避免那些烦人的NaN错误。 - Ray
Matlab的eigs使用ARPACK,这正是scipy.sparse.linalg.eigs所使用的,甚至包括指定最大/最小、实数/虚数等参数。 (不要被“sparse”所迷惑,它也适用于密集矩阵。)此外,即使对于10x10的reigs(r, 1)eig(r)慢:算法只是更慢。 - Ahmed Fasih

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接