快速有效地计算已知特征值的特征向量



我的问题的简短版本

如果我们已经知道属于特征向量的特征值,那么计算矩阵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)

将导致CCD_ 7和CCD_。

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

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

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

这里有一种使用Matlab:的方法

  1. x表示与特征值1相关的(行)左特征向量。它满足线性方程组(或矩阵方程)xA=x,或x-AI)=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

遵循通常的惯例。等价地,这对应于转置矩阵的特征向量

相关内容

  • 没有找到相关文章