Example02 / 09
基本拓扑指标、度分布与中心性排名
对《悲惨世界》共现网络(按无权图处理)计算平均度、密度、平均聚集系数、传递性、平均最短路径、 直径和度同配系数;画出线性与双对数坐标下的度分布;列出三种中心性排名前 5 的节点。 解读:平均聚集系数(节点局部聚集系数的平均)与传递性(全网三角形比例)定义不同,数值也会不同; 不同中心性刻画的“重要”含义不同,前 5 名往往部分重合、部分不同。
Output输出图

Output文字输出
节点 77,边 254,连通:True 平均度 6.597 密度 0.087 平均聚集系数 0.573 传递性 0.499 平均最短路径 2.641 直径 5.000 度同配系数 -0.165 度中心性 前5: ['Valjean', 'Gavroche', 'Marius', 'Javert', 'Thenardier'] 介数中心性 前5: ['Valjean', 'Myriel', 'Gavroche', 'Marius', 'Fantine'] 特征向量中心性 前5: ['Gavroche', 'Valjean', 'Enjolras', 'Marius', 'Bossuet']
Code代码
# 对《悲惨世界》共现网络(按无权图处理)计算平均度、密度、平均聚集系数、传递性、平均最短路径、
# 直径和度同配系数;画出线性与双对数坐标下的度分布;列出三种中心性排名前 5 的节点。
# 解读:平均聚集系数(节点局部聚集系数的平均)与传递性(全网三角形比例)定义不同,数值也会不同;
# 不同中心性刻画的“重要”含义不同,前 5 名往往部分重合、部分不同。
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
G = nx.les_miserables_graph()
print("节点 %d,边 %d,连通:%s" % (G.number_of_nodes(), G.number_of_edges(), nx.is_connected(G)))
metrics = {
"平均度": 2 * G.number_of_edges() / G.number_of_nodes(),
"密度": nx.density(G),
"平均聚集系数": nx.average_clustering(G),
"传递性": nx.transitivity(G),
"平均最短路径": nx.average_shortest_path_length(G),
"直径": nx.diameter(G),
"度同配系数": nx.degree_assortativity_coefficient(G),
}
for k, v in metrics.items():
print("%-8s %.3f" % (k, v))
deg = np.array([d for _, d in G.degree()])
vals, counts = np.unique(deg, return_counts=True)
fig, ax = plt.subplots(1, 2, figsize=(9, 3.5))
ax[0].bar(vals, counts / counts.sum()); ax[0].set_xlabel("k"); ax[0].set_ylabel("P(k)"); ax[0].set_title("linear")
ax[1].loglog(vals, counts / counts.sum(), "o"); ax[1].set_xlabel("k"); ax[1].set_title("log-log")
plt.tight_layout(); plt.show()
def top5(cent):
return [n for n, _ in sorted(cent.items(), key=lambda x: -x[1])[:5]]
print("度中心性 前5:", top5(nx.degree_centrality(G)))
print("介数中心性 前5:", top5(nx.betweenness_centrality(G)))
print("特征向量中心性 前5:", top5(nx.eigenvector_centrality(G, max_iter=1000)))Run在浏览器中运行
首次加载 Python 环境约需 20–40 秒;可以修改参数后重新运行。