7

特定の固有値に対応する固有ベクトルを見つけるにはどうすればよいですか?

確率行列(P)があり、その固有値の1つは1です。固有値1に対応する固有ベクトルを見つける必要があります。

scipy関数scipy.linalg.eigは、固有値と固有ベクトルの配列を返します。

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

ここで、D(値の配列)とV(ベクトルの配列)は両方ともベクトルです。

1つの方法は、Dで検索を実行し、Vで対応する固有ベクトルを抽出することです。もっと簡単な方法はありますか?

4

2 に答える 2

8
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)]、2次元配列を返します。配列の各行は、固有値が1.0の固有ベクトルです。

于 2012-08-14T15:19:52.810 に答える
7

1つの固有値に対応する1つの固有ベクトルを探している場合は、eig関数のscipy.sparse.linalg実装を使用する方がはるかに効率的です。これにより、固定数の固有ベクトルを検索し、特定の値を中心に検索をシフトできます。あなたは例えばすることができます:

values, vectors = scipy.sparse.linalg.eigs(P, k=1, sigma=1)
于 2012-08-14T15:30:14.793 に答える