【ネットワークの中心性】vol.6 Katz 中心性
シリーズの目次
枝をたくさん張っても点がもらえない...
図1:強連結でない有向グラフ
前回の記事では,次数中心性を固有ベクトル中心性に拡張することで,ネットワーク構造の持つグローバルな情報を反映したランク付けが達成できることを確認しました.しかし,図1のような強連結でない有向グラフでは,エッジを張っているにもかかわらず,定義上中心性が
この問題をシンプルなアイデアで解決するのが Katz 中心性 (Katz centrality) です[1].問題の元凶は,
Katz 中心性
Katz 中心性は固有ベクトル中心性の欠点を補完したものなので,ハブベース固有ベクトル中心性からハブベース Katz 中心性 (hub-based Katz centrality) を,オーソリティベース固有ベクトル中心性からオーソリティベース Katz 中心性 (authority-based Katz centrality) をそれぞれ導けます.参考にハブベース固有ベクトル中心性
以下,有向グラフ
ハブベース Katz 中心性
ノード
と定義されます.ただし,
ところで,
と書け,さらにこれをベクトル形式で書くと,
と変形できます.何となくノイマン級数の補題で見たような形をしていますね.というのは,
で与えられます.
証明
が成り立つ.したがって,線形システム
で与えられる.
オーソリティベース Katz 中心性
ノード
と定義されます.ただし,
と書け,さらにこれをベクトル形式で書くと
と変形できます.
で与えられます.
証明
で与えられる.また,両辺の転置をとると
\alpha の役割
パラメータ パラメータ
図2:ハブ/オーソリティベース固有ベクトル中心性(上段)とハブ/オーソリティベース Katz 中心性(下段)
出所)Stachurski et al. (2022)
実際の計算においては,
Python による実装
Katz 中心性を計算する katz_centrality()
関数を作り,図1の有向グラフの中心性を求めます.例の如く,隣接行列の転置を取ってハブ中心性からオーソリティ中心性に変換するテクニックを使って,有向グラフにも無向グラフにも使用できる関数にしておきます.まず,隣接行列 spectral_radius()
関数を定義します.
import numpy as np
def spectral_radius(M):
"""
Compute the spectral radius of M.
"""
return np.max(np.abs(np.linalg.eigvals(M)))
def katz_centrality(A, alpha=1, authority=False):
"""
Computes the Katz centrality of A, defined as the x solving
x = 1 + alpha A x (1 = vector of ones)
Parameters
----------
A : NumPy ndarray
Adjacency matrix representation of graph.
alpha : int or float (default: 1)
When the spectral radius of A < 1, using alpha = 1 is default.
authority : bool (default: False)
If authority = True, A is replaced by its transpose.
Returns
-------
k : NumPy ndarray
Katz centrality of A.
"""
A_temp = A.T if authority else A
n = len(A_temp)
I = np.identity(n)
r = spectral_radius(A_temp)
alpha = np.random.uniform(low=0.0, high=1/r) if r >= 1 else alpha
IA_inv = np.linalg.inv(I - alpha * A_temp)
return IA_inv @ np.ones(n)
図1の有向グラフをgraph-toolで生成します.
import graph_tool.all as gt
edge_lst = [(0, 1), (0, 2), (0, 3), (1, 2)] # エッジリスト
g = gt.Graph(directed=True) # グラフを生成
g.add_edge_list(edge_lst) # グラフにエッジを追加
gt.graph_draw(g, vertex_text=g.vertex_index, output_size=(300, 300)); # グラフを可視化
グラフ g
を隣接行列 (numpy.ndarray
) に変換して,katz_centrality()
関数に渡します.次数の計算は,第4回で定義した degree_centrality()
関数を使用しています.
import pandas as pd
# グラフを隣接行列に変換
A = gt.adjacency(g).toarray().T # graph-tool の隣接行列の定義は j --> i で a_{ij} = 1
out_degree = degree_centrality(A) # 出次数
in_degree = degree_centrality(A, True) # 入次数
katz_hub = katz_centrality(A, authority=False) # ハブベース Katz 中心性
katz_authority = katz_centrality(A, authority=True) # オーソリティベース Katz 中心性
# データフレームにまとめる
df = pd.DataFrame({"out_degree": out_degree,
"katz_hub": katz_hub,
"in_degree": in_degree,
"katz_authority": katz_authority})
df
index | out_degree | katz_hub | in_degree | katz_authority |
---|---|---|---|---|
0 | 3.0 | 5.0 | 0.0 | 1.0 |
1 | 1.0 | 2.0 | 1.0 | 2.0 |
2 | 0.0 | 1.0 | 2.0 | 4.0 |
3 | 0.0 | 1.0 | 1.0 | 2.0 |
固有ベクトル中心性では中心性はすべて
Katz 中心性の問題点
Katz 中心性にもまた,問題点があります.Katz 中心性の高いノードが1つあると,それに隣接するノードの中心性も無条件に高くなってしまいます.簡単のため,無向グラフで考えます.仮に高い Katz 中心性をもつノード
たとえば,楽天市場のような総合的なショッピングサイトの中心性は非常に高くなるでしょう.楽天市場はたくさんのメーカーや販売者のウェブページにリンクしています.つまり,楽天市場は膨大な数の外部につながるエッジを持つわけですが,このとき楽天市場の持つ非常に高い中心性が等しくすべての外部サイトに流入するのは適切と言えるでしょうか.おそらくほとんどの人は,個々の外部サイトに流入する楽天市場の中心性は何らかの方法で薄められるべきだと考えるでしょう.しかし,Katz 中心性によれば楽天市場の中心性はそっくりそのまま外部サイトに流入しても構わないというのです.
次回予告
本記事では,Katz 中心性の定義と特徴を確認し,Python で無向グラフ(有向グラフ)の(ハブ/オーソリティベース)Katz 中心性を計算する katz_centrality()
関数を実装しました.実装した関数を使えば,固有ベクトル中心性が使えない有向グラフに対しても中心性を計算できることを確認し,Katz 中心性は固有ベクトル中心性の問題点を解決していることがわかりました.しかしKatz 中心性には,中心性の高いノードに隣接するノードの中心性もすべて等しく高くなるという望ましくない性質があることが懸念点として挙げられました.
次回第7回は,Katz 中心性の問題点を解決するアプローチである PageRank を見ていきます.元論文 Brin and Page (1998) では,グラフ上のランダムウォークとして導入されていますが,本連載は次数中心性を拡張していくスタイルなので,次回も Katz 中心性を拡張する形で議論を進めていきます.
おまけ
前回,固有ベクトル中心性はネットワーク全体の情報を使って計算される中心性指標であることを確認しました.固有ベクトル中心性の拡張である Katz 中心性もまた,ネットワーク全体の情報を使用しているのですが,ここでは別の方法でそれを確かめてみます.個人的にはこちらの方が直感的に理解できて良いなと思っています.
Katz 中心性
べき級数の和の部分を展開すると,
と書けます.このように展開すると,それぞれの項で隣接行列のべき乗の行和を取って足し合わせていることがわかります.ところで,隣接行列のべき乗
参考文献
- Benzi, Michele, and Christine Klymko. "On the limiting behavior of parameter-dependent network centrality measures." SIAM Journal on Matrix Analysis and Applications 36.2 (2015): 686-706.
- Bonacich, P. (1987). Power and centrality: A family of measures. American journal of sociology, 92(5), 1170-1182.
- Brin, S., & Page, L. (1998). The anatomy of a large-scale hypertextual web search engine. Computer networks and ISDN systems, 30(1-7), 107-117.
- John Stachurski and Thomas J. Sargent. Economic Networks: Theory and Computation (QuantEcon, 2022). URL https://networks.quantecon.org/ .
- Katz, L. (1953). A new status index derived from sociometric analysis. Psychometrika, 18(1), 39-43.
- Menczer, F., Fortunato, S. & Davis, C. A. A First Course in Network Science (Cambridge University Press, 2020). URL https://cambridgeuniversitypress.github.io/FirstCourseNetworkScience/.
Discussion