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 转账”如果被当作无向边处理,会丢失资金流向的关键模式,导致模型无法识别“金字塔式”传销结构。
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 节点以上闭环即告警 |
2.5 图论概念在 GraphSAGE 中的映射
理解上述图论基础后,可以清晰地看到它们如何支撑 GraphSAGE 的计算流程:
- 邻接矩阵 → 决定每个节点的邻居集合,是采样步骤的输入。
- 有向/无向 → 影响聚合函数是否区分方向(如使用双向聚合或单向聚合)。
- 边权重 → 可作为聚合时的注意力系数或加权因子,增强重要邻居的贡献。
- 度 → 高度节点在采样时可能被截断(固定采样数 K),避免计算爆炸。
- 连通分量 → 团伙识别本质上是在每个连通分量内进行节点分类或异常检测。