Louvain算法是一种高效的基于模块度优化的聚类算法,它采用层次聚类的思想,通过不断合并节点来构建社区结构。算法首先将每个节点作为一个单独的社区,然后迭代地将节点移动到能使模块度增加最大的邻居社区中,直到模块度不再增加。Louvain 算法具有计算速度快、可扩展性好等优点,在大规模社会网络分析中得到了广泛应用。

代码:

import networkx as nx
import igraph as ig
import matplotlib.pyplot as plt
import random
import matplotlib.colors as mcolors

# 设置随机种子
random_seed = 42
random.seed(random_seed)

# 随机生成一个包含 50 个以上节点的网络
num_nodes = random.randint(51, 100)
G = nx.erdos_renyi_graph(num_nodes, 0.1, seed=random_seed)

# 将 NetworkX 图转换为 igraph 图
igG = ig.Graph.from_networkx(G)

# 使用 Louvain 算法进行聚类分析
partition = igG.community_multilevel()

# 统计聚类的数量
num_clusters = len(set(partition.membership))

# 确保聚类分为 4 - 5 类,如果不在这个范围,可以重新生成网络
while num_clusters < 4 or num_clusters > 5:
    num_nodes = random.randint(51, 100)
    G = nx.erdos_renyi_graph(num_nodes, 0.1, seed=random_seed)
    igG = ig.Graph.from_networkx(G)
    partition = igG.community_multilevel()
    num_clusters = len(set(partition.membership))

# 定义冷色系颜色列表
cold_colors = ['#6495ED', '#778899', '#B0C4DE', '#ADD8E6', '#87CEEB']

# 为每个节点分配颜色
node_colors = []
for node in range(len(G.nodes())):
    cluster_id = partition.membership[node]
    rgba = mcolors.to_rgba(cold_colors[cluster_id], alpha=0.5)
    node_colors.append(rgba)

# 节点位置
pos = nx.spring_layout(G, seed=random_seed)

# 绘制节点
nx.draw_networkx_nodes(G, pos, node_color=node_colors, edgecolors='black', node_size=200)

# 绘制边
nx.draw_networkx_edges(G, pos, edge_color='black', alpha=0.3)

# 显示图形
plt.title('Network Clustering using Louvain Algorithm')
plt.axis('off')
plt.show()

代码说明:

图的生成:使用 networkx 生成一个 Erdős - Rényi 随机图。

图的转换:将 networkx 图对象 G 转换为 igraph 图对象 igG,因为 igraph 提供了 Louvain 聚类算法的实现。

聚类分析:使用 igG.community_multilevel() 方法进行 Louvain 聚类,该方法返回一个聚类结果对象。

聚类数量调整:如果聚类数量不在 4 到 5 之间,重新生成图并再次进行聚类。

颜色分配:根据节点所属的聚类类别为每个节点分配冷色系颜色,并设置透明度为 0.5。

可视化:使用 networkx 的绘图函数绘制节点和边,最后使用 matplotlib 显示图形。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