谈到社区发现算法,不得不提 infoMap。infoMap 思想新颖,速度快,在业界已有广泛的应用。本文简单介绍 infoMap 的原理,然后实验亲测与 Louvain 分群效果对比。
1)infoMap 原理
介绍原理之前,先说明两个直觉上的常识:1. 图中连接紧密的节点直觉上更容易认为是群; 2. 图中随机游走时,若节点间转换的概率一样,则随机游走在群内停留时间更长。基于以上两个常识,infomap 将分群巧妙地转化为最小随机游走编码长度问题。
随机游走首先形成的是节点序列,然后各个节点需要通过编码来区分。最简单的编码是二进制编码 ,比如图中四个节点,则编码分别为"00", "01", "10", "11"。由于图中各节点连接的边数量不同,随机游走序列中某些节点出现次数多,某些少。高级点的编码采用 HuffMan 编码,出现次数多的靠近 huffman 树根编码长度短,这样可以缩小整个序列的编码长度。infoMap 的想法是将每个节点的编码分为两个部分模块码和节点码,模块码用于区分图中不同的群,节点码用于区分相同模块内不同节点。不同模块节点的模块码不同,但节点码可能相同。如下图所示:
如图上所示,随机游走序列相邻节点处于同一个群内的以群号开头,退出码结尾。随机游走序列长度由两部分决定,1模块编码以及长度,2模块内节点编码以及长度。群分的过多,则群编码长度增大,群分的过少,则节点编码长度增大。infomap 目标是寻找一个平衡点,将以上两部分长度和最小。编码长度的量化公式如下:
公式详解可以参见论文原文https://www.mapequation.org/assets/publications/EurPhysJ2010Rosvall.pdf或者https://zhuanlan.zhihu.com/p/53085574,个人觉得讲得很详细了。
2)实验亲测
数据规模:节点7亿+, 边22亿+。目标节点~1000万。目标节点是我们业务感兴趣的用户节点。结果如下
可以看到 infoMap 分群后群更少,但大部分群内节点数量都较小,群内节点数量比较平均。Louvain 分群虽然群多,但群内节点数量差异较大,最大节点数量远高于 infomap。我们业务用于信用评估和反欺诈, 实际看到 Louvain 分到的大群逾期率也较高,比较贴和我们业务目标。
从业务目标看,在图规模较大后,基于模块度的分群效果更好。