如何使用 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 距离。如果两个节点共享共同的邻居,则它们很接近:
距离矩阵
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()
我正在使用 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 距离。如果两个节点共享共同的邻居,则它们很接近:
距离矩阵
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()