Mímisbrunnr知恵の泉

← ネットワーク科学 一覧

🎓 レベル:発展 | 重要度:A(必須)

📎 前提:グラフの表現ランダムウォークと拡散の数理 | 関連:スペクトルクラスタリング

要点(BLUF)

概念:グラフを行列の固有値で読む

隣接行列(グラフの表現)はグラフの全情報を持ちますが、その固有値・固有ベクトルを調べると、目で見ても分からない大域構造が浮かび上がります。中でもグラフラプラシアンは、連結性・コミュニティ・拡散・同期を統一的に語る中心的な行列です。固有値分解そのものは統計・線形代数のturf — ここではグラフ特有の意味に集中します。

数式による定義

次数を対角に並べた D=diag(deg(v))D = \mathrm{diag}(\deg(v)) と隣接行列 AA から、

L=DAL = D - A

成分で書くと Lii=deg(i)L_{ii} = \deg(i)Lij=1L_{ij} = -1(エッジあり)、00(なし)。LL は対称で半正定値(固有値はすべて 0\geq 0)。その理由は2次形式が

xLx=(i,j)E(xixj)20\mathbf{x}^\top L \mathbf{x} = \sum_{(i,j)\in E} (x_i - x_j)^2 \geq 0

と、隣接ノードの値の差の2乗和になるから。これは「LL がグラフ上の微分(差分)作用素」であることを意味します。

スペクトルが符号化する大域構造

ラプラシアンの固有値を 0=λ1λ2λn0 = \lambda_1 \leq \lambda_2 \leq \cdots \leq \lambda_n と並べると:

コードで確認

import networkx as nx
import numpy as np

def clean(arr):
    return [0.0 if abs(x) < 1e-9 else round(float(x), 3) for x in arr]  # 数値誤差の-0を0に

# 連結なサイクル C6
G = nx.cycle_graph(6)
eig = np.sort(np.linalg.eigvalsh(nx.laplacian_matrix(G).toarray().astype(float)))
print("C6 のラプラシアン固有値      :", clean(eig))
print("  ゼロ固有値の数(=連結成分数):", int(np.sum(np.isclose(eig, 0))))

# 非連結:2つの三角形
G2 = nx.disjoint_union(nx.complete_graph(3), nx.complete_graph(3))
eig2 = np.sort(np.linalg.eigvalsh(nx.laplacian_matrix(G2).toarray().astype(float)))
print("2つの三角形の固有値          :", clean(eig2))
print("  ゼロ固有値の数(=連結成分数):", int(np.sum(np.isclose(eig2, 0))))

print("P6 の代数的連結度(λ2)        :", round(float(nx.algebraic_connectivity(nx.path_graph(6))), 4))

実行結果:

C6 のラプラシアン固有値      : [0.0, 1.0, 1.0, 3.0, 3.0, 4.0]
  ゼロ固有値の数(=連結成分数): 1
2つの三角形の固有値          : [0.0, 0.0, 3.0, 3.0, 3.0, 3.0]
  ゼロ固有値の数(=連結成分数): 2
P6 の代数的連結度(λ2)        : 0.2679

連結なサイクル C6 は0固有値が1個(連結成分1つ)。2つの三角形を離して置くと0固有値が2個になり、連結成分の数とぴったり一致します。一直線のパス P6 の代数的連結度は0.27と小さい — 細長くて切れやすい構造を反映しています。

数式の直観的意味

xLx=(i,j)(xixj)2\mathbf{x}^\top L\mathbf{x} = \sum_{(i,j)} (x_i-x_j)^2 は「隣り合うノードに似た値を割り当てたときの滑らかさ」を測ります。固有値が小さい固有ベクトルは「エッジの両端で値が似ている=なめらか」なベクトル。0固有値のベクトルは「各連結成分内で完全に一定」 — だから0の数が成分数になる。λ2\lambda_2 の固有ベクトル(Fiedlerベクトル)は「全体を最もなめらかに2つに分ける軸」で、これがコミュニティ分割(スペクトルクラスタリング)の出発点です。ラプラシアンはランダムウォーク(ランダムウォークと拡散の数理)の生成作用素でもあり、拡散の速さも λ2\lambda_2 が支配します。

⚠️ よくある誤解・落とし穴

対応シミュレーション

本文のコードがそのまま検証用です。Fiedlerベクトルによる分割は スペクトルクラスタリング

関連