R语言igraph如何循环累积删除顶点逐次执行聚类分析
问题描述
- 现有igraph网络对象
test_FINAL,需按顺序累积移除指定顶点集合:vertex <- c(1, 3, 7, 9, 10) - 迭代规则:每次移除顶点后执行聚类分析,第一轮仅移除1号顶点,第二轮移除1、3号顶点,后续依次新增移除7、9、10号顶点,直到全部指定顶点移除完成后跑完最后一次聚类
- 现有代码仅实现了「未删点的初始网络」「移除全部顶点的最终网络」两个状态的聚类统计(含聚类数量、群落规模、模块度计算),需要循环方案覆盖所有中间迭代场景
现有实现代码
# Library library(igraph) # Create data set.seed(1) data <- matrix(sample(0:1, 100, replace=TRUE, prob=c(0.8,0.2)), nc=10) network <- graph_from_adjacency_matrix(data , mode='undirected', diag=F ) # Default network par(mar=c(0,0,0,0)) plot(network) vertex <- c(1, 3, 7, 9, 10) # Estimating cluster statistics *prior to* removing vertices pre_cluster <- cluster_fast_greedy(network) length(pre_cluster); sizes(pre_cluster); modularity(pre_cluster) # removing vertices final_graph <- delete_vertices(network, c(vertex)) cluster_graph <- cluster_fast_greedy(final_graph) # Estimating cluster statistics *after* removing vertices length(cluster_graph); sizes(cluster_graph); modularity(cluster_graph)
最优循环实现方案
核心逻辑是按待删除顶点的顺序逐轮累加删除集合,每轮删点后立刻执行聚类计算,把所有轮次的结果统一存入结构化列表,方便后续调取分析,没有冗余计算。
# 加载igraph依赖 library(igraph) # -------------------------- # 实际使用时替换成你自己的网络和待删顶点即可 # -------------------------- set.seed(1) data <- matrix(sample(0:1, 100, replace=TRUE, prob=c(0.8,0.2)), nc=10) network <- graph_from_adjacency_matrix(data , mode='undirected', diag=F ) vertex <- c(1, 3, 7, 9, 10) # 初始化结果存储列表,先存入未删任何顶点的初始状态结果 cluster_results <- list( list( removed = c(), cluster = cluster_fast_greedy(network), cluster_num = length(cluster_fast_greedy(network)), cluster_sizes = sizes(cluster_fast_greedy(network)), mod = modularity(cluster_fast_greedy(network)) ) ) # 逐轮累积删点计算 for (i in seq_along(vertex)) { # 当前轮次需要删除的顶点集合:前i个指定顶点 del_vertex <- vertex[1:i] # 生成当前轮次的子网络 current_net <- delete_vertices(network, del_vertex) # 执行聚类 current_cluster <- cluster_fast_greedy(current_net) # 存入结果列表 cluster_results[[i+1]] <- list( removed = del_vertex, cluster = current_cluster, cluster_num = length(current_cluster), cluster_sizes = sizes(current_cluster), mod = modularity(current_cluster) ) } # 结果调取示例 # 查看第2轮(删除1、3两个顶点)的模块度 cluster_results[[3]]$mod # 查看最终轮次(删完全部指定顶点)的群落规模 cluster_results[[length(cluster_results)]]$cluster_sizes
方案说明
- 完全匹配需求的累积删点逻辑,不会出现顶点删除顺序错误、漏删的问题
- 所有轮次的聚类对象、统计指标都结构化存储,后续做指标对比、群落可视化可以直接索引,不需要重复计算
- 扩展性强,如果需要更换聚类算法(比如Louvain、Walktrap),只需要把代码里的
cluster_fast_greedy替换成对应的igraph聚类函数即可;如果要新增统计指标,直接在结果存储的列表里加对应字段就行。
内容的提问来源于stack exchange,提问作者Susheel Busi
相关产品推荐
相关产品推荐

