加权图模块化计算的正确方法及igraph社区划分相关问题
1. 两次模块化值差异巨大的原因
核心是cutat参数使用错误:steps参数代表层次分裂过程中执行的分裂步数,不是你想要得到的最终社区数量。edge.betweenness.community属于自顶向下的分裂式层次聚类:初始状态所有节点同属1个社区,每执行1次分裂,社区总数加1。如果你要得到和默认输出一致的97个社区,应该调用cutat(g.communities, no = 97),此时得到的成员向量和g.communities$membership完全一致,计算得到的模块化值也会匹配0.977的结果。
你使用steps=97相当于仅执行了97次分裂,仅得到98个社区,这个阶段的分裂还远未到最优划分阶段,所以得到的模块化值极低,0.0094就是这个不成熟划分的计算结果。
2. 能否用该函数确定最优聚类数
边介数社区检测本身就会自动返回模块化值最高的划分作为默认结果,你调用得到的g.communities$membership对应的就是整个分裂过程中模块化值达到峰值的划分结果,不需要手动调整参数就能直接拿到最优聚类数。
你观察到steps参数越大模块化值持续上升,是因为你测试的还处于分裂前期模块化值上升的阶段,直到达到峰值后才会随着过度分裂导致模块化值下降,你可以继续加大steps值直到接近总节点数,就能观察到先升后降的完整趋势。
3. g.communities$modularity的含义
这个向量存储的是每一步分裂完成后,当前全局划分对应的整体模块化值,长度等于分裂总步数+1,每一个数值对应一个划分的全局得分,和单个顶点没有任何关系,不能解释为顶点与其所属模块的相关性。你可以直接取这个向量的最大值对应的索引,就是最优划分对应的分裂步数,默认返回的社区划分就是这个最大值对应的结果。
内容的提问来源于stack exchange,提问作者pridu

