(1)读取网络
def load_graph(file_path):
with open(file_path, "r") as fd:
data = fd.readlines()
# 分离出标题和数据行,如果没有标题,用#号注释掉下面这两行)
title = data[0]
data = data[1:]
# 从数据中提取边,建立一个空的有向图G
edges = [it.strip().strip(",").split(",")[:2] for it in data]
G = nx.DiGraph()
G.add_edges_from(edges)
return G
(2)各种指标
nx.degree(G) # 计算节点的度。
计算图的密度,其值为边数m除以图中可能边数(即n(n-1)/2)
nx.clustering(G) # 网络节点的聚类系数。计算公式为:节点u的两个邻居节点间的边数除以((d(u)(d(u)-1)/2)。
nx.degree_centrality(G) # 节点度中心系数。通过节点的度表示节点在图中的重要性,默认情况下会进行归一化,其值表达为节点度d(u)除以n-1(其中n-1就是归一化使用的常量)。这里由于可能存在循环,所以该值可能大于1.
nx.closeness_centrality(G) # 节点距离中心系数。通过距离来表示节点在图中的重要性,一般是指节点到其他节点的平均路径的倒数,这里还乘以了n-1。该值越大表示节点到其他节点的距离越近,即中心性越高。
nx.betweenness_centrality(G) # 节点介数中心系数。在无向图中,该值表示为节点作占最短路径的个数除以((n-1)(n-2)/2);在有向图中,该值表达为节点作占最短路径个数除以((n-1)(n-2))。
nx.transitivity(G) # 图或网络的传递性。即图或网络中,认识同一个节点的两个节点也可能认识双方,计算公式为3*图中三角形的个数/三元组个数(该三元组个数是有公共顶点的边对数,这样就好数了)。nx.diameter(G) # 网络直径’
nx.average_shortest_path_length(G) # 网络最短路径
def graph_index(G):
# G = nx.random_graphs.barabasi_albert_graph(1000, 3) # 生成一个n=1000,m=3的BA无标度网络
print("节点总数:", G.number_of_nodes())
print("边总数:", G.number_of_edges())
print("平均聚类系数(average clustering): ", nx.average_clustering(G))
print("网络传递性(transitivity): ", nx.transitivity(G))
print("网络直径(diameter): ", nx.diameter(G))
print("平均最短路径(average shortest path length): ", nx.average_shortest_path_length(G))
degree_centrality = nx.degree_centrality(G)
closeness_centrality = closeness_centrality.values()
betweenness_centrality = betweenness_centrality.values()
print("平均度中心性(degree centrality): ", np.average(degree_centrality.values()))
print("平均距离中心性(closeness centrality): ", np.average(closeness_centrality.values()))
print("平均介数中心性(betweenness centrality): ", np.average(betweenness_centrality.values()))
# NetworkX 还提供了常用的图论经典算法,例如DFS、BFS、最短路、最小生成树、最大流等等
# path = nx.all_pairs_shortest_path(G) # 调用多源最短路径算法,计算图G所有节点间的最短路径
# print(path[0][2]) # 输出节点0、2之间的最短路径序列: [0, 1, 2]
(3)更多分析算法
中文教程:https://www.osgeo.cn/networkx/reference/algorithms/index.html