本站内容由 AI 生成,可能存在错误。如发现问题,欢迎到 GitHub Issues 反馈。

中心性:谁最重要?

中心性:谁最重要?

更新于 2026-04-24

上一篇 Art. 6: 最短路径 建立了图上”距离”的完整工具箱——BFS、Dijkstra、Bellman-Ford、Floyd-Warshall、A*。有了距离,一个自然的后续问题浮现:在一个网络中,哪个节点最”重要”?

“重要”是个模糊的词。在社交网络中,认识最多人的那位是最重要的?还是连接两个社群的关键中间人?抑或离所有人最近、消息传播最快的那位?不同的”重要性”定义催生了不同的中心性(Centrality)指标——而每种指标都在揭示网络结构的不同侧面。

本文是 Part 2”量”的核心度量文章。我们将系统地学习五种中心性指标,理解它们各自的数学定义、直觉含义、计算方法和适用场景。

算法范式:穷举搜索(Degree)、动态规划/BFS(Betweenness — Brandes)、迭代逼近(PageRank/Eigenvector)

核心问题:谁是图中最”重要”的节点?

给定一张图 G=(V,E)G = (V, E)n=Vn = |V| 个节点、m=Em = |E| 条边。我们想找到”最重要”的节点——但”重要”至少有以下几种含义:

  1. 连接数多 → 认识的人最多(Degree Centrality)
  2. 控制信息流 → 别人之间传递信息经常要通过你(Betweenness Centrality)
  3. 距离近 → 你到任何人的平均距离最短(Closeness Centrality)
  4. 重要的朋友 → 你的朋友本身也很重要(Eigenvector / PageRank)
  5. 全局可达 → 你通过各种路径能触达的节点多(Katz Centrality)

没有哪种指标是”最好的”——它们回答的是不同的问题。选择哪个指标取决于你对”重要”的定义。

核心思路:五种”重要性”的数学化

每种中心性指标把一种直觉上的”重要性”翻译成精确的数学公式,然后通过图算法高效计算。我们可以把它们想象成对同一张社交网络拍摄的五张”X 光片”——每张照片让不同的结构特征浮现出来:

  • Degree:看”谁的连线最多”——最简单的量,O(n+m)O(n+m) 即可算完
  • Betweenness:看”谁处在最多最短路径上”——需要从每个源点做 BFS,Brandes 算法 O(nm)O(nm)
  • Closeness:看”谁到所有人最近”——需要全对最短路径距离
  • Eigenvector/PageRank:看”谁的邻居本身也重要”——递归定义,通过矩阵幂迭代求解
  • Katz:看”谁通过所有路径的加权总和最大”——考虑所有长度的路径

接下来逐一展开。

Degree Centrality:连接数 = 重要性

定义

Degree Centrality 是最简单、最直觉的中心性指标:一个节点的度(连接数)越大,它就越”重要”。

对于无向图中的节点 vv

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

分母 n1n - 1 是归一化因子——在 nn 个节点的图中,一个节点最多与 n1n - 1 个其他节点相连,所以 CD(v)[0,1]C_D(v) \in [0, 1]

对于有向图,度分为入度和出度,对应两种 Degree Centrality:

  • In-degree centralityCDin(v)=deg(v)/(n1)C_D^{in}(v) = \deg^-(v) / (n-1)——被指向越多越”受欢迎”
  • Out-degree centralityCDout(v)=deg+(v)/(n1)C_D^{out}(v) = \deg^+(v) / (n-1)——指向别人越多越”活跃”
连接数越多越"重要"——D 有 6 条边,度中心性最高Degree Centrality — 连接数 = 重要性Adeg=3Bdeg=2Cdeg=2Ddeg=6Edeg=2Fdeg=2Gdeg=3D: deg=6, C_D = 6/6 = 1.00 — 度中心性最高节点大小与度成正比。直觉:认识的人越多越"重要"

直觉与适用场景

Degree Centrality 回答的是”谁认识的人最多?“在社交网络中,高度中心性的节点是”社交达人”;在论文引用网络中,被引用最多的论文具有高入度中心性。

