2. 图论基础回顾:图的定义与核心概念

在深入 GraphSAGE 团伙识别实战之前,必须牢固掌握图论的基本语言。图(Graph)是描述实体之间关系的通用数学结构,也是图神经网络(GNN)处理的数据载体。本节将系统回顾图的定义、分类、存储方式以及关键统计量,为后续的邻域采样与消息传递机制打下基础。

2.1 图的定义:节点、边与邻接矩阵

一个图 G 由两个集合构成:节点集合 V(Vertex / Node)和边集合 E(Edge)。节点代表实体(如用户、账号、设备),边代表实体之间的关联(如转账、好友、同 IP)。

  • 节点(Node):图中最小的独立单元,通常用 v ∈ V 表示。在团伙识别场景中,一个节点可以是一个银行账户、一个手机号或一个社交账号。
  • 边(Edge):连接两个节点的关系线,通常用 e = (u, v) ∈ E 表示。边可以携带方向、权重或类型标签。
  • 邻接矩阵(Adjacency Matrix):用矩阵 A 表示图结构,其中 A[i][j] = 1 表示节点 i 与节点 j 之间存在边,否则为 0。对于无向图,矩阵是对称的;对于有向图,则不一定对称。
团伙识别视角: 邻接矩阵是 GNN 计算邻域聚合的“路由表”。GraphSAGE 通过邻接矩阵快速定位每个节点的邻居集合,从而进行采样和特征融合。

下表总结了图的基本组成要素及其在团伙识别中的映射:

图要素 数学符号 团伙识别实例 说明
节点 v ∈ V 银行账户、设备指纹、IP 地址 每个节点可携带特征向量(如交易金额、注册时间)
边 e = (u, v) 转账交易、同设备登录、同 IP 注册 边可表示资金流向或行为关联
邻接矩阵 A ∈ {0,1}n×n 账户间交易矩阵 稀疏矩阵,n 为节点总数
节点特征 X ∈ ℝn×d 交易频次、余额、设备型号 d 维特征向量,输入 GNN 的原始信号
代码示例: 使用 NetworkX 构建一个简单的无向图并提取邻接矩阵。
import networkx as nx
import numpy as np

# 创建图
G = nx.Graph()
G.add_nodes_from([1, 2, 3, 4])
G.add_edges_from([(1, 2), (1, 3), (2, 4), (3, 4)])

# 获取邻接矩阵(稠密形式)
adj_matrix = nx.to_numpy_array(G, nodelist=sorted(G.nodes()))
print("邻接矩阵:\n", adj_matrix)

# 输出:
# [[0. 1. 1. 0.]
#  [1. 0. 0. 1.]
#  [1. 0. 0. 1.]
#  [0. 1. 1. 0.]]

2.2 有向图与无向图

根据边是否具有方向性,图分为有向图和无向图。这一区分在团伙识别中至关重要,因为资金流向、信息传递往往具有明确方向。

  • 无向图(Undirected Graph):边 (u, v) 与 (v, u) 等价,表示双向关系。例如“共同设备登录”关系——如果 A 和 B 在同一设备登录,则关系是对称的。
  • 有向图(Directed Graph / Digraph):边 (u → v) 具有方向性,表示从 u 指向 v 的单向关系。例如“转账交易”——A 向 B 转账 100 元,不能默认 B 也向 A 转账。

下表对比了两种图在团伙识别中的典型应用:

图类型 邻接矩阵对称性 团伙识别场景 GraphSAGE 处理差异
无向图 对称 共用设备、同 IP、同地址 邻居采样不分方向,聚合对称信息
有向图 非对称 资金转账、邀请注册、消息发送 需区分入邻域和出邻域,可分别聚合
实战注意: 在构建团伙识别图时,不要默认将所有关系视为无向。例如“A 向 B 转账”如果被当作无向边处理,会丢失资金流向的关键模式,导致模型无法识别“金字塔式”传销结构。
有向图 vs 无向图(团伙识别场景) 无向图:共用设备 账户A 账户B 设备X 共用 共用 有向图:转账交易 账户A 账户B 账户C 转账100元 转账50元 转账200元 无向图适用于“共用/关联”关系;有向图适用于“流向/传递”关系,是资金链分析的基础

