2. 图论与网络基础
在欺诈团伙识别中,我们面对的不是一条条孤立的交易记录,而是一张张彼此关联的关系网络:账户之间转账、设备与账号共用、手机号与银行卡绑定、IP 与登录行为关联。要把这些关系交给 Louvain 这类社区发现算法处理,第一步必须把业务数据抽象成图论意义上的“图”。本章聚焦图的基本概念与常用表示方法,为后续的社区划分打下数据结构和统计指标基础。
一、核心原理:图、节点与边
图(Graph)由两个集合构成:节点集合 V 与边集合 E,记作 G=(V,E)。在反欺诈场景中,节点通常代表实体,边代表实体之间的关系。理解图的关键在于明确“谁是节点、什么是边、边有没有方向、边有没有权重”。
- 节点(Vertex/Node):账户、用户、设备、IP、银行卡、商户等实体。
- 边(Edge):转账、登录、共用设备、绑定关系等交互。
- 度(Degree):与某节点直接相连的边数,反映该实体的活跃程度。
- 路径(Path):节点间依次相连的边序列,是资金链路追踪的基础。
根据边的性质,图可分为无向图与有向图。无向图的边没有方向,例如“共用同一设备”是双向关系;有向图的边带方向,例如“A 向 B 转账”与“B 向 A 转账”含义不同。若边上附加数值,则成为加权图,权重可表示转账金额、交易次数、关系强度或风险评分。
二、图的表示:邻接矩阵与邻接表
图在计算机中主要有两种存储方式。邻接矩阵用二维数组 A 表示,A[i][j] 表示节点 i 与 j 之间是否存在边或边的权重;邻接表则为每个节点维护一个邻居列表,只存储实际存在的边。
| 对比维度 | 邻接矩阵 | 邻接表 |
|---|---|---|
| 空间复杂度 | O(V²),稀疏图浪费大 | O(V+E),适合稀疏图 |
| 判断两点是否相邻 | O(1),直接查表 | O(deg),需遍历邻居 |
| 遍历某点全部邻居 | O(V),需扫描整行 | O(deg),效率高 |
| 适用场景 | 稠密图、小规模矩阵运算 | 欺诈网络等大规模稀疏图 |
真实反欺诈网络通常高度稀疏:一个账户可能只与几十个账户发生关系,而全网账户数可达千万级。因此工程中普遍采用邻接表或边列表。下面用 Python 字典演示邻接表的构建:
# 邻接表:节点 -> {邻居: 权重}
graph = {
"A": {"B": 5000, "C": 1200},
"B": {"A": 5000, "D": 800},
"C": {"A": 1200, "D": 300},
"D": {"B": 800, "C": 300, "E": 20000},
"E": {"D": 20000}
}
# 统计每个节点的度
for node, neighbors in graph.items():
print(node, "degree =", len(neighbors))
若使用 NetworkX,可直接从边列表构建图并计算指标:
import networkx as nx
G = nx.Graph()
G.add_weighted_edges_from([
("A", "B", 5000),
("A", "C", 1200),
("B", "D", 800),
("C", "D", 300),
("D", "E", 20000),
])
print("节点数:", G.number_of_nodes())
print("边数:", G.number_of_edges())
print("D的度:", G.degree("D"))
print("D的加权度:", G.degree("D", weight="weight"))
三、网络的基本统计指标
把图建好后,需要用统计指标快速判断网络形态,这些指标也是后续社区划分效果评估的参照。
- 节点数 N 与边数 M:网络规模与关系密度,是最基础的描述。
- 平均度:2M/N,反映平均每个实体连接多少其他实体。
- 度分布:欺诈网络常呈重尾分布,少数账户连接大量账户,是可疑枢纽。
- 连通分量:彼此可达的节点集合,孤立分量往往对应独立团伙。
- 聚类系数:邻居之间也相互连接的程度,团伙内部通常聚类系数偏高。
- 平均路径长度:任意两点间最短路径的平均值,衡量资金穿透的难易。
四、案例与场景:从交易流水到图
假设我们拿到一张转账流水表,包含付款方、收款方、金额、时间。构建图的基本流程如下:
- 确定节点:将付款方与收款方去重合并为账户节点集合。
- 确定边:每一笔转账生成一条有向边,方向由付款方指向收款方。
- 确定权重:以金额或交易次数作为边权,必要时做对数平滑。
- 选择存储结构:大规模稀疏网络使用邻接表或边列表。
- 计算统计指标:节点数、边数、度分布、连通分量,初步观察网络形态。
例如,若发现某个连通分量包含 12 个账户、平均度较高且聚类系数接近 0.8,同时存在一个度极高的中心账户,这往往提示一个以该账户为核心的转账团伙。此时再进入 Louvain 社区发现,就能把大分量进一步切分为更细的社区。
五、复盘与检查清单
在进入社区发现之前,建议用以下清单检查图数据是否可用:
- 节点是否已统一 ID,避免同一实体因格式不同被拆成多个节点。
- 边是否区分方向,权重是否已定义并处理异常值。
- 是否移除了自环与重复边,或明确保留它们的业务含义。
- 是否统计了节点数、边数、平均度、连通分量等基础指标。
- 是否确认网络为稀疏图,并选择了合适的存储结构。
图论基础看似简单,但它决定了后续 Louvain 算法的输入质量。节点与边定义得越准确,权重设计得越贴合业务,社区发现的结果就越接近真实的欺诈团伙结构。