2. 图论基础:图的定义、节点与边、有向图与无向图、度与邻接矩阵

图论是图神经网络(GNN)的数学基石。在团伙识别场景中,我们将每个实体(如账户、设备、IP)抽象为节点,将实体之间的关联(如转账、同设备登录、同IP)抽象为边。理解图的基本概念,是后续构建GraphSAGE模型的前提。

2.1 图的定义

一个图 G 由两个集合构成:G = (V, E)。其中:

  • V(Vertex Set):节点集合,每个节点代表一个实体。
  • E(Edge Set):边集合,每条边代表两个实体之间存在某种关系。

例如,在金融反欺诈团伙识别中:

  • V = {账户A, 账户B, 账户C, 设备X, 设备Y}
  • E = {(A→B), (A→C), (B→C), (A→X), (C→Y)}
💡 实战提示: 在团伙识别项目中,节点通常包含特征向量(如交易金额均值、登录频次),边可以携带权重(如转账次数)或类型(如“亲属关系”“设备共享”)。这些信息将作为GraphSAGE的输入。

2.2 节点与边

元素 符号 描述 团伙识别示例
节点 v ∈ V 图中的基本实体 银行账户、手机号、设备ID、IP地址
边 e = (u, v) ∈ E 节点之间的连接关系 转账交易、同设备登录、同IP注册
节点特征 xv 附着在节点上的属性向量 交易金额、注册时长、设备型号编码
边特征 euv 附着在边上的属性向量 转账金额、时间戳、关系类型

2.3 有向图与无向图

根据边是否具有方向性,图分为两种基本类型:

  • 无向图(Undirected Graph):边没有方向,表示对称关系。例如“设备共享”关系——如果账户A和设备X共享,那么设备X也必然与账户A共享。
  • 有向图(Directed Graph):边具有方向,表示非对称关系。例如“转账”关系——A向B转账,并不代表B向A转账。
📊 团伙识别中的选择: 大多数团伙识别场景使用无向图或双向有向图。例如,将“A转账给B”视为一条无向边,可以捕获资金往来关系;但如果需要区分资金流向(如洗钱场景),则必须使用有向图。
有向图与无向图对比 有向图 vs 无向图 无向图(对称关系) A B C 有向图(非对称关系) A B C 无向图:边无箭头,关系对称(如设备共享) 有向图:边带箭头,关系非对称(如转账方向)

2.4 度(Degree)

节点的度是衡量其连接数量的重要指标:

  • 无向图:节点 v 的度 d(v) = 与 v 相连的边的数量。
  • 有向图:分为入度(in-degree)和出度(out-degree)。
    • 入度 din(v) = 指向 v 的边的数量。
    • 出度 dout(v) = 从 v 出发的边的数量。
⚠️ 团伙识别关键点: 在欺诈团伙中,核心节点的度往往异常高(如一个设备关联数百个账户),而普通节点的度通常较低。度分布是团伙检测的重要统计特征之一。

2.5 邻接矩阵(Adjacency Matrix)

邻接矩阵是图的代数表示,它将图结构转化为矩阵形式,便于计算机处理和数学运算。

对于一个包含 n 个节点的图,邻接矩阵 A 是一个 n × n 的方阵:

  • 无向图:如果节点 i 和 j 之间有边,则 Aij = Aji = 1;否则为 0。矩阵是对称的。
  • 有向图:如果存在从 i 指向 j 的边,则 Aij = 1;否则为 0。矩阵不一定对称。
  • 加权图:Aij 可以取边的权重值(如转账金额),而非仅 0/1。
邻接矩阵与图结构对应关系 邻接矩阵与图结构对应关系 图结构(无向图) 1 2 3 4 邻接矩阵 A 1 2 3 4 1 2 3 4 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 邻接矩阵 A 中,Aij = 1 表示节点 i 与节点 j 之间有边相连 无向图的邻接矩阵是对称矩阵(Aij = Aji)

2.6 实战:用Python构建图与邻接矩阵

在Python中,我们通常使用 NetworkX 库来构建和操作图结构。以下是一个简单的示例:

import networkx as nx
import numpy as np

# 1. 创建一个无向图
G = nx.Graph()

# 2. 添加节点
G.add_nodes_from([1, 2, 3, 4])

# 3. 添加边
G.add_edges_from([(1, 2), (1, 3), (2, 4), (3, 4)])

# 4. 获取邻接矩阵(返回NumPy数组)
adj_matrix = nx.to_numpy_array(G, nodelist=sorted(G.nodes()))
print("邻接矩阵:\n", adj_matrix)

# 5. 计算每个节点的度
degrees = dict(G.degree())
print("节点度:", degrees)

# 输出:
# 邻接矩阵:
#  [[0. 1. 1. 0.]
#  [1. 0. 0. 1.]
#  [1. 0. 0. 1.]
#  [0. 1. 1. 0.]]
# 节点度: {1: 2, 2: 2, 3: 2, 4: 2}
🔧 实战扩展: 在团伙识别项目中,我们通常使用 nx.from_pandas_edgelist() 从CSV文件直接构建图。例如,从交易记录表(sender, receiver, amount)中构建有向加权图,边的权重为交易总金额。

2.7 本章小结

概念 定义 团伙识别意义
图 G = (V, E),节点与边的集合 将实体与关系建模为图结构
节点 图中的实体 账户、设备、IP等
边 实体间的关联 转账、登录、注册等
度 节点的连接数量 识别核心节点(高团伙嫌疑)
邻接矩阵 图的矩阵表示 作为GNN的输入特征之一