优势:计算极快——遍历一次邻接表即可,O(n+m)O(n + m)

局限:只看直接连接,完全忽略网络的全局结构。一个只连接着大量不重要节点的节点可能有很高的 Degree Centrality,但在全局信息传播中可能并不关键。

复杂度

  • 时间O(n+m)O(n + m)
  • 空间O(n)O(n)

Betweenness Centrality:谁控制信息流?

定义

Betweenness Centrality(介数中心性,Freeman, 1977)捕捉的是一个节点在信息传播中的”中介”地位。如果网络中其他节点之间传递信息时,大量最短路径都经过你,那你就是信息流的瓶颈

对于节点 vv

CB(v)=svtσst(v)σstC_B(v) = \sum_{s \neq v \neq t} \frac{\sigma_{st}(v)}{\sigma_{st}}

逐项理解:

  • σst\sigma_{st}:节点 ss 到节点 tt最短路径总数
  • σst(v)\sigma_{st}(v):其中经过 vv 的最短路径数
  • σst(v)/σst\sigma_{st}(v) / \sigma_{st}ss-tt 最短路径中经过 vv比例
  • 对所有 svts \neq v \neq t 的点对求和:vv 对全网信息流的总”中介”贡献

归一化版本(除以最大可能值 (n1)(n2)2\frac{(n-1)(n-2)}{2},无向图)使 CB(v)[0,1]C_B(v) \in [0, 1]

B 是两个社群之间的瓶颈——所有跨社群的最短路径都经过 BBetweenness Centrality — 谁控制信息流?社群 1社群 2ACDBEFGB 的介数中心性最高:9 条跨社群最短路径全部经过 B直觉:B 是信息流的"瓶颈"或"守门人",控制力最强

直觉与适用场景

Betweenness Centrality 回答的是”谁是网络中的守门人?

  • 社交网络:高 betweenness 的人是不同社群之间的”桥梁”——移除他可能导致信息断流
  • 交通网络:高 betweenness 的路口是交通瓶颈
  • 计算机网络:高 betweenness 的路由器是关键节点,故障会影响全网

注意:高 betweenness 不要求高 degree。一个度很小的节点如果恰好连接两个大社群,它的 betweenness 可能极高——图中的 B 只有两条边,但所有跨社群的最短路径都经过它。

Brandes 算法:高效计算 Betweenness

朴素方法:对所有 (n2)\binom{n}{2} 个点对计算最短路径,逐一检查中间节点。这至少是 O(n3)O(n^3)。Brandes(2001)提出了一个巧妙的 O(nm)O(nm) 算法,核心思想是反向传播依赖

核心概念:对依赖(Pair-Dependency)

定义节点 ss 对节点 vv对依赖(pair-dependency):

δs(v)=tvσst(v)σst\delta_{s \bullet}(v) = \sum_{t \neq v} \frac{\sigma_{st}(v)}{\sigma_{st}}

这是所有以 ss 为源的最短路径中经过 vv 的比例之和。最终的 Betweenness 就是:

CB(v)=sδs(v)C_B(v) = \sum_s \delta_{s \bullet}(v)

Brandes 的关键洞察是一个递推公式

δs(v)=w:vPs(w)σsvσsw(1+δs(w))\delta_{s \bullet}(v) = \sum_{w: v \in P_s(w)} \frac{\sigma_{sv}}{\sigma_{sw}} \cdot (1 + \delta_{s \bullet}(w))

其中 Ps(w)P_s(w) 是节点 ww 在以 ss 为源的 BFS 树中的前驱集合(即从 ssww 的最短路径上,ww 的前一个节点集合)。

这个递推公式的含义:vv 的对依赖等于所有”vv 是前驱”的后继节点 ww 的贡献之和。每个 ww 的贡献是 vvww 的路径份额(σsv/σsw\sigma_{sv}/\sigma_{sw})乘以 ww 自身的对依赖加 1(ww 本身也算一个目标)。

