如何使用 python 在 networkx 中查找不同的组?

How to find different groups in networkx using python?

我正在使用 facebook 数据集并在其上制作图表。但是无法在其中找到不同的组。 我使用的代码是这样的:

import networkx as nx
import matplotlib.pyplot as plt

g = nx.read_edgelist('facebook_combined.txt', create_using=nx.Graph(), nodetype=int)
print nx.info(g)

sp = nx.spring_layout(g)
nx.draw_networkx(g, pos=sp, with_labels=False, node_size=35)
# plt.axes('off')
plt.show()

我得到的结果是这样的:

谁能告诉我如何在其中找到不同的组?

数据集的link是here

数据集来源here

提前致谢!

定义

组的另一个术语是集群。这是一个相当普遍的问题。

您将必须定义聚类(或分组)指标。解决这个问题的一种方法是定义距离度量。例如,您可以使用 Jaccard 距离。如果两个节点共享共同的邻居,则它们很接近:

jaccard

jaccard_dsitance

距离矩阵

import numpy as np
nn = len(g.nodes)
mat = np.empty((nn, nn), dtype=float)
mat.fill(-100.0)
np.fill_diagonal(mat, -0.0)

Networkx 可以为您计算 Jaccard 系数 nx.jaccard_coefficient() :

preds = nx.jaccard_coefficient(g, g.edges)
for u, v, j in preds:
    mat[u,v] = -100 * (1 - j)

聚类

from sklearn.cluster import AffinityPropagation
np.median(mat)
af = AffinityPropagation(preference=-100, affinity="precomputed")
lab = af.fit_predict(mat)
len(np.unique(lab))

结果:571 个簇

绘图

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

plt.figure(figsize=(15,6))
pd.value_counts(lab).plot.bar()
plt.xticks([])
plt.show()

最大的集群包含 70 个节点。

编辑:

社区检测

您似乎想要查找社区。您可以使用 python-louvain package 对图形进行分区:

import community
import collections

partition = community.best_partition(g)
values = [partition.get(node) for node in g.nodes()]
counter=collections.Counter(values)
print(counter)

[出]: Counter({7: 548, 4: 543, 2: 435, 1: 431, 3: 423, 0: 350, 5: 323, 9: 237, 13: 226, 12: 206, 6: 121, 8: 73, 11: 60, 10: 25, 14: 19, 15: 19})

您可以用颜色可视化这些“组”:

sp = nx.spring_layout(g)
nx.draw_networkx(g, pos=sp, with_labels=False, node_size=35, node_color=values)
# plt.axes('off')
plt.show()