2.3 加权图

加权图(Weighted Graph)为每条边赋予一个数值权重,用于表示关系的强度、成本或容量。在团伙识别中,权重可以编码交易金额、交互频次、时间衰减因子等关键信息。

  • 定义:加权图可表示为 G = (V, E, W),其中 W: E → ℝ 为每条边分配一个实数值权重。
  • 邻接矩阵扩展:加权邻接矩阵中 A[i][j] = w(权重值),而非简单的 0/1。
  • 团伙识别意义:高权重边可能暗示异常资金往来(如短时间内多笔大额转账),低权重边可能代表正常社交互动。
加权邻接矩阵示例: 假设 3 个账户之间的转账金额(单位:元)。
import numpy as np

# 加权邻接矩阵:A[i][j] = 从 i 到 j 的转账金额
weighted_adj = np.array([
    [0,   1000, 0],
    [0,   0,    500],
    [200, 0,    0]
])

print("加权邻接矩阵(转账金额):\n", weighted_adj)
# 输出:
# [[   0 1000    0]
#  [   0    0  500]
#  [ 200    0    0]]

2.4 度与连通分量

度(Degree)和连通分量(Connected Component)是描述图结构全局属性的基础统计量,直接用于评估团伙的规模与紧密程度。

2.4.1 度(Degree)

  • 无向图:节点 v 的度 deg(v) 等于与 v 相连的边的数量。
  • 有向图:分为入度(In-degree)和出度(Out-degree)。入度是指向 v 的边数,出度是从 v 出发的边数。
  • 团伙识别应用:高入度节点可能是“资金汇集账户”(洗钱池),高出度节点可能是“分发账户”(金字塔上层)。

2.4.2 连通分量(Connected Component)

连通分量是图的最大连通子图。在无向图中,如果两个节点之间存在路径,则它们属于同一连通分量。在有向图中,分为弱连通分量(忽略方向后的连通性)和强连通分量(双向可达)。

下表总结了度与连通分量在团伙识别中的典型用法:

概念 计算公式 团伙识别含义 示例阈值
节点度 deg(v) = Σ A[v][:] 交易对手数量;高度节点可能是核心成员 deg > 50 标记为可疑
入度 indeg(v) = Σ A[:][v] 收款方集中度;高入度暗示资金归集 indeg > 30 触发预警
出度 outdeg(v) = Σ A[v][:] 付款方分散度;高出度暗示资金分发 outdeg > 40 需人工复核
连通分量大小 分量内节点数 团伙规模;大分量可能对应大型犯罪网络 分量 > 100 节点重点监控
强连通分量 双向可达节点集 资金闭环;循环交易可能为洗钱通道 存在 3 节点以上闭环即告警
连通分量与度分布示意 两个连通分量(团伙 A 与团伙 B) v1 v2 v3 团伙A (3节点) v4 v5 v6 v7 团伙B (4节点) 节点度分布(示例) v1:2 v2:4 v4:3 v5:5 v7:1 度值 5 3 1 连通分量划分团伙边界;度分布识别团伙核心节点(高度节点)与边缘节点(低度节点)

2.5 图论概念在 GraphSAGE 中的映射

理解上述图论基础后,可以清晰地看到它们如何支撑 GraphSAGE 的计算流程:

  • 邻接矩阵 → 决定每个节点的邻居集合,是采样步骤的输入。
  • 有向/无向 → 影响聚合函数是否区分方向(如使用双向聚合或单向聚合)。
  • 边权重 → 可作为聚合时的注意力系数或加权因子,增强重要邻居的贡献。
  • 度 → 高度节点在采样时可能被截断(固定采样数 K),避免计算爆炸。
  • 连通分量 → 团伙识别本质上是在每个连通分量内进行节点分类或异常检测。