风控图算法之社群发现算法(小数据集Python版)
在风险控制领域,图算法扮演着日益重要的角色。(这方面的资料有很多,不再赘述)
图算法在风控场景的应用
图分析方法在业务风控中的应用
特别是社群发现算法,它通过揭示数据间的复杂网络结构,帮助我们识别潜在的风险模式和欺诈行为。从社交网络中的群体行为分析到金融市场的异常交易检测,社群发现算法以其独特的视角,为我们提供了理解和预测风险的新方法。本文将简单介绍几种常用的社群发现算法及其实现代码,主要是针对小数据集的Python版本,后续将更新针对大数据的基于SparkGraphX的实现方案。
文章目录
- 风控图算法之社群发现算法(小数据集Python版)
- 一、强连通分量/弱连通分量
- 二、Louvain
- 三、LPA
- 四、Leading Eigenvector(主导特征向量算法)
- 五、Leiden Algorithm(莱顿算法)
- 六、Walktrap Algorithm (漫步陷阱算法)
- 七、Spectral Clustering (谱聚类算法)
- 八、GN算法
一、强连通分量/弱连通分量
强连通分量(SCC)的原理:
强连通分量是指在有向图中,对于分量内的任意两个顶点,都存在从一个顶点到另一个顶点的有向路径。换句话说,每个顶点都可以直接或间接地影响分量中的其他顶点。
SCC特点:
每个分量内部的顶点都是相互连通的。
如果分量中的一个顶点发生变化,这种变化可以通过路径传播到分量中的所有其他顶点。
弱连通分量(WCC)的原理:
弱连通分量是指在无向图中,对于分量内的任意两个顶点,都存在一条连接它们的无向路径。弱连通分量关注的是顶点之间的可达性,而不考虑路径的方向。
WCC特点:
每个分量内部的顶点在无向图中是相互可达的。
弱连通分量不考虑路径的方向,因此它们在无向图中识别相互连接的顶点集合。
二、Louvain
Louvain算法是一种流行的社区发现算法,用于在图中检测社区结构。它是一种基于贪心优化的模块度最大化方法,特别适用于大型图的社区划分。
Louvain算法原理
# pip install python-louvain
import networkx as nx
import community as community_louvain
# 建图流程参考连通分量中的写法,但多个权重列
# 构建图
G = nx.Graph()
# 添加节点和边
for index, row in data.iterrows():
G.add_edge(row['src'], row['dest'], weights=row['weights'])
# 调整分辨率系数,默认为1,越大越倾向于划分出比较小的分区
partition = community_louvain.best_partition(G, weight='weights', random_state=21, resolution=1)
上面实现的是最为传统的Louvain实现方案,即模块度优化策略,实际应用中往往会对其进行改造,如修改模块度计算公式以期其能够更加符合实际需求。腾讯金融就曾将模块度改为模块密度,使得其划分的社群更加精细。
三、LPA
图算法中的标签传播算法(Label Propagation Algorithm, LPA)是一种基于图的社区发现方法,其核心原理是利用节点之间的标签传播来识别图中的社区结构。
LPA算法的原理:
- 初始化:为图中的每个节点分配一个唯一的标签,这些标签通常是一个整数或一个特定的标识符。
- 迭代传播:在迭代过程中,每个节点会检查其邻居节点的标签。节点更新自己的标签为邻居节点中最常见的- 标签。如果一个节点有多个邻居拥有相同的最常见标签,它会随机选择其中一个标签。
- 收敛条件:当在一次迭代中没有节点改变自己的标签时,算法达到收敛,即社区结构稳定下来。
- 社区识别:最终,拥有相同标签的节点被认为属于同一个社区。
LPA原理和连通分量类似,但是相比连通分量,多了一个“少数服从多数”的过程,并且可以结合权重进行计算。
四、Leading Eigenvector(主导特征向量算法)
在图算法中,Leading Eigenvector算法(也称为最大特征向量算法)是一种基于图谱理论的社区发现方法。这种算法的核心思想是通过分析图的邻接矩阵或拉普拉斯矩阵的特征向量来揭示图中的社区结构。(复杂度较高,在数据量较大的场景下其实用的较少)
Leading Eigenvector算法的原理:
- 模块度矩阵:算法首先定义了一个模块度矩阵(Modularity Matrix),该矩阵用于衡量社区划分的质量。模块度矩阵通常是基于图的邻接矩阵计算得到的。
- 特征值分解:接着,算法对模块度矩阵进行特征值分解,以找到其最大正特征值对应的特征向量。这个特征向量被称为Leading Eigenvector。
- 社区划分:根据Leading Eigenvector的特征值,可以将图中的节点划分为不同的社区。节点的归属通常由特征向量中的元素正负来决定,正负不同的元素可以表示属于不同的社区。
- 层次聚类:Leading Eigenvector算法可以用于层次聚类,通过重复上述过程,每次将一个社区压缩为一个节点,然后对新生成的图再次应用算法,从而揭示更高层次的社区结构。
五、Leiden Algorithm(莱顿算法)
Leiden算法是一种先进的社区发现算法,专为解决大规模网络中的社区划分问题而设计。它基于模块度优化的概念,但与Louvain算法等传统算法相比,Leiden算法提供了几个关键的改进和优势,特别是在风控领域的社群发现中。
Leiden算法的原理:
- 局部智能移动(Local Smart Move, LSM):Leiden算法通过局部智能移动来加速搜索过程。与传统的Louvain算法不同,Leiden算法只对已修改节点的邻居进行下一次迭代,从而进行了有效的剪枝。
- 保证社区连通性:Leiden算法确保了社区内部的节点是连通的,解决了Louvain算法中可能出现的“badly connected”问题,即社区内部节点不连通但可以通过外部节点作为桥梁连通的问题。
- 分辨率参数(Resolution Parameter, gamma):Leiden算法支持分辨率参数,允许用户控制社区的数量和大小。当gamma值较大时,倾向于生成更多的小社区;而较小的gamma值则倾向于生成数量较少的大社区。(分辨率参数其实在gephi和networkx实现的Louvain算也已经支持,本质就是修改模块度计算公式,多乘以一个分辨率参数)
三阶段迭代过程:Leiden算法包括三个阶段:局部节点移动、分区细化和基于细化分区的网络聚合。这个过程迭代进行,直到收敛。
优化模块度:Leiden算法优化模块度,即社区内部连接的密度与随机网络模型相比的超出程度。算法的目标是最大化模块度,从而得到更紧密的社区结构。
整体来看,Leiden算法和Louvain算法类似,但计算效率要优于Louvain算法,并且相比Louvain,倾向于划分出更加紧密的社群结构。
本文中提到的所有算法涉及的代码见(如果可以,麻烦关注一下~)风控图算法之社群发现算法(小数据集Python版)
六、Walktrap Algorithm (漫步陷阱算法)
Walktrap算法是一种基于随机游走的社区发现方法,由Pons和Latapy于2005年提出。
- Walktrap算法基于随机游走的概念,通过随机游走的相似性来识别社区结构。
- 它首先对网络进行随机游走,然后基于游走结果计算节点间的相似度,并使用这些相似度进行层次聚类。
- Walktrap算法在最坏情况下的时间复杂度是O(mn2),空间复杂度是O(n2),在大多数情况下是O(n^2log n)时间和O(n^2)空间,其中m是边的数量,n是节点的数量。
Walktrap算法关键点:
-
随机游走:算法通过在网络中执行随机游走来识别社区。在随机游走过程中,游走者在每一步都会从当前节点移动到一个随机选择的邻居节点。
-
转移矩阵:随机游走由网络的转移矩阵(transition matrix)P驱动,该矩阵可以从网络的邻接矩阵A中得到。转移矩阵的元素Pij表示从节点i到节点j的转移概率。
-
相似性度量:Walktrap算法定义了一种基于随机游走的顶点之间相似性的度量,称为“®”度量。这个度量方法计算效率高,能够很好地捕捉社区结构的信息。
-
社区结构识别:通过计算节点对之间的相似性,算法可以识别出密集连接的子图,即社区。相似性较高的节点对更有可能属于同一个社区。
-
层次聚类:Walktrap算法使用层次聚类方法,通过合并相似性最高的节点对来逐步构建社区结构,并形成树状图(dendrogram)表示的分层社区结构。
-
模块度优化:算法通过优化模块度(modularity)来评估图划分成社区的质量,模块度是社区内部连接密度与随机网络模型相比的超出程度。
Walktrap相比Louvain在具有明显社区结构的网络上表现更好,同时社群划分的也更加精细,更倾向于划分出较小的社群,但同时在大数据量下计算效率也较差。
本文中提到的所有算法涉及的代码见(如果可以,麻烦关注一下~)风控图算法之社群发现算法(小数据集Python版)
七、Spectral Clustering (谱聚类算法)
谱聚类(Spectral Clustering)是一种基于图谱理论的社区发现算法,它利用图的特征向量和特征值来识别社区结构。谱聚类的核心思想是通过图的拉普拉斯矩阵(Laplacian Matrix)进行特征分解,进而实现数据的聚类。
谱聚类算法的原理
本文中提到的所有算法涉及的代码见(如果可以,麻烦关注一下~)风控图算法之社群发现算法(小数据集Python版)
八、GN算法
Girvan-Newman (GN) 算法是一种基于边介数中心性的社群发现算法,由 Michelle Girvan 和 Mark Newman 于2002年提出。该算法的主要思想是识别并移除连接不同社群的“桥梁”边,这些边的介数较高。通过不断移除这些边,图逐渐分解成多个社群。
GN算法原理
本文中提到的所有算法涉及的代码见(如果可以,麻烦关注一下~)风控图算法之社群发现算法(小数据集Python版)