生物医学网络科学Biomedical Network Science
Example03 / 15

局部聚集系数、平均聚集系数与传递性

所属专题
网络结构指标与随机图
下载
Notebook · .py

手工计算节点 0 的局部聚集系数 C_i = 2 e_i / (k_i (k_i - 1))(e_i 为邻居之间的边数),与 nx.clustering 对比; 再比较平均聚集系数(节点等权)与传递性(按连通三元组加权)——两者数值不同。 最后画出各节点的度与 C_i 的散点图:高度节点的 C_i 普遍较低,与 C(k) 随 k 下降的规律一致。

Output输出图

局部聚集系数、平均聚集系数与传递性:输出图 1

Output文字输出

节点 0: 度=16, 邻居间边数=18, C_i=0.150, NetworkX=0.150
平均聚集系数 = 0.571
传递性       = 0.256
度 <= 4 的节点平均 C_i = 0.667;度 >= 10 的节点平均 C_i = 0.175

Code代码

# 手工计算节点 0 的局部聚集系数 C_i = 2 e_i / (k_i (k_i - 1))(e_i 为邻居之间的边数),与 nx.clustering 对比;
# 再比较平均聚集系数(节点等权)与传递性(按连通三元组加权)——两者数值不同。
# 最后画出各节点的度与 C_i 的散点图:高度节点的 C_i 普遍较低,与 C(k) 随 k 下降的规律一致。
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
from itertools import combinations

G = nx.karate_club_graph()
i = 0
nbrs = list(G.neighbors(i))
k = len(nbrs)
e_i = sum(1 for u, v in combinations(nbrs, 2) if G.has_edge(u, v))
C_i = 2 * e_i / (k * (k - 1))
print("节点 %d: 度=%d, 邻居间边数=%d, C_i=%.3f, NetworkX=%.3f" % (i, k, e_i, C_i, nx.clustering(G, i)))
print("平均聚集系数 = %.3f" % nx.average_clustering(G))
print("传递性       = %.3f" % nx.transitivity(G))

deg = dict(G.degree())
clu = nx.clustering(G)
x = np.array([deg[n] for n in G])
y = np.array([clu[n] for n in G])
print("度 <= 4 的节点平均 C_i = %.3f;度 >= 10 的节点平均 C_i = %.3f" % (y[x <= 4].mean(), y[x >= 10].mean()))
plt.scatter(x, y)
plt.xlabel("degree k")
plt.ylabel("local clustering C_i")
plt.title("Clustering vs degree (karate club)")
plt.show()

Run在浏览器中运行

首次加载 Python 环境约需 20–40 秒;可以修改参数后重新运行。

局部聚集系数、平均聚集系数与传递性