生物医学网络科学Biomedical Network Science
Example02 / 09

基本拓扑指标、度分布与中心性排名

所属专题
网络分析流程与 NetworkX 实践
下载
Notebook · .py

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

Output输出图

基本拓扑指标、度分布与中心性排名:输出图 1

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 秒;可以修改参数后重新运行。

基本拓扑指标、度分布与中心性排名