Brandes 算法:先 BFS 计算最短路径数,再反向传播依赖Brandes 算法 — 两阶段流程阶段 1:正向 BFSSABCDd=0d=1d=2阶段 2:反向传播依赖SABCD关键数据结构阶段 1 计算(从源 S 出发):d[v] = 到 S 的最短距离σ[v] = 从 S 到 v 的最短路径数P[v] = v 的前驱集合d: S=0, A=1, B=1, C=2, D=2σ: S=1, A=1, B=1, C=1, D=3P: A={S}, B={S}, C={A}, D={A,B,C}阶段 2 计算(从远到近反向扫描):δ[v] = v 的对依赖对每个前驱 w ∈ P[v]:δ[w] += (σ[w]/σ[v]) · (1 + δ[v])最终:C_B(v) = Σ_s δ_s[v] / 2(无向图)

算法流程

对于每个源节点 ss

阶段 1(正向 BFS):从 ss 出发做 BFS,记录:

  • d[v]d[v]ssvv 的最短距离
  • σ[v]\sigma[v]ssvv 的最短路径数量
  • P[v]P[v]vv 在 BFS 树中的前驱集合
  • 将节点按发现顺序压入栈 SS

阶段 2(反向传播):按距离从远到近(栈 SS 的弹出顺序)扫描每个节点 ww

  • ww 的每个前驱 vP[w]v \in P[w]δ[v]+=(σ[v]/σ[w])(1+δ[w])\delta[v] \mathrel{+}= (\sigma[v] / \sigma[w]) \cdot (1 + \delta[w])
  • δ[w]\delta[w] 累加到 CB[w]C_B[w]
Brandes(G):
    C_B[v] = 0 for all v

    for each s ∈ V:
        // Phase 1: BFS from s
        S = empty stack
        P[w] = empty list for all w
        σ[t] = 0 for all t;  σ[s] = 1
        d[t] = -1 for all t;  d[s] = 0
        Q = queue containing s

        while Q not empty:
            v = Q.dequeue()
            S.push(v)
            for each neighbor w of v:
                if d[w] < 0:        // w not yet visited
                    d[w] = d[v] + 1
                    Q.enqueue(w)
                if d[w] == d[v] + 1: // w is one level deeper
                    σ[w] += σ[v]
                    P[w].append(v)

        // Phase 2: back-propagation
        δ[v] = 0 for all v
        while S not empty:
            w = S.pop()
            for each v ∈ P[w]:
                δ[v] += (σ[v] / σ[w]) · (1 + δ[w])
            if w ≠ s:
                C_B[w] += δ[w]

    // 无向图需除以 2(每对 (s,t) 被算了两次)
    C_B[v] /= 2 for all v

数值走查

用 5 个节点的小图走查 Brandes 算法。图的边为:SS-AASS-BBAA-BBAA-CCAA-DDBB-DDCC-DD

s=Ss = S

阶段 1(BFS):

  • ddS:0,A:1,B:1,C:2,D:2S{:}0, A{:}1, B{:}1, C{:}2, D{:}2
  • σ\sigmaS:1,A:1,B:1,C:1,D:2S{:}1, A{:}1, B{:}1, C{:}1, D{:}2DD 在 BFS 层 2,其层 1 前驱为 AABBσ[D]=σ[A]+σ[B]=2\sigma[D] = \sigma[A] + \sigma[B] = 2。注意 CCDD 相邻但 d[C]=d[D]=2d[C] = d[D] = 2,所以 CC 不是 DD 的 BFS 前驱)
  • PPP[A]={S}P[A] = \{S\}P[B]={S}P[B] = \{S\}P[C]={A}P[C] = \{A\}P[D]={A,B}P[D] = \{A, B\}

