一个直径为 3 的图
- 测地路径(geodesic path)是指两个节点之间的最短路径。
- 如果所有节点都可通过某个路径连接到彼此,则它们构成一个连通分支(connected component)。如果一个图仅有一个连通分支,则该图是连通的(connected)。
举个例子,下面是一个有两个不同连通分支的图:
一个有两个连通分支的图
- 如果一个图的边是有顺序的配对,则该图是有向的(directed)。i 的入度(in-degree)是指向 i 的边的数量,出度(out-degree)是远离 i 的边的数量。
有向图
- 如果可以回到一个给定节点,则该图是有环的(cyclic)。相对地,如果至少有一个节点无法回到,则该图就是无环的(acyclic)。
- 图可以被加权(weighted),即在节点或关系上施加权重。
- 如果一个图的边数量相比于节点数量较小,则该图是稀疏的(sparse)。相对地,如果节点之间的边非常多,则该图是密集的(dense)。
Neo4J 的关于图算法的书给出了清晰明了的总结:
总结(来自 Neo4J Graph Book)
我们看看如何用 Python 检索一个图的这些信息:
n=34 G_karate.degree()
.degree() 属性会返回该图的每个节点的度(相邻节点的数量)的列表:
DegreeView({0: 16, 1: 9, 2: 10, 3: 6, 4: 3, 5: 4, 6: 4, 7: 4, 8: 5, 9: 2, 10: 3, 11: 1, 12: 2, 13: 5, 14: 2, 15: 2, 16: 2, 17: 2, 18: 2, 19: 3, 20: 2, 21: 2, 22: 2, 23: 5, 24: 3, 25: 3, 26: 2, 27: 4, 28: 3, 29: 4, 30: 4, 31: 6, 32: 12, 33: 17})
然后,隔离度的值:
# Isolate the sequence of degrees degree_sequence = list(G_karate.degree())
计算边的数量,但也计算度序列的度量:
nb_nodes = n nb_arr = len(G_karate.edges()) avg_degree = np.mean(np.array(degree_sequence)[:,1]) med_degree = np.median(np.array(degree_sequence)[:,1]) max_degree = max(np.array(degree_sequence)[:,1]) min_degree = np.min(np.array(degree_sequence)[:,1])
最后,打印所有信息:
print("Number of nodes : " str(nb_nodes)) print("Number of edges : " str(nb_arr)) print("Maximum degree : " str(max_degree)) print("Minimum degree : " str(min_degree)) print("Average degree : " str(avg_degree)) print("Median degree : " str(med_degree))
得到:
Number of nodes : 34 Number of edges : 78 Maximum degree : 17 Minimum degree : 1 Average degree : 4.588235294117647 Median degree : 3.0
平均而言,该图中的每个人都连接了 4.6 个人。
我们可以绘出这些度的直方图:
degree_freq = np.array(nx.degree_histogram(G_karate)).astype('float') plt.figure(figsize=(12, 8)) plt.stem(degree_freq) plt.ylabel("Frequence") plt.xlabel("Degre") plt.show()