【问题标题】:How do I find out eigenvectors corresponding to a particular eigenvalue of a matrix?如何找出与矩阵的特定特征值相对应的特征向量?
【发布时间】:2012-08-10 20:05:30
【问题描述】:

如何找出与特定特征值对应的特征向量?

我有一个随机矩阵(P),其中一个特征值为1。我需要找到特征值1对应的特征向量。

scipy函数scipy.linalg.eig返回特征值和特征向量的数组。

D, V = scipy.linalg.eig(P)

这里的 D(值数组)和 V(向量数组)都是向量。

一种方法是在D中进行搜索,在V中提取对应的特征向量。有没有更简单的方法?

【问题讨论】:

    标签: python numpy scipy eigenvector eigenvalue


    【解决方案1】:
    import numpy as np
    import numpy.linalg as linalg
    
    
    P = np.array([[2, 0, 0], [0, 1, 0], [0, 0, 3]])
    
    D, V = linalg.eig(P)
    print(D)
    # [ 2.  1.  3.]
    

    特征向量是 V 的列:

    V = V.T
    
    for val, vec in zip(D, V):
        assert np.allclose(np.dot(P, vec), val*vec)
    

    所以特征值1.0对应的特征向量为

    def near(a, b, rtol = 1e-5, atol = 1e-8):
        return np.abs(a-b)<(atol+rtol*np.abs(b))
    
    print(V[near(D, 1.0)])
    # [[ 0.  1.  0.]]
    

    由于可以有多个具有相同特征值的特征向量,V[near(D, 1.0)] 返回一个二维数组——数组的每一行都是一个特征值为 1.0 的特征向量。

    【讨论】:

      【解决方案2】:

      如果您正在寻找与一个特征值对应的一个特征向量,使用scipy.sparse.linalg implementation of the eig function 可能会更有效。 它允许查找固定数量的特征向量并围绕特定值移动搜索。例如,您可以这样做:

      values, vectors = scipy.sparse.linalg.eigs(P, k=1, sigma=1)
      

      【讨论】:

      • 是否返回P的左特征值?
      • 我认为你的意思是 eigs 不是 eig。我尝试使用 scipy.sparse.linalg.eigs(P, k=1, sigma=1) 但引发异常 - raise NotImplementedError("shifted eigenproblem not supported yet")
      • 固定 eig -> eigs。移位特征问题在我使用的版本中实现:scipy 0.10.1
      猜你喜欢
      • 2012-08-08
      • 2019-04-27
      • 2011-09-29
      • 2022-06-14
      • 2018-10-31
      • 2020-11-08
      • 2019-08-18
      • 2017-09-27
      • 1970-01-01
      相关资源
      最近更新 更多