图结构差异-1-邻域重叠率(Neighborhood Overlap)

邻域重叠率是图论/网络分析中的核心指标,用于衡量两个节点在网络中"共享邻居"的程度,本质是量化节点间的结构相似性。

1.基本原理

对于网络中的两个节点 uuu 和 vvv,邻域重叠率的计算公式为:
Overlap(u,v)=∣N(u)∩N(v)∣∣N(u)∪N(v)∣ \text{Overlap}(u,v) = \frac{|\mathcal{N}(u) \cap \mathcal{N}(v)|}{|\mathcal{N}(u) \cup \mathcal{N}(v)|} Overlap(u,v)=∣N(u)∪N(v)∣∣N(u)∩N(v)∣

其中:

  • N(u)\mathcal{N}(u)N(u) 表示节点 uuu 的直接邻居集合(不包含 uuu 自身);

  • ∣N(u)∩N(v)∣|\mathcal{N}(u) \cap \mathcal{N}(v)|∣N(u)∩N(v)∣ 是 uuu 和 vvv 共同邻居的数量;

  • ∣N(u)∪N(v)∣|\mathcal{N}(u) \cup \mathcal{N}(v)|∣N(u)∪N(v)∣ 是 uuu 和 vvv 所有邻居的并集数量。

  • 取值范围:[0,1][0, 1][0,1];

    • 取值为 1:两个节点的邻居完全相同(结构上高度相似);
    • 取值为 0:两个节点无共同邻居(结构上无相似性);
  • 变体:部分场景会用"交集/最小值(min⁡(∣N(u)∣,∣N(v)∣)\min(|\mathcal{N}(u)|,|\mathcal{N}(v)|)min(∣N(u)∣,∣N(v)∣))"替代分母,称为"Jaccard 相似度"(邻域重叠率是 Jaccard 相似度在节点邻域上的具体应用)。

邻域重叠率越高,说明两个节点在网络中的"结构角色"越相似------比如社交网络中,重叠率高的两个用户可能是同一圈子的人;推荐系统中,可用于挖掘"相似节点"进行推荐。

2.优缺点适用场景

特点 说明
✅ 核心优点 解释性强 :直观反映节点间局部结构相似性; 计算简单 :仅需邻居集合操作,时间复杂度低(O(k),k 为平均度) 无需训练 :属于启发式指标,适用于冷启动场景 可扩展性好 :易于与其他指标(如共同邻居数、Adamic-Adar)结合。
❌ 主要缺点 局部性限制 :只考虑一阶邻居,忽略全局结构; 稀疏图失效 :在高度稀疏图中,多数节点对重叠率为 0,区分度低; 对度敏感 :高连接度节点容易产生虚假高重叠; 不适用于有向图/加权图 :原始定义针对无向无权图,需扩展才能应用。
🛠️ 典型使用场景 链接预测 :在预测图中新可能出现的边时,两个节点具有高重叠邻域,说明它们很可能连接(与其他常见指标如 Jaccard、Adamic-Adar 一起使用)。 局部结构相似性 / 社会网络分析 :衡量朋友之间共同好友数量的相对比例,是社区分析、社交圈分析的基础。 社区检测辅助指标 :在一些重叠社区发现算法中,需要衡量边的局部重叠性来解释结构。 图结构特征提取:作为图机器学习输入特征,为 GNN 或分类算法提供结构相似性特征(例如在链接预测任务中)。

3.框架选型

框架 是否支持邻域重叠率 特点
NetworkX ✅ 原生支持(jaccard_coefficient 等) 简单易用,适合中小规模图;纯 Python,速度较慢
igraph(python-igraph) ⚠️ 需手动实现 C++ 后端,性能好;API 略复杂
graph-tool ⚠️ 需手动实现 基于 C++/Boost,性能极佳;安装困难(非 pip)
PyTorch Geometric / DGL ❌ 不直接提供 用于 GNN,需自定义计算

4.使用

(1)NetworkX(最易用,适合新手)

NetworkX 是Python原生的图分析库,内置邻域重叠率(Jaccard 相似度)的直接实现,无需手动计算交集/并集。

python 复制代码
import networkx as nx

# 1. 构建示例网络
G = nx.karate_club_graph()  # 空手道俱乐部网络(经典测试数据)

# 2. 计算两个节点的邻域重叠率(节点0和节点1)
overlap = nx.jaccard_coefficient(G, [(0, 1)])  # 返回生成器
# 提取结果:(节点u, 节点v, 邻域重叠率)
u, v, overlap_value = next(overlap)
print(f"节点{u}和{v}的邻域重叠率:{overlap_value:.4f}")

# 3. 批量计算所有节点对的邻域重叠率
all_overlaps = dict(nx.jaccard_coefficient(G))
# 示例:获取节点0和节点2的重叠率
print(f"节点0和2的邻域重叠率:{all_overlaps[(0, 2)]:.4f}")
(2)python-igraph(高性能,适合大规模网络)

igraph 是C语言底层实现的图库,速度远快于NetworkX,适合处理十万/百万级节点的网络,邻域重叠率需通过"邻居集合"手动计算(或调用内置相似度函数)。

python 复制代码
import igraph as ig

# 1. 构建示例网络
g = ig.Graph.Famous("Zachary")  # 空手道俱乐部网络(等价于nx.karate_club_graph)

# 2. 计算节点0和1的邻域重叠率
# 获取邻居集合
neighbors_0 = set(g.neighbors(0))
neighbors_1 = set(g.neighbors(1))
# 计算交集和并集
intersection = len(neighbors_0 & neighbors_1)
union = len(neighbors_0 | neighbors_1)
# 邻域重叠率
overlap_value = intersection / union if union != 0 else 0.0
print(f"节点0和1的邻域重叠率:{overlap_value:.4f}")

# 3. 内置函数(更高效)
# similarity_jaccard 直接返回邻域重叠率(Jaccard)
overlap_value = g.similarity_jaccard(pairs=[(0, 1)])[0]
print(f"内置函数计算结果:{overlap_value:.4f}")
(3)PyTorch Geometric(面向深度学习,适合图神经网络场景)

PyG 是深度学习框架,主要用于图神经网络(GNN),无直接的"邻域重叠率"API,但可通过张量操作实现,适合需要将重叠率作为GNN特征的场景。

python 复制代码
import torch
from torch_geometric.datasets import KarateClub
from torch_geometric.utils import to_networkx

# 1. 加载数据
dataset = KarateClub()
data = dataset[0]  # 空手道俱乐部网络(PyG格式)

# 2. 转换为NetworkX(复用已有实现)
G = to_networkx(data, to_undirected=True)
# 计算邻域重叠率(同NetworkX方法)
overlap = nx.jaccard_coefficient(G, [(0, 1)])
u, v, overlap_value = next(overlap)
print(f"PyG+NetworkX计算结果:{overlap_value:.4f}")
相关推荐
NAGNIP5 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab6 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab6 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP10 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年10 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼10 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS10 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区11 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈11 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang12 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx