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,反映平均每个实体连接多少其他实体。
  • 度分布:欺诈网络常呈重尾分布,少数账户连接大量账户,是可疑枢纽。
  • 连通分量:彼此可达的节点集合,孤立分量往往对应独立团伙。
  • 聚类系数:邻居之间也相互连接的程度,团伙内部通常聚类系数偏高。
  • 平均路径长度:任意两点间最短路径的平均值,衡量资金穿透的难易。
在欺诈团伙识别中,连通分量和聚类系数尤其重要:一个连通分量可能就是一个资金闭环团伙,而高聚类系数区域往往是关系紧密的可疑社区。

四、案例与场景:从交易流水到图

假设我们拿到一张转账流水表,包含付款方、收款方、金额、时间。构建图的基本流程如下:

  1. 确定节点:将付款方与收款方去重合并为账户节点集合。
  2. 确定边:每一笔转账生成一条有向边,方向由付款方指向收款方。
  3. 确定权重:以金额或交易次数作为边权,必要时做对数平滑。
  4. 选择存储结构:大规模稀疏网络使用邻接表或边列表。
  5. 计算统计指标:节点数、边数、度分布、连通分量,初步观察网络形态。

例如,若发现某个连通分量包含 12 个账户、平均度较高且聚类系数接近 0.8,同时存在一个度极高的中心账户,这往往提示一个以该账户为核心的转账团伙。此时再进入 Louvain 社区发现,就能把大分量进一步切分为更细的社区。

常见误区:直接把所有关系都建成无向无权图。这样会丢失方向与金额信息,导致 Louvain 划分出的社区虽然结构上合理,却无法解释资金流向,也难以支撑后续的风险定性。

五、复盘与检查清单

在进入社区发现之前,建议用以下清单检查图数据是否可用:

  • 节点是否已统一 ID,避免同一实体因格式不同被拆成多个节点。
  • 边是否区分方向,权重是否已定义并处理异常值。
  • 是否移除了自环与重复边,或明确保留它们的业务含义。
  • 是否统计了节点数、边数、平均度、连通分量等基础指标。
  • 是否确认网络为稀疏图,并选择了合适的存储结构。

图论基础看似简单,但它决定了后续 Louvain 算法的输入质量。节点与边定义得越准确,权重设计得越贴合业务,社区发现的结果就越接近真实的欺诈团伙结构。