LINKRADAR / REAL NETWORK STUDY

关键节点观察台

用全图介数识别中转位置,再用结构失效实验检验排名。

✓ 全节点 NetworkX 对照通过无权 · 无向 · 精确 Brandes原始匿名 ID

谁在连接网络?

默认按全图介数降序。高介数表示最短路径的中转作用,不等于真实人物的重要性。

RANKING

全图介数 Top 10

下载 CSV ↗

标准无向归一化:raw / ((n−1)(n−2)/2)。排名不包含端点贡献。

NODE LENS

节点参数

点击左侧柱条、下方表格或局部图节点,即可检查原始指标。

EXPLANATORY SUBGRAPH

把排名放回连接结构

介数 Top10 选取的邻居拖动平移 · 滚轮缩放 · 点击检查

AUDITABLE RECORDS

节点排名与参数

全部节点 CSV ↗
排名原始 ID度数度排名raw 介数归一化介数分量大小割点

删除这些节点,结构会怎样?

所有策略使用原图固定排名。随机曲线来自20个独立可复现排列,阴影为10%–90%经验分位范围。

FIXED-RANK REMOVAL

最大连通分量的变化

分母固定为原始 n

原图不连通时初始值可以小于1;经验分位带不是置信区间。该模拟不预测现实行为。

度数与中转作用

全图度数与介数散点图

散点使用当前所选网络的完整原图,标注介数前十节点;坐标使用对称对数尺度。切换上方网络即可查看另一张图。

结果如何计算,性能如何解释?

Python运行完整算法,浏览器展示已有结果。页面切换与筛选不会重新执行全图介数。

相邻区组复测

首轮真实图计时记录

模式实际进程重复total 中位数 / ssteady 中位数 / s观察 S_total

total 包含启动、计算通信归并、归一化及清理;steady 排除启动和清理。不同亲和性协议的记录不混合。

来源与指标说明

介数
统计不包含该节点作为端点的最短路径比例;全起点计算,不是抽样近似。
度数
直接相连的邻居数量,与最短路径中转作用不同。
割点
在完整原图中单独删除该节点,会增加连通分量数量;不是现实故障概率。
局部网络
确定性选取介数前十及其部分邻居,最多120个节点。仅用于解释,未重算局部分数;布局距离不表示地理或实际路径距离。
匿名数据
Facebook为采样自我网络合并图;ca-GrQc为作者合作图。原始ID无法在本项目中对应真实身份。
UNDERSTAND THE COMPUTATION

从一条最短路径,读懂整个项目

先看小图,再读公式。这里解释真实结果使用的定义;交互例子只计算五个教学节点,不会重跑两张真实网络。

我们要算什么?介数中心性

衡量节点承担多少最短路径中转份额的指标。

我们怎样把它算出来?Brandes算法

正向统计路径数量,再反向累计贡献的计算方法。

01 / MODEL & CENTRALITY

把“谁和谁相连”写成数学问题

无权 · 无向 · 简单图

图记为 G = (V, E):V是节点集合,E是连接集合,n = |V|,m = |E|。每条边长度为1,可以双向走;清洗时去掉自环与重复边,保留所有已知节点和连通分量。

度数:直接连接多少邻居

deg(v)=|N(v)|,d¯=2mn

N(v)是v的邻居集合。平均度为2m/n,因为一条无向边分别给两端各贡献1度;n=0时另作零值处理。

介数:最短路的中转份额

Craw(v)=∑{s,t}⊆V∖{v}s≠t,σst>0σst(v)σst

s、t是不同端点;σst是两者之间最短路径的条数,σst(v)是其中以v为内部中转点的条数。每组无序端点只算一次;不可达时整项按0处理,不做0/0。

归一化:除以可能的端点对数量

Cnorm(v)=Craw(v)(n−1)(n−2)/2n > 2

除去v,还剩n−1个节点,能组成(n−1)(n−2)/2组无序端点对。n≤2时分数为0。非连通图仍使用原始全图n;归一化不会改变同一张图内的排名。

度数、介数和割点回答不同问题。Facebook的58号只有12个邻居,但介数排第9;高介数表示拓扑中转作用,不是现实人物价值。

02 / TRY A SHORTEST-PATH SHARE

两条一样短的路,贡献怎么分?

五节点教学图

橙色边覆盖当前全部最短路径;绿色节点是端点,深色外圈是观察节点。也可以直接点击节点。

THIS PAIR'S CONTRIBUTION

单个端点对的贡献,不等于该节点的全图介数。

看这张五节点图的完整答案

把全部10组无序端点对都检查一遍;每个节点排除以自身为端点的4组。归一化分母为(5−1)(5−2)/2 = 6。下表由这个教学图的路径份额累计得到。

节点度数raw介数归一化介数

S的raw为0.5,A、B各为1,T为3.5,U为0;与Python中的五节点手算测试一致。T的3.5 = S↔U的1 + A↔U的1 + B↔U的1 + A↔B的0.5。

03 / BRANDES, STEP BY STEP

