如何找出对应于特定特征值的特征向量?
我有一个随机矩阵(P),其中一个特征值为 1。我需要找到与特征值 1 对应的特征向量。
scipy 函数scipy.linalg.eig返回特征值和特征向量的数组。
D, V = scipy.linalg.eig(P)
这里 D(值数组)和 V(向量数组)都是向量。
一种方法是在 D 中进行搜索并在 V 中提取相应的特征向量。有没有更简单的方法?
如何找出对应于特定特征值的特征向量?
我有一个随机矩阵(P),其中一个特征值为 1。我需要找到与特征值 1 对应的特征向量。
scipy 函数scipy.linalg.eig返回特征值和特征向量的数组。
D, V = scipy.linalg.eig(P)
这里 D(值数组)和 V(向量数组)都是向量。
一种方法是在 D 中进行搜索并在 V 中提取相应的特征向量。有没有更简单的方法?
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 的特征向量。
如果您正在寻找与一个特征值对应的一个特征向量,则使用eig 函数的 scipy.sparse.linalg 实现可能会更有效。它允许查找固定数量的特征向量并围绕特定值移动搜索。例如,您可以这样做:
values, vectors = scipy.sparse.linalg.eigs(P, k=1, sigma=1)