【问题标题】:Quickly and efficiently calculating an eigenvector for known eigenvalue快速有效地计算已知特征值的特征向量
【发布时间】:2015-03-26 22:44:21
【问题描述】:

我的问题的简短版本

如果我们已经知道属于特征向量的特征值,那么计算矩阵A 的特征向量的最佳方法是什么?

更长的解释

我有一个很大的随机矩阵A,因为它是随机的,所以有一个非负左特征向量x(例如A^Tx=x)。

我正在寻找快速有效的数值计算该向量的方法。 (最好在 MATLAB 或 numpy/scipy 中 - 因为这两者都围绕着 ARPACK/LAPACK,所以任何一个都可以)。

我知道1A 的最大特征值,所以我知道调用类似这样的 Python 代码:

from scipy.sparse.linalg import eigs
vals, vecs = eigs(A, k=1)

将导致 vals = 1vecs 等于我需要的向量。

然而,这里困扰我的是,计算特征值通常比求解线性系统更困难,并且通常,如果矩阵 M 具有特征值 l,那么找到适当的特征向量是求解方程(M - 1 * I) * x = 0 的问题,至少在理论上,这是一个比计算特征值更简单的操作,因为我们只是求解线性系统,更具体地说,是找到矩阵的零空间。

但是,我发现MATLAB 中的所有零空间计算方法都依赖于svd 计算,这是我无法在我的大小矩阵上执行的过程。我也不能调用线性方程的求解器,因为它们都只能找到一个解,而那个解是 0(是的,它是一个解,但不是我需要的)。

有什么方法可以避免调用类似eigs 的函数来比计算最大特征值和伴随的特征向量更快地解决我的问题?

【问题讨论】:

  • 您是否关心找到最大的特征向量或特征值?如果是这种情况,请考虑使用幂法。它是一种迭代算法,同时确定最突出的特征向量和特征值:math.ualberta.ca/~ewoolgar/labs/linalg/Lab15.pdf。它肯定比做一个完整的 SVD 更有效。
  • @rayryeng 实际上,MATLAB 使用 ARPACK 比常规的幂法更快地找到最大的特征对。但是我的问题的主要焦点是:由于我已经知道最大特征值是什么,是否存在一种方法来找到比 更好 的方法只需找到最大的特征对?
  • 很遗憾我没有答案。我也很想知道答案是什么!希望有人能够回答您的问题(Amro、chappjc、horchler)。
  • 我已联系 Amro 和 chappjc 以引起对您帖子的关注。希望他们能够解决您的问题!
  • 深入挖掘:您的矩阵大小是多少?它有什么特殊的结构吗? (稀疏,三角形,对称,正定,...)您想要一个与您的特征值相对应的单个特征向量还是所有特征向量(如果还有其他特征)?您需要为许多矩阵计算这些吗?

标签: python matlab linear-algebra numeric eigenvector


【解决方案1】:

这是使用 Matlab 的一种方法:

  1. x表示与特征值1关联的左(行)特征向量。它满足线性方程组(或矩阵方程)xA = x,或 x(A-I)=0
  2. 为避免该方程组的全零解,请删除第一个方程并在其余方程中任意将 x 的第一个条目设置为 1。
  3. 求解剩余的方程(x1 = 1)以获得 x 的其他条目。

使用 Matlab 的示例:

>> A = [.6 .1 .3
        .2 .7 .1
        .5 .1 .4]; %// example stochastic matrix
>> x = [1, -A(1, 2:end)/(A(2:end, 2:end)-eye(size(A,1)-1))]
x =
   1.000000000000000   0.529411764705882   0.588235294117647
>> x*A %// check
ans =
   1.000000000000000   0.529411764705882   0.588235294117647

注意代码-A(1, 2:end)/(A(2:end, 2:end)-eye(size(A,1)-1))是第3步。

在您的公式中,您将 x 定义为 AT 的()右特征向量(例如ATx = x)。这只是上面代码中的x.'

>> x = x.'
x =
   1.000000000000000
   0.529411764705882
   0.588235294117647
>> A.'*x %// check
ans =
   1.000000000000000
   0.529411764705882
   0.588235294117647

您当然可以规范化特征向量以求和 1:

>> x = x/sum(x)
x =
   0.472222222222222
   0.250000000000000
   0.277777777777778
>> A.'*x %'// check
ans =
   0.472222222222222
   0.250000000000000
   0.277777777777778

usual convention 之后。等效地,这对应于转置矩阵的特征向量。

【讨论】:

  • 不错的方法。我还考虑过设置一个随机向量b,然后求解方程(A-I)(y) = (A-I)b,然后设置x=y-b,因为(A-I)b = (A-I)(x+b) = (A-I)x + (A-I)b 意味着(A-I)(x)=0。您的案例是特定 b 的一个示例。
猜你喜欢
  • 1970-01-01
  • 2014-10-30
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多