阶段 2(反向传播,按栈顺序 D,C,B,AD, C, B, A):

  • w=Dw = Dδ[D]=0\delta[D] = 0P[D]={A,B}P[D] = \{A, B\}
    • δ[A]+=(σ[A]/σ[D])(1+δ[D])=(1/2)(1+0)=0.5\delta[A] \mathrel{+}= (\sigma[A]/\sigma[D]) \cdot (1 + \delta[D]) = (1/2)(1+0) = 0.5
    • δ[B]+=(σ[B]/σ[D])(1+δ[D])=(1/2)(1+0)=0.5\delta[B] \mathrel{+}= (\sigma[B]/\sigma[D]) \cdot (1 + \delta[D]) = (1/2)(1+0) = 0.5
    • CB[D]+=0C_B[D] \mathrel{+}= 0
  • w=Cw = Cδ[C]=0\delta[C] = 0P[C]={A}P[C] = \{A\}
    • δ[A]+=(σ[A]/σ[C])(1+δ[C])=(1/1)(1+0)=1\delta[A] \mathrel{+}= (\sigma[A]/\sigma[C]) \cdot (1 + \delta[C]) = (1/1)(1+0) = 1
    • CB[C]+=0C_B[C] \mathrel{+}= 0
  • w=Bw = Bδ[B]=0.5\delta[B] = 0.5P[B]={S}P[B] = \{S\}
    • δ[S]+=(σ[S]/σ[B])(1+δ[B])=(1/1)(1.5)=1.5\delta[S] \mathrel{+}= (\sigma[S]/\sigma[B]) \cdot (1 + \delta[B]) = (1/1)(1.5) = 1.5
    • CB[B]+=0.5C_B[B] \mathrel{+}= 0.5
  • w=Aw = Aδ[A]=0.5+1=1.5\delta[A] = 0.5 + 1 = 1.5P[A]={S}P[A] = \{S\}
    • δ[S]+=(σ[S]/σ[A])(1+δ[A])=(1/1)(2.5)=2.5\delta[S] \mathrel{+}= (\sigma[S]/\sigma[A]) \cdot (1 + \delta[A]) = (1/1)(2.5) = 2.5
    • CB[A]+=1.5C_B[A] \mathrel{+}= 1.5

SS 的贡献:CB[A]+=1.5C_B[A] \mathrel{+}= 1.5CB[B]+=0.5C_B[B] \mathrel{+}= 0.5

对所有 5 个源节点重复这个过程,最后将结果除以 2(无向图),得到最终的 Betweenness Centrality。在这个图中,AA 的 betweenness 最高——它连接着左侧(SS)、上方(BB)和右侧(CCDD)的节点。

复杂度

  • 时间O(nm)O(nm)——对每个源节点做一次 BFS(O(m)O(m)),共 nn 个源
  • 空间O(n+m)O(n + m)
  • 对于加权图:BFS 替换为 Dijkstra,时间变为 O(nm+n2logn)O(nm + n^2 \log n)

Brandes 算法相比朴素 O(n3)O(n^3) 的改进在稀疏图上尤其显著(mn2m \ll n^2 时)。

Closeness Centrality:谁离所有人最近?

定义

Closeness Centrality(接近中心性)衡量一个节点到网络中所有其他节点的”平均距离”:

CC(v)=n1uvd(v,u)C_C(v) = \frac{n - 1}{\sum_{u \neq v} d(v, u)}

其中 d(v,u)d(v, u) 是节点 vvuu 的最短路径距离(Art. 6 的工具)。

逐项理解:

  • uvd(v,u)\sum_{u \neq v} d(v, u)vv 到所有其他节点的距离之和——越小说明 vv 越”居中”
  • 取倒数再乘以 n1n - 1:让”距离小”对应”中心性高”,同时归一化到 [0,1][0, 1]
C 到所有节点的平均距离最短——接近中心性最高Closeness Centrality — 谁离所有人最近?CΣd=7ABDEFGΣd=14C: Σd=7, C_C = 6/7 = 0.86 — 接近中心性最高G: Σd=14, C_C = 6/14 = 0.43 — 边缘节点,接近中心性最低

直觉与适用场景

Closeness Centrality 回答的是”谁能最快把消息传到所有人?

  • 传染病学:高 closeness 的个体处于网络”中心”,疾病从他们开始传播速度最快
  • 物流网络:仓库选址应该靠近 closeness 最高的位置,最小化平均配送距离
  • 社交网络:高 closeness 的用户可以最快地接收和传播信息

