python networkx中的图形模块化

时间:2015-04-27 13:32:23

标签: python graph networkx modularity

我在python lib NetorwkX中创建了一个图形,我想实现一个模块化算法,以便对我的图形节点进行聚类。我遇到了以下代码:

import community
import matplotlib.pyplot as plt
import networkx as nx

G = nx.Graph()

G = nx.read_weighted_edgelist('graphs/fashionGraph_1.edgelist')
nx.transitivity(G)

# Find modularity
part = community.best_partition(G)
mod = community.modularity(part,G)

# Plot, color nodes using community structure
values = [part.get(node) for node in G.nodes()]
nx.draw_spring(G, cmap=plt.get_cmap('jet'), node_color = values, node_size=30, with_labels=False)
plt.show()

我的图表有4267和3692个边缘。结果图是这样的:

enter image description here

我对图的节点是如何聚类有点困惑。这正是颜色的逻辑?

2 个答案:

答案 0 :(得分:4)

来自documentation

  

节点颜色。可以是单个颜色格式的字符串,也可以是与nodelist具有相同长度的一系列颜色。如果指定了数值,则使用cmap和vmin,vmax参数将它们映射到颜色。有关详细信息,请参阅matplotlib.scatter。

while为每个节点分配一个社区 - part = community.best_partition(G)是一个dict,part是该节点所属的社区(每个都分配了一个整数)。稍后part[node]会按照节点在values = [part.get(node) for node in G.nodes()]中显示的顺序为每个节点创建一个包含社区编号的列表。

然后在绘图命令中,它将使用这些社区编号来确定节点的颜色。已分配给同一社区的所有节点将被赋予相同的颜色。

节点的物理位置由弹簧布局指定。您可以看到,弹簧布局似乎将节点置于一些位置,这些位置表明某些社区与G.nodes()找到的不同。这或许有点令人惊讶,但肯定没有什么能阻止它。它确实让我觉得您使用的算法没有适当地考虑网络中的所有结构。 community.best_partition的{​​{3}}给出了基础算法的一些解释。

答案 1 :(得分:1)

粗略地说,节点被分组到社区中,从而优化了社区内部连接与社区间连接的比率(模块化度量)。

来自wikipedia的模块化的精确定义:

  

如果边缘随机分布,则模块性是指在给定组内的边缘的分数减去预期的这样的分数。模块化的值在[-1 / 2,1)范围内。如果组内边缘的数量超过基于偶然性的预期数量,则为正。对于网络顶点到某些模块的给定划分,模块化反映了模块内边缘的集中度,与所有节点之间链路的随机分布相比,无论模块如何。

社区包实现的算法使用迭代过程找到近似解决方案(与社区分离),迭代过程在开始时将每个节点定义为社区并保持合并它们直到模块化得到优化。

更准确的信息可以在描述算法的论文中找到:

在大型网络中快速展开社区。 VD Blondel,JL Guillaume,R Lambiotte,E Lefebvre 统计力学杂志:理论与实验2008(10),P10008

(我能够从https://pypi.python.org/pypi/python-louvain

检索并安装在Windows上