Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy计算第一特征值和特征向量_Python_Numpy_Eigenvalue - Fatal编程技术网

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

Python numpy计算第一特征值和特征向量,python,numpy,eigenvalue,Python,Numpy,Eigenvalue,我想知道是否有一个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

我想知道是否有一个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。有人知道这件事吗?请帮忙!提前谢谢你

在寻找k个最大特征向量方面,似乎没有Matlab的EIG(a,B,k)的numpy等价物

如果您感兴趣,Enthound已经编译了一个表格,显示了Matlab和numpy之间的差异。这将有助于回答以下问题:

另一个想法是,对于2x2矩阵,我不认为
eigs(A,B,1)
会有任何帮助。计算第一个特征对所需的工作,将矩阵变换到第二个特征对直接出现的位置。只有3x3及更大的容量才有好处

根据文件:

根据我自己的经验,numpy.linalg.eig(A)并没有按照任何特定的顺序对特征向量进行排序,这是OP和后续的假设。我建议如下:

rearrangedEvalsVecs = sorted(zip(evals,evecs.T),\
                                    key=lambda x: x[0].real, reverse=True)
使用以下命令:


嗯,你说的“长时间”是什么意思
%timeit np.linalg.eig(np.random.rand(2,2))
给出
10000个循环,每个循环最好3:208 us
。我必须说,这相当快。因为2x2矩阵numpy由于开销而很慢,只需使用:@Avaris,不要在计时测试中调用随机数生成器!scipy.sparse.linalg.eigen.arpack中有一个eig(根据scipy的版本可能有不同的名称),但它比在3x3矩阵中使用numpy.linalg.eig慢得多,这并不奇怪。当你有巨大的稀疏矩阵的时候,这很好。我明白了,谢谢你,海廷格先生。我想我只需要使用某种任意精度的浮点包来编写我自己的分析算法,这样我就不会出现那些恼人的NaN错误。Matlab的
eigs
使用ARPACK,这正是
scipy.sparse.linalg.eigs
使用的,甚至是指定最大/最小、实/虚等参数。(不要让“稀疏”欺骗你,它也适用于密集矩阵。)此外,
eig(r,1)
eig(r)慢
即使对于10x10
r
:算法也比较慢。这里应该是
evecs.T
,在zip语句中为evecs添加转置。zip将特征值与evecs的行相关联,但应该与evecs的列相关联。从长远来看,选择/向上投票仅链接答案没有帮助(显然短期内也不行,因为这似乎不是一个有效的解决方案)。
Find k eigenvalues and eigenvectors of the square matrix A.