如何在python - networkx包中找到基于边缘密度和权重的网络簇

时间:2017-01-01 09:36:45

标签: python cluster-analysis networkx hierarchical-clustering

我使用python包构建了一个网络 - networkx,每个边都有一个权重,表示两个节点在相关性方面的接近程度。

如果有一个内置算法可以返回一个聚簇图,将每个节点分配给它的簇ID(1到k),那将是理想的。

如果能够根据边缘的重量进行聚类,那就更好了,但并不重要......

知道如何做到这一点?

2 个答案:

答案 0 :(得分:2)

您可能希望查看包python-louvain。有了它,您可以使用函数best_partition检测图表中的社区。从功能描述:

  

计算最大化的节点的分区   使用Louvain heuristices的模块化(或尝试..)

     

这是最高模块性的分区,即最高分区   由Louvain算法生成的树形图。

在我的示例中,我计算了karate_club_graph的社区。 (请注意,即使我的图表没有加权边缘,我也会将best_partitionweight关键字一起使用 - 我只是展示了如何在您的情况下使用该函数。)

import networkx as nx
import community

G = nx.karate_club_graph()
p = community.best_partition(G, weight='weight')
print(p)

输出:

{0: 0, 1: 0, 2: 0, 3: 0, 4: 1, 5: 1, 6: 1, 7: 0, 8: 2, 9: 0, 10: 1, 11: 0, 12: 0, 13: 0, 14: 2, 15: 2, 16: 1, 17: 0, 18: 2, 19: 0, 20: 2, 21: 0, 22: 2, 23: 3, 24: 3, 25: 3, 26: 2, 27: 3, 28: 3, 29: 2, 30: 2, 31: 3, 32: 2, 33: 2}

输出是字典(key = node,value = partition)。分区从0到k-1。如果你需要它们从1到k,你可以将字典值提高到+1。

for k, v in p.items():
    p[k] = v + 1

答案 1 :(得分:0)

这可以帮助networkx.algorithms.community.label_propagation.asyn_lpa_communities

根据文档

返回由异步标签传播检测到的 G 中的社区。 边的权重用于确定标签在节点的邻居中出现的频率。