局限:Closeness Centrality 要求图是连通的——如果 vv 无法到达某个 uud(v,u)=d(v, u) = \infty),公式直接失效。对于非连通图,常用调和中心性(Harmonic Centrality)替代:

CH(v)=1n1uv1d(v,u)C_H(v) = \frac{1}{n-1} \sum_{u \neq v} \frac{1}{d(v, u)}

其中 1/=01/\infty = 0,自然处理不可达的情况。

计算方法

对每个节点做一次 BFS(无权图)或 Dijkstra(加权图),求出到所有其他节点的距离后求和取倒数。

复杂度

  • 时间O(nm)O(nm)(无权图,nn 次 BFS)或 O(nm+n2logn)O(nm + n^2 \log n)(加权图,nn 次 Dijkstra)
  • 空间O(n+m)O(n + m)

Eigenvector Centrality 与 PageRank:重要的朋友让你更重要

Eigenvector Centrality

前面三种中心性都是”本地”或”路径计数”指标。Eigenvector Centrality(特征向量中心性,Bonacich, 1987)引入了一个全新的视角——递归定义的重要性

一个节点的重要性与它的邻居的重要性之和成正比。

形式化:设 xvx_v 为节点 vv 的中心性分值,则

xv=1λuN(v)xux_v = \frac{1}{\lambda} \sum_{u \in N(v)} x_u

其中 N(v)N(v)vv 的邻居集合,λ\lambda 是一个归一化常数。

用邻接矩阵 AA 写成向量形式:

Ax=λxAx = \lambda x

这就是特征值问题xx 是邻接矩阵 AA 的特征向量,λ\lambda 是对应的特征值。根据 Perron-Frobenius 定理,对于连通无向图,取最大特征值 λ1\lambda_1 对应的特征向量(主特征向量),其分量全为正——这就是 Eigenvector Centrality。

关于特征值和特征向量的数学基础,可参考 矩阵数学路径的特征分解文章

PageRank:重要节点的推荐让你更重要——E 被 D、F、G 指向,且 D 本身也很重要PageRank / Eigenvector Centrality — 重要的朋友让你更重要A0.05B0.08C0.06D0.28E0.35F0.10G0.08E 的 PageRank 最高(0.35):被 D、F、G 指向,且 D 本身也是高排名节点递归定义:你的重要性 = Σ(指向你的邻居的重要性 / 他们的出度)

从 Eigenvector 到 PageRank

Eigenvector Centrality 在无向图上工作良好,但在有向图上存在问题:如果一个节点没有入边(没人指向它),或者存在”死胡同”(dangling node,出度为 0),迭代可能不收敛或给出无意义的结果。

PageRank(Page & Brin, 1998)是 Google 搜索引擎的核心算法,专门为有向图(Web 超链接图)设计,解决了 Eigenvector Centrality 的这些问题。

随机游走直觉

想象一个”随机冲浪者”在 Web 上浏览:

  • 在当前页面 vv 上,有 1d1 - d 的概率随机跳到任意页面(“无聊了,随便点一个”)
  • dd 的概率沿着当前页面的一条出链等概率地跳转

其中 dd阻尼因子(damping factor),通常取 d=0.85d = 0.85

当这个随机游走到达稳态分布时,每个页面被访问的频率就是它的 PageRank。

公式

PR(v)=1dn+duvPR(u)deg+(u)PR(v) = \frac{1 - d}{n} + d \sum_{u \to v} \frac{PR(u)}{\deg^+(u)}

逐项理解:

  • 1dn\frac{1-d}{n}:随机跳转的”底线概率”——即使没人链接你,你也有 (1d)/n(1-d)/n 的基础 PageRank
  • duvPR(u)deg+(u)d \sum_{u \to v} \frac{PR(u)}{\deg^+(u)}:从所有指向 vv 的节点 uu 继承来的声誉。每个 uu 将自己的 PageRank 均分给它的所有出边指向的页面
  • d=0.85d = 0.85:85% 的时间跟着链接走,15% 的时间随机跳转

