我正在尝试理解python-igraph,特别是community_walktrap函数。我创建了以下示例:
import numpy as np
import igraph
mat = np.zeros((200,200)) + 50
mat[20:30,20:30] = 2
mat[80:90,80:90] = 2
g = igraph.Graph.Weighted_Adjacency(mat.tolist(),
mode=igraph.ADJ_DIRECTED)
wl = g.community_walktrap(weights=g.es['weight'])
我会假设社区的最佳数量为3,但正在运行
print wl.optimal_count
给我1.如果我强制将树形图切割为3 wl.as_clustering(3)
,我会得到一个正确的会员列表。我对Optimal_count做错了什么?
答案 0 :(得分:1)
为什么您认为最佳群集数应为3?在我看来,所有节点之间都有相当强的连接(它们的权重为50),除了连接较弱的两个小组。请注意,igraph中的聚类方法期望权重表示相似度,而不是距离。另请注意,igraph中的大多数聚类算法都没有为定向网络定义良好(其中一些甚至只是拒绝定向网络)。
对于它的价值,wl.optimal_count
只需计算所谓的模块化度量(请参阅modularity()
类的Graph
方法),然后选择群集计数模块化程度最高。只有一个集群的模块化为零(这是测量按定义工作的方式)。具有三个簇的模块化大约为-0.0083,因此igraph只选择一个簇而不是三个:
>>> wl.as_clustering(3).modularity
-0.00829996846600007
>>> wl.as_clustering(1).modularity
0.0