Pythonでラプラシアン(L)のフィールダーベクトルを見つけるにはどうすればよいですか?
次を使用して固有値と固有ベクトルを取得できます:eigenvalues、eigenvectors = linalg.eig(L)
Pythonは固有値を順番に返さないと思います。
2番目に大きい固有値を取得し、それを対応する固有ベクトルと一致させますか(インデックスで一致)?
固有値を注文するとき、負の値をどのように処理しますか?絶対等級による順序付けですか?
ご協力いただきありがとうございます
Pythonでラプラシアン(L)のフィールダーベクトルを見つけるにはどうすればよいですか?
次を使用して固有値と固有ベクトルを取得できます:eigenvalues、eigenvectors = linalg.eig(L)
Pythonは固有値を順番に返さないと思います。
2番目に大きい固有値を取得し、それを対応する固有ベクトルと一致させますか(インデックスで一致)?
固有値を注文するとき、負の値をどのように処理しますか?絶対等級による順序付けですか?
ご協力いただきありがとうございます
まあ、関係する数学についてはわかりませんが、最善を尽くします。
ドキュメントを確認すると、実際にlinalg.eigは、対応する固有値と同じ順序で固有ベクトルが返されます。
私は次のようなことをするかもしれません:
w, v = linalg.eig(L)
seen = {}
unique_eigenvalues = []
for (x, y) in zip(w, v):
if x in seen:
continue
seen[x] = 1
unique_eigenvalues.append((x, y))
fiedler = sorted(unique_eigenvalues)[1][1]
デフォルトでは、Pythonはタプルを最初の要素、次に2番目の要素、というように並べ替えます。数値は、期待どおりに並べ替えられます(-2 <-1など)。もちろん、これは固有値が複雑ではないことを前提としています。
また、重複する固有値が存在する可能性があり、フィードラーベクトルは2番目に小さい一意の固有値に関連付けられた固有ベクトルであると想定しました。
ただの追加の解決策:
import numpy as np
import scipy.linalg as la
eig_values, eig_vectors = la.eig(laplacian)
fiedler_pos = np.where(eigvalues.real == np.sort(eig_values.real)[1])[0][0]
fiedler_vector = np.transpose(eig_vectors)[fiedler_pos]
print("Fiedler vector: " + str(fieder_vector.real))
説明:フィードラーベクトルの固有値はゼロ以外で最小です。したがって、固有値を並べ替えて、2番目に小さい値を取得する必要があります(ちなみに、ゼロ要素も最初に存在することを確認するのは理にかなっています)。np.sort(eigvalues.real)[1]ソートされた(実際の)配列の2番目の要素が取得されていることがわかるように、これはで行われます。
ここで、元の配列の値と一致させて、その場所を取得する必要があります。これは、コマンドを使用して簡単に実行できnp.where()ます。結果は、括弧内に定義されたすべての検出されたインスタンスの配列であり、そこから最初のインスタンスを取得します。fiedler_pos変数には、固有ベクトルのフィードラーベクトルの位置が含まれるようになりました。
ベクトル自体を取得するための1つの方法は、関連する位置で転置された固有ベクトル行列を使用することです。