igraph重叠社区聚类clique.community函数参数k的含义与输入要求
igraph重叠社区聚类函数
clique.community的k参数说明 该自定义函数实现的是经典的派系过滤(CPM)重叠社区检测算法,函数代码如下:
clique.community <- function(graph, k) { clq <- cliques(graph, min=k, max=k) edges <- c() for (i in seq_along(clq)) { for (j in seq_along(clq)) { if ( length(unique(c(clq[[i]], clq[[j]]))) == k+1 ) { edges <- c(edges, c(i,j)-1) } } } clq.graph <- simplify(graph(edges)) V(clq.graph)$name <- seq_len(vcount(clq.graph)) comps <- decompose.graph(clq.graph) lapply(comps, function(x) { unique(unlist(clq[ V(x)$name ])) }) }
参数核心作用
k是CPM算法的核心阈值,定义了构建社区的基础单元规模:
- 函数运行第一步会提取网络中所有大小恰好为
k的完全子图(即k-派系:子图内任意两个节点都存在直接连边) - 后续连通判断规则为:两个k-派系如果共享
k-1个公共节点(代码中判断两个派系合并后总节点数为k+1,和“共享k-1个节点”完全等价),就判定为连通,所有互相连通的k-派系最终聚合为一个社区。这种聚合方式允许节点同时归属多个社区,实现重叠聚类的效果。
合理取值范围
- 取值下限:最小为3。如果取k=2,对应的2-派系就是网络中的普通边,算法最终会把整个连通分量识别为单个社区,和直接计算网络连通子图的结果没有区别,完全失去社区划分的意义。
- 取值上限:不能超过输入网络中存在的最大派系的节点数。如果k设置得比网络里最大完全子图的规模还大,第一步提取k-派系就会返回空结果,无法得到有效社区划分。
- 经验取值:实际分析中常用取值区间为3~6。k取值越小,识别出的社区规模越大、社区间节点重叠度越高;k取值越大,识别出的社区内部连接越紧密、规模越小,更偏向识别网络中连接高度稠密的核心群组。使用时可以结合研究场景、社区划分效果指标灵活调整。
输入类型要求
k必须传入单个正整数,不能传入向量、小数、字符串等其他类型值,否则底层调用的cliques()函数会直接抛出错误。
补充说明:函数的第一个参数graph必须是igraph包构建的网络对象,邻接矩阵、边列表等常见网络数据格式需要先转为igraph对象才能传入运行。
测试示例
可以用如下随机生成的小世界网络快速测试函数运行效果:
library(igraph) # 生成包含50个节点的小世界测试网络 test_net <- sample_smallworld(dim = 1, size = 50, nei = 3, p = 0.1) # 设置k=3运行重叠社区检测 community_res <- clique.community(test_net, k = 3) # 输出识别到的社区总数 length(community_res)
内容的提问来源于stack exchange,提问作者user13822027
相关产品推荐
相关产品推荐

