You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于igraph的Louvain聚类分辨率参数遍历与可视化需求

Louvain聚类分辨率参数遍历与优化方案

需求概述

  1. 用igraph包在0.0到2.0范围内,以0.01为步长遍历Louvain聚类的resolution参数,每个参数对应执行一次聚类,记录社群划分结果和模块度值
  2. 修复原有循环代码无法正确遍历目标分辨率范围的问题
  3. 通过绘图分析分辨率与聚类结果的关系,找到最适合的参数值

完整可运行代码

library(igraph)

# 示例数据处理
valores <- c(1, 5, 3, 8, 2, 9, 3, 2, 3 ,2, 5, 3, 6, 5, 1, 5, 3, 4, 2, 2, 5, 6, 5, 7, 1, 2, 
             8, 12, 5, 1, 5, 3, 6, 5, 9, 3,3,4,5,7,8,2,7,8,4,3,1,4,4 )
matrixnet <- matrix(valores, 7, 7)
matcor <- cor(matrixnet, method = "spearman")
cor_pequena <- 0.1
# 过滤低相关性值,构建邻接矩阵
matcor[] <- ifelse(matcor < cor_pequena, 0, matcor)
# 生成无向加权网络
matrixnetwork <- graph.adjacency(matcor, mode = "undirected", 
                                weighted = TRUE, 
                                add.colnames = NULL, diag = FALSE)

# 生成目标分辨率序列:0.0到2.0,步长0.01
res_seq <- seq(from = 0.0, to = 2.0, by = 0.01)
# 初始化结果存储容器
louvain_results <- vector("list", length = length(res_seq))
modularity_vals <- numeric(length(res_seq))
community_counts <- numeric(length(res_seq))

# 循环执行Louvain聚类
for(i in seq_along(res_seq)) {
  # 执行聚类,传入当前分辨率和边权重
  clust <- cluster_louvain(matrixnetwork, 
                          weights = E(matrixnetwork)$weight,
                          resolution = res_seq[i])
  # 保存聚类结果
  louvain_results[[i]] <- clust
  # 计算并保存模块度(直接用聚类结果的modularity方法更简便)
  modularity_vals[i] <- modularity(clust, resolution = res_seq[i])
  # 记录当前分辨率下的社群数量
  community_counts[i] <- length(clust)
}

# 绘制双图对比分辨率与结果的关系
par(mfrow = c(1, 2))
# 分辨率 vs 模块度曲线
plot(res_seq, modularity_vals, type = "l", lwd = 2,
     xlab = "分辨率参数", ylab = "模块度",
     main = "分辨率与模块度的关联")
grid()

# 分辨率 vs 社群数量曲线
plot(res_seq, community_counts, type = "l", lwd = 2, col = "#E63946",
     xlab = "分辨率参数", ylab = "社群数量",
     main = "分辨率与社群数量的关联")
grid()

# 恢复默认绘图布局
par(mfrow = c(1, 1))

原有代码问题修正

原循环代码的核心问题:

  • 仅遍历了10个值(seq.int(10)),且分辨率计算为i + 0.01,完全偏离了「0.0到2.0步长0.01」的要求
  • 聚类时未指定weights参数,浪费了网络的加权信息,可能导致聚类结果不准确

修正措施:

  1. 用seq(from = 0.0, to = 2.0, by = 0.01)生成正确的分辨率序列,共201个参数值
  2. 循环中使用seq_along(res_seq)遍历每个分辨率,确保每个参数都被正确传入聚类函数
  3. 加入weights = E(matrixnetwork)$weight,让聚类考虑边的权重信息
  4. 额外记录社群数量,辅助判断最优分辨率(分辨率越高,社群数量通常越多)

结果分析建议

  • 模块度曲线:模块度越高,代表社群内部连接越紧密、社群间连接越稀疏,划分合理性越强。可以优先选择模块度峰值对应的分辨率
  • 社群数量曲线:结合你的业务需求,比如需要划分成多少个社群,在模块度较高的区间里挑选符合数量要求的分辨率

内容的提问来源于stack exchange,提问作者Ana Paula Castro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:35:05