我使用python包构建了一个网络 - networkx,每个边都有一个权重,表示两个节点在相关性方面的接近程度。
如果有一个内置算法可以返回一个聚簇图,将每个节点分配给它的簇ID(1到k),那将是理想的。
如果能够根据边缘的重量进行聚类,那就更好了,但并不重要......
知道如何做到这一点?
答案 0 :(得分:2)
您可能希望查看包python-louvain。有了它,您可以使用函数best_partition
检测图表中的社区。从功能描述:
计算最大化的节点的分区 使用Louvain heuristices的模块化(或尝试..)
这是最高模块性的分区,即最高分区 由Louvain算法生成的树形图。
在我的示例中,我计算了karate_club_graph
的社区。 (请注意,即使我的图表没有加权边缘,我也会将best_partition
与weight
关键字一起使用 - 我只是展示了如何在您的情况下使用该函数。)
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 中的社区。 边的权重用于确定标签在节点的邻居中出现的频率。