igraph模块化计算差异解析:2021年10月前后的不同表现
igraph中两种模块化计算结果差异的成因
在igraph中使用cluster_fast_greedy算法对空手道网络(karate)聚类得到结果karfg时,直接调用modularity(karfg)得到模块化值0.4345215,而使用已弃用的modularity(kar, membership(karfg))得到值0.3990796。这种差异并非fastgreedy算法特有,其他社区检测方法也存在该问题。
代码示例
library(igraph) library(igraphdata) data(karate) kar <- karate karfg <- cluster_fast_greedy(karate) modularity(kar, membership(karfg)) # 输出:0.3990796 modularity(karfg) # 输出:0.4345215
差异成因
- 算法内置信息的利用不同:
cluster_fast_greedy这类社区检测算法在运行过程中,会记录层次聚类的中间状态数据(比如每一步合并社区时的权重、边贡献信息)。直接调用modularity(karfg)时,函数会复用这些算法内部存储的专属数据来计算模块化;而弃用的modularity(kar, membership(karfg))只基于最终的社区成员划分结果,用通用模块化公式重新计算,完全没用到算法运行时的中间信息,计算基础不一样,结果自然有差。 - 计算逻辑的适配性差异:igraph中针对
communities类型对象的modularity方法,是和对应的社区检测算法绑定设计的,计算逻辑会匹配算法的核心逻辑(比如fastgreedy是基于模块化增量最大化来合并社区,计算时会沿用这个逻辑的计数、权重处理方式);而全局modularity函数是通用版本,不管你用什么算法得到的社区划分,都套用同一套标准公式,两者的处理细节不同,导致数值偏差。 - 无向边的计数方式不同:空手道网络是无向图,
cluster_fast_greedy内部可能将每条无向边当作两条单向边来统计社区内部的边数;而全局modularity函数是按无向边的标准规则统计(每条边只算一次),这种计数方式的差异也会造成模块化值的不同。
内容的提问来源于stack exchange,提问作者Gesine Reinert
相关产品推荐
相关产品推荐

