我正在尝试理解 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做错了什么?
最佳答案
为什么您认为最佳簇数应该是 3?在我看来,所有节点彼此之间都有相当强的连接(它们的权重为 50),除了连接较弱的两个小组之外。请注意,igraph 中的聚类方法期望权重表示相似性,而不是距离。另请注意,igraph 中的大多数聚类算法对于有向网络都没有明确定义(其中一些甚至简单地拒绝有向网络)。
就其值(value)而言,wl.optimal_count
只是计算所谓的模块化度量(请参阅 Graph
的 modularity()
方法)类),然后选择模块性最高的簇计数。只有一个集群的模块化为零(根据定义,这就是该措施的工作原理)。三个集群的模块化程度约为 -0.0083,因此 igraph 只选择一个集群而不是三个集群是正确的:
>>> wl.as_clustering(3).modularity
-0.00829996846600007
>>> wl.as_clustering(1).modularity
0.0
关于python - 为什么optimal_count没有给出正确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28349966/