迭代计算

PageRank 通过幂迭代(power iteration)计算:

  1. 初始化:PR(0)(v)=1/nPR^{(0)}(v) = 1/n(均匀分布)
  2. 迭代:PR(t+1)(v)=1dn+duvPR(t)(u)deg+(u)PR^{(t+1)}(v) = \frac{1-d}{n} + d \sum_{u \to v} \frac{PR^{(t)}(u)}{\deg^+(u)}
  3. 重复直到收敛(maxvPR(t+1)(v)PR(t)(v)<ϵ\max_v |PR^{(t+1)}(v) - PR^{(t)}(v)| < \epsilon
PageRank 从均匀分布开始,经过几轮迭代收敛到稳态值PageRank 迭代收敛过程PR0.10.20.30.4迭代轮次t=0t=1t=2t=3t=4t=5已收敛A: 0.21B: 0.19C: 0.38D: 0.22均匀初始化: 1/4 = 0.25

从均匀分布开始,经过通常 20-50 轮迭代,PageRank 值就会收敛到稳态。收敛速度取决于阻尼因子 dd——dd 越小收敛越快,但过小会让所有节点的 PageRank 趋于均匀。

矩阵视角

PageRank 的迭代实际上是在计算Google 矩阵

M=(1d)11Tn+dSM = (1-d) \cdot \frac{\mathbf{1}\mathbf{1}^T}{n} + d \cdot S

的主特征向量,其中 SS 是列归一化的邻接矩阵(每列之和为 1)。这就是 PageRank 与 Eigenvector Centrality 的联系:PageRank 是修改后邻接矩阵的特征向量。关于矩阵迭代和谱分析的详细数学,参考 PageRank 的矩阵视角

复杂度

每轮迭代遍历所有边:O(m)O(m)。通常需要 O(log(1/ϵ))O(\log(1/\epsilon)) 轮收敛(与 dd 有关)。

  • 时间O(mT)O(m \cdot T),其中 TT 为迭代轮数(通常 20-50)
  • 空间O(n+m)O(n + m)

Katz Centrality:所有路径加权求和

动机

Eigenvector Centrality 只考虑直接邻居的贡献。Katz Centrality(Katz, 1953)更进一步:考虑所有长度的路径,但短路径权重更大。

定义

CK(v)=k=1uVαk(Ak)uvC_K(v) = \sum_{k=1}^{\infty} \sum_{u \in V} \alpha^k \cdot (A^k)_{uv}

逐项理解:

  • (Ak)uv(A^k)_{uv}:从 uuvv 长度恰好为 kk 的路径数量(邻接矩阵的 kk 次幂)
  • αk\alpha^k:衰减因子——路径越长,贡献越小(0<α<1/λ10 < \alpha < 1/\lambda_1,其中 λ1\lambda_1AA 的最大特征值,保证级数收敛)
  • 对所有节点 uu 和所有路径长度 kk 求和:综合考虑从全网通过各种路径到达 vv 的总”影响力”

向量形式的闭合解:

cK=((IαA)1I)1\mathbf{c}_K = \left((I - \alpha A)^{-1} - I\right) \mathbf{1}

Katz Centrality:所有路径加权求和,短路径权重更大Katz Centrality — 所有路径加权求和ABCDEA 到 E 的所有路径:A→B→C→D→E长度 4 → 权重 α⁴A→D→E长度 2 → 权重 α²Katz 中心性(A→E 的贡献)= α² + α⁴短路径权重大,长路径衰减快(0 < α < 1)

Katz vs Eigenvector Centrality

维度EigenvectorKatz
考虑的路径仅直接邻居(递归传播)所有长度的路径
孤立节点得分为 0得分 > 0(有基础分)
参数衰减因子 α\alpha
收敛条件连通无向图α<1/λ1\alpha < 1/\lambda_1
适用场景无向社交网络有向引用/推荐网络

Katz Centrality 的优势在于:即使没有入边的节点也有正的中心性分值(因为 (IαA)1(I - \alpha A)^{-1} 的对角线元素 > 0)。这在有向图中尤其有用——不会出现”零分”的问题。

复杂度

  • 精确计算(矩阵求逆):O(n3)O(n^3)
  • 迭代近似(类似 PageRank 幂迭代):O(mT)O(m \cdot T)

中心性对比可视化

下面的交互组件在同一张图上展示五种中心性指标的效果。切换指标,观察节点大小和数值如何变化——同一个节点在不同指标下的”重要性”排名可能完全不同。

连接数越多越重要。直觉:认识的人越多,社交面越广。
同一张图上的 Degree CentralityA0.50B0.33C0.33D1.00E0.33F0.33G0.50
各节点数值排名
A
0.50
B
0.33
C
0.33
D
1.00
E
0.33
F
0.33
G
0.50

注意观察:

  • D 在 Degree 和 Betweenness 中都排名靠前——它既有多连接,又控制信息流
  • EigenvectorKatz 的排名可能与 Degree 不同——因为它们考虑了邻居的质量,而非仅仅数量
  • ClosenessBetweenness 的排名也不完全一致——“离所有人近”和”控制信息流”是不同的概念

复杂度对比表

中心性指标时间复杂度(最坏)空间复杂度适用图类型直觉含义
DegreeO(n+m)O(n + m)O(n)O(n)无向/有向连接数最多
Betweenness (Brandes)O(nm)O(nm)O(n+m)O(n + m)无向/有向控制最短路径
ClosenessO(nm)O(nm)O(n+m)O(n + m)连通图到所有人最近
EigenvectorO(mT)O(m \cdot T)O(n+m)O(n + m)无向连通图邻居也重要
PageRankO(mT)O(m \cdot T)O(n+m)O(n + m)有向图重要页面链接你
KatzO(n3)O(n^3) 精确 / O(mT)O(m \cdot T) 迭代O(n2)O(n^2) / O(n+m)O(n + m)任意图所有路径加权

其中 TT 为迭代轮数(通常 20-50),Brandes 算法在加权图上用 Dijkstra 替代 BFS,时间变为 O(nm+n2logn)O(nm + n^2 \log n)

应用场景

社交网络分析

社交网络是中心性分析的经典场景。不同平台关注不同指标:

  • Twitter/X:粉丝数(in-degree)是最直观的影响力指标,但 PageRank 更准确——10 万个僵尸粉不如 100 个活跃大V关注你
  • LinkedIn:Betweenness 对应”人脉桥梁”——连接不同行业圈子的人,猎头价值更高
  • WhatsApp 群组:Closeness 对应消息传播效率——群中最”居中”的人看到消息最快

Web 搜索引擎

Google 最初的成功很大程度上归功于 PageRank。传统搜索引擎按关键词匹配排序,但容易被关键词堆砌欺骗。PageRank 利用 Web 的超链接结构——“重要网页链接的网页也重要”——极大提升了搜索结果的质量。虽然现代搜索引擎已经加入了数百个排名因子,PageRank 仍然是基础信号之一。

生物网络

  • 蛋白质互作网络(PPI):高 degree 和高 betweenness 的蛋白质往往是”必需蛋白质”(essential proteins)——敲除它们会导致细胞死亡。Jeong et al. (2001) 在酵母 PPI 网络中验证了这一点
  • 神经网络(生物):秀丽隐杆线虫的 302 个神经元连接图中,高 betweenness 的神经元对应功能上的”枢纽”(hub neurons)

基础设施网络

电力网格、航空网络、供应链中,高 betweenness 的节点是系统的脆弱点。识别这些节点对于:

  • 韧性分析:哪些节点失效影响最大?
  • 安全防护:优先保护哪些节点?
  • 容量规划:哪些节点需要更大的处理能力?

中心性选型指南

面对一个实际问题,如何选择合适的中心性指标?

根据"重要"的含义选择正确的中心性指标中心性指标选型决策树连接多瓶颈可达性影响力递归所有路径无向有向"重要"指什么?直接连接数?控制信息流?离所有人近?递归声誉?有向图?DegreeBetweennessClosenessEigenvectorPageRankKatz

简单的决策规则:

  1. 你关心的是直接连接数? → Degree(最快,O(n+m)O(n+m)
  2. 你关心的是控制力/瓶颈? → Betweenness(O(nm)O(nm),适合分析信息流控制)
  3. 你关心的是可达性/传播效率? → Closeness(O(nm)O(nm),适合选址/传播分析)
  4. 你关心的是递归声誉/影响力?
    • 无向图 → Eigenvector
    • 有向图 → PageRank
  5. 你关心的是综合可达性(所有路径)? → Katz

如果不确定,先用 Degree(最快)做初步筛选,再用 Betweenness 或 PageRank 做精细排名。

🔁 迭代机器视角PageRankEQ: 方程 / 不动点

PR(v) = (1-d)/N + d Σ_{u→v} PR(u)/out(u)

Graph有向图(Web 图)
State[v]PR(v) 概率分布
SELECT全集(同步迭代)
COMBINEΣ 入边贡献
重入到不动点
TERMINATE收敛(变化 < ε)
求解方法FI

收敛保证:Banach 压缩映射(d < 1)+ Perron-Frobenius(转移矩阵谱间隙)

→ 框架详解:Art. 0A — 图上的通用迭代机器

🔁 迭代机器视角Betweenness Centrality (Brandes)STR: 结构计算

Graph原图
State[v]σ(v) 最短路径数 + δ(v) 依赖值
SELECTBFS(FIFO)+ 反向传播
COMBINEBFS 计算最短路径数 → 反向累加依赖值
求解方法FI

Brandes 算法对每个源节点做 BFS + 反向传播,本质是 N 次 Frontier 迭代

→ 框架详解:Art. 0A — 图上的通用迭代机器

总结

本文建立了图上”重要性”的完整度量体系:

  • Degree CentralityCD(v)=deg(v)/(n1)C_D(v) = \deg(v) / (n-1) — 最简单,只看直接连接
  • Betweenness CentralityCB(v)=svtσst(v)/σstC_B(v) = \sum_{s \neq v \neq t} \sigma_{st}(v) / \sigma_{st} — Brandes 算法 O(nm)O(nm),揭示信息流瓶颈
  • Closeness CentralityCC(v)=(n1)/ud(v,u)C_C(v) = (n-1) / \sum_u d(v,u) — 衡量到所有人的平均距离
  • Eigenvector / PageRank:递归定义——重要的邻居让你更重要。PageRank 通过阻尼因子解决有向图的收敛问题
  • Katz Centrality:所有路径加权求和,αk\alpha^k 让短路径权重更大

没有”最好的”中心性指标——每种指标照亮网络结构的不同侧面。理解它们的区别,选择适合问题语境的指标,是图分析的核心能力。

中心性回答了”谁最重要”,下一个问题是”谁和谁一伙?“——下一篇 Art. 8: 社区发现 将进入 Part 2 的第二个核心话题:在图中找出紧密连接的子群(社区),理解网络的宏观结构。

实现指引

算法函数/方法
Degree CentralityNetworkXnx.degree_centrality(G)
Betweenness CentralityNetworkXnx.betweenness_centrality(G, normalized=True)
Closeness CentralityNetworkXnx.closeness_centrality(G)
Harmonic CentralityNetworkXnx.harmonic_centrality(G)
Eigenvector CentralityNetworkXnx.eigenvector_centrality(G, max_iter=1000)
PageRankNetworkXnx.pagerank(G, alpha=0.85)
Katz CentralityNetworkXnx.katz_centrality(G, alpha=0.1)
Betweenness (近似)NetworkXnx.betweenness_centrality(G, k=100)
PageRankNeo4j GDSgds.pageRank.stream(G)
BetweennessNeo4j GDSgds.betweenness.stream(G)
DegreeNeo4j GDSgds.degree.stream(G)
Eigenvectorscipyscipy.sparse.linalg.eigs(A, k=1)
PageRankigraphg.pagerank(damping=0.85)
Betweennessigraphg.betweenness()