Mímisbrunnr知恵の泉

← ネットワーク科学 一覧

🎓 レベル:基礎 | 重要度:A(必須)

📎 前提:次数・道・連結成分 | 関連:スケールフリー(Barabási–Albert)固有ベクトル中心性とPageRank

要点(BLUF)

概念:最も素朴な重要度

「重要な人=友達が多い人」。直観的で、計算も一瞬。これが次数中心性です。ノードに接続するエッジ数(次数)をそのまま重要度とみなします。シンプルですが、現実のネットワークでは次数が極端に偏ること(少数のハブと多数の末端)があり、その分布の形こそが第4章のランダムグラフモデルを分ける鍵になります。

数式による定義

ノード vv の次数中心性は、比較しやすいよう最大値 n1n-1 で割って正規化します。

CD(v)=deg(v)n1C_D(v) = \frac{\deg(v)}{n-1}

n1n-1 は「自分以外の全員と繋がった場合の次数」。よって CD(v)[0,1]C_D(v) \in [0,1] で、1 なら全員と直接つながったノードです。

次数分布 P(k)P(k) は「次数がちょうど kk のノードの割合」。平均次数は握手補題(次数・道・連結成分)から

k=1nvdeg(v)=2mn\langle k \rangle = \frac{1}{n}\sum_v \deg(v) = \frac{2m}{n}

分布の裾(大きな kk の出やすさ)が、ネットワークの性格を決めます。ランダムグラフでは鋭く減衰するポアソン型、現実の多くのネットワークでは裾の重いべき則 P(k)kγP(k)\sim k^{-\gamma}スケールフリー(Barabási–Albert))。

コードで確認

import networkx as nx

G = nx.karate_club_graph()  # 34人の実ネットワーク
deg = dict(G.degree())
dc = nx.degree_centrality(G)

print("ノード数:", G.number_of_nodes(), " エッジ数:", G.number_of_edges())
print("平均次数 <k> =", round(2*G.number_of_edges()/G.number_of_nodes(), 3))

top = sorted(dc.items(), key=lambda x: -x[1])[:3]
print("次数トップ3 (id, 次数):", [(v, deg[v]) for v,_ in top])
print("次数中心性トップ3:", [(v, round(c,3)) for v,c in top])

実行結果:

ノード数: 34  エッジ数: 78
平均次数 <k> = 4.588
次数トップ3 (id, 次数): [(33, 17), (0, 16), (32, 12)]
次数中心性トップ3: [(33, 0.515), (0, 0.485), (32, 0.364)]

ノード33とノード0が突出(このネットワークは実際に2人の指導者が対立して分裂したクラブで、彼らがその2人)。平均次数は約4.6なのに、ハブは16〜17 — 偏りが見て取れます。

数式の直観的意味

CD(v)=deg(v)/(n1)C_D(v)=\deg(v)/(n-1) の分母 n1n-1 は「理論上の上限で割った達成率」。テストの点を満点で割って割合にするのと同じ発想で、ネットワークの大きさが違っても比較できるようにしています。一方、次数分布 P(k)P(k) を見ることは「集団の格差」を見ること。全員が同じくらいの次数(平等)か、一部に集中(ハブ型)か。この差が拡散やロバスト性(第5・6章)の挙動を大きく変えます。

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

対応シミュレーション

本文のコードがそのまま検証用です。次数分布の型は スケールフリー(Barabási–Albert) で詳述します。

関連