不枚举所有完整路径,怎样算得更快?

每个节点都作为起点
1

从起点s向外BFS

像水波一样按距离扩展,记录最短距离dist、路径数σ和所有最短路径前驱P。等长路径都保留,不只挑其中一条。

2

从远到近回传贡献

按照BFS访问顺序逆序处理,利用路径数比例,把远处节点的贡献分配给前驱。δ表示固定起点下的累计依赖。

3

覆盖所有起点后汇总

重复上述过程n次,排除起点本身的端点贡献。无向图两个方向重复计数,最终统一除以2,再归一化。

为什么不逐条列出所有路径?S到U的最短路可复用“S到T的最短路再接一条T—U”的结构。大图的等长路径可能很多,Brandes只保存计数与前驱,再合并回传贡献。上面的五节点路径枚举仅用于教学展示。

FOLLOW ONE SOURCE: s = S

固定S为起点,跟着数值走一遍

本演示固定起点S,与上方端点对选择无关。d是距离,σ是路径数,P是前驱;δ是该起点的累计依赖,不是最终全图介数。

节点距离 d路径数 σ前驱 P当前 δS本源最终写入分数
正向从近到远 · 反向从远到近
展开看路径计数与依赖递推公式

先数最短路径

σs(w)=∑v∈Ps(w)σs(v)

σs(s)=1;其余节点初始为0。Ps(w)只包含满足dists(w)=dists(v)+1的邻居;不可达节点不进入反向累计。

再回传依赖

δs(v)+=σs(v)σs(w)(1+δs(w))

对每个v∈Ps(w)执行;“+=”表示累加而非覆盖。“1”代表目标w自身的份额,δs(w)代表经w继续到更远目标的份额。路径数比值负责公平分摊;最后只在v≠s时把δs(v)加入分数。

全起点时间写作O(n(n+m));连通无权图常简写为O(nm)。每个进程需要O(n+m)量级的图与单源工作空间。这是复杂度描述,不是实际秒数保证。本项目σ使用Python整数,贡献与归并使用float64;“精确”指全起点,而非任意精度算术。

源码对应:brandes.py中的single_source_accumulate与finalize_scores。NetworkX是独立正确性参照,实际串并行分数均由本项目同一内核计算。

04 / PARALLEL SOURCES

三种方法,改变的是哪一层?

分起点任务 · 每进程读完整图

固定一个起点的计算不依赖其他起点的中间结果,所以可以分工;同一次单源计算内部,BFS与逆序累计依然有先后依赖。

serial

一个接一个

一个计算进程遍历所有起点,贡献直接累加到同一个向量。

批0批1批2批3
static_batches

提前固定分工

按batch_id % p分配。下例p=2:进程0做批0、2,进程1做批1、3;空闲时不会改领另一进程的批次。

P0:0 → 2P1:1 → 3
dynamic_batches

空闲就领下一批

同样的批次放进公共队列;哪个进程先空闲,哪个取下一批。可减少等待,也会增加队列管理开销。

公共队列 → 空闲进程

上面的批次条是分工原理示意,不是计时或CPU利用率。若有8个起点、B=2,则4批依次为[0,1]、[2,3]、[4,5]、[6,7]。

每进程局部累计,主进程最终归并

Lj(v)=∑s∈Sj∖{v}δs(v);Craw(v)=12∑j=0p−1Lj(v)

Sj是进程j负责的起点集合;集合之间不重叠,合起来覆盖所有节点。每个局部向量长度都是n,各进程结束时回传一次总向量;主进程归并后统一做无向修正和归一化。

p是计算工作进程数,B是每批起点数,重复次数是整次算法重跑几遍,三者不同。p=1的分批版本仍使用一个工作进程,约1.065的观察比值不能解释为多核收益。比较静态与动态,应固定同一图、p、B和日志设置。
想核验实际发生的分工?

Facebook配对复测的一个p=4、B=128案例中,四个历史PID分别处理1024、1024、967、1024个起点,合计4039个起点、32批。每个起点和批次都检查不重不漏。

spawn创建独立进程,每进程获得完整邻接表副本;本项目没有共享内存零复制。PID与计数说明实际分工,不能代替逐时CPU利用率证据。真实图正式主计时没有逐批时间线。

05 / CONNECTIVITY UNDER REMOVAL

LCC:删掉节点后,最大一块还剩多大?

Largest Connected Component

能沿边互相到达的一组节点叫连通分量。节点数最多的分量就是LCC(最大连通分量);“LCC大小”是这个集合的节点数。

k=⌊qn⌋,rk=kn,L(k)=|LCC(Gk)|n

Gk是删除排名前k个节点后的剩余图,q是请求移除比例,rk是实际比例。纵轴分母固定为原图节点数n,不是n−k;若没有剩余节点,LCC大小按0计。

假设原图100节点,删除20节点后分成60和20两个群体,LCC/n = 60/100 = 0.6;若除以剩余80节点,会变成另一个指标0.75。本项目主曲线使用前者。

介数、度数和随机策略都从原图开始,使用原图固定排名,不每删一次重排。随机结果来自20个独立可复现排列,阴影是10%–90%经验分位范围,不是置信区间。相同移除比例下LCC/n越低,说明该策略造成的连通性破坏越强;不能推广成现实人员价值或故障预测。

06 / READ THE EXPERIMENT TABLE

加速、效率、误差,各在比较什么?

同一图 · 同一内核

总加速比与并行效率

Stotal=median(Tserial,total)median(Tp,total),E=Stotalp

ca-GrQc的dynamic(p=4):16.252 / 6.479 ≈ 2.509倍,效率约2.509 / 4 = 62.7%。效率是加速比相对进程数的比值,不是CPU利用率。这里用展示表的四舍五入值作读表示例。

全节点容差比较

|a−b|≤atol+rtol·|b|

atol控制接近0的绝对误差,rtol随对照值大小缩放。实际全节点检查覆盖raw和normalized,并检查有限值;真实图参照使用atol=10⁻⁸、rtol=10⁻⁷。浮点归并顺序不同可能产生末位差异。

字段本项目具体含义
total完整算法调用墙钟,包含工作进程启动、计算通信归并、最终缩放、清理及必要调度开销;不包含下载、清洗、NetworkX参照和画图。
steadyexecute_reduce + finalize,排除启动与清理。steady加速与total加速必须分别标注。
重复 / median相同条件整次重跑,汇总中位数,而非挑最快一次。“重复3次”不是3个进程,也不是只算3个起点。
观察比值与协议Facebook首轮单工作进程也出现异常快值,不能据该轮四进程比值声称可靠多核加速;固定亲和性的后续配对复测单独统计。

启动、通信、任务不均和系统调度都会影响结果,四个工作进程不保证四倍加速。固定四个逻辑CPU也不等于已确认四个物理核心。

07 / GLOSSARY

相关名词,随时查一下

节点 / 原始ID / 索引对外编号与计算位置

节点是网络位置。原始ID保留输入编号,index是升序映射后的连续数组位置。例如ca-GrQc原始ID13801对应索引2714,展示与CSV仍使用13801。

边与度数 deg(v)直接相连的关系和数量

边记录连接,邻居是与v直接相连的节点。简单无向图中deg(v)=|N(v)|;直接连接多,不代表一定承担更多跨群体最短路。

无权、无向、简单图本项目的建模假设

每条边长度为1、可双向走,不保留自环或重复无向边。关系强弱、方向、现实传播概率不在这个模型里。

最短路径 / σ边数最少,且可能不止一条

σst是s到t的最短路径条数。σst(v)只数内部经过v的那些路径;一半最短路经过v,该端点对就贡献1/2。

介数 BC / raw / normalized中转份额与标准缩放

raw累加不含自身端点的最短路份额;normalized再除以(n−1)(n−2)/2。本项目不抽样起点,也不把匿名分数解释为个人贡献。

连通分量 CC内部可以互相到达的一组节点

不同分量之间没有路径。孤立点自己也构成一个分量。ca-GrQc保留了全部355个分量,不只计算最大分量。

LCC 最大连通分量节点最多的那一块

LCC大小是最大分量的节点数;LCC/n是它占原图节点总数的比例。原图本就不连通时,零删除的起点也可能小于1。

割点 articulation point删掉一个点会增加分量数

在完整图中单独删除v后,连通分量数比删除前更多,v就是割点。高介数节点可以不是割点,例如Facebook的1085号。

单源 / BFS固定一个起点逐层向外找

单源指固定s。无权图中BFS按距离0、1、2……扩展,建立最短距离与路径计数;全起点Brandes要让每个节点都做一次s。

最短路径前驱 P走向目标之前的上一站

Ps(w)包含所有与w相邻、且比w离s近一步的节点。必须保留全部等长最短路前驱,不是只记一棵搜索树。

依赖 δ固定起点下,回传的中转贡献

δs(v)累计从s到其他目标的最短路经过v的份额。逆序处理能复用远端结果;v=s时不加入其自身分数。

批次 / B / 粒度一次派发多少个起点

B=128表示一批最多128个起点,不是128个进程。最后一批可以较短。小批便于调度,大批减少队列开销,不能预设越小越好。

进程 / p / PID / spawn独立执行与实际身份

p计计算工作进程数,PID是操作系统分配的身份编号。spawn启动新解释器;每个进程读取完整图副本并保有自己的分数向量。

局部累计 / 归并 reduce先各算各的,再逐项相加

每个进程只累计所负责起点的贡献,但向量覆盖所有n个节点。主进程相加这些向量,最终统一除以2和归一化。

固定排名失效 / 随机分位带原图排一次,逐步删节点

介数与度排序以原图为准,删除后不重排。随机阴影描述20个独立排列的10%–90%经验分位,不是置信区间或真实用户流失率。

精确 / float64 / allclose全起点,允许舍入误差

精确表示没有抽样起点。路径数用Python整数,贡献使用float64;不同求和顺序可能影响末位,所以检查所有节点是否在预先声明容差内一致。