概念简介
多年前网络上有一个名梗叫土豪我们做朋友吧,这个梗标明,实际上土豪是不愿意和你做朋友的,它们更倾向于和其他土豪做朋友,由此催生出一个图论中的概念,即富豪俱乐部。
从数学上来说,在一个图中
- 度数(连接数)最大的节点,称为【富豪】
- 如果这些度数最高的节点之间相互连接的密集程度,远高于它们与网络中其他低度节点的连接密集程度,那么这个网络就具有【富豪俱乐部】现象。
对此可构建富豪俱乐部系数 Φ ( r ) \Phi(r) Φ(r):取网络中度数最高的前 r r r个节点,计算它们之间实际存在的连边数,除以它们之间可能存在的最大连边数 r ( r − 1 ) 2 \frac{r(r-1)}{2} 2r(r−1)。如果随着 r r r的减小(即越来越只看最顶部的富豪), Φ ( r ) \Phi(r) Φ(r)的值依然很高甚至上升,就说明存在富豪俱乐部。
一个典型的Rich Club如下图所示

左图即为Rich Club在所有节点中的表现,其中红色的点即为富豪,它们仅占所有节点的一小部分,但彼此之间紧密相连。右侧则是 Φ ( k ) \Phi(k) Φ(k)和 k k k之间的关系,其中 k k k可以理解为富豪准入门槛,只有当连接数大于或者等于 k k k时才被视作富豪。
代码测试
NetworkX中,提供了【rich_club_coefficient】函数,可以用来计算 Φ ( k ) \Phi(k) Φ(k),函数签名如下,normalized为True时,将对网络进行归一化。
rich_club_coefficient(G, normalized=True, Q=100, seed=None)
其返回值是 { k : Φ ( k ) } \{k:\Phi(k)\} {k:Φ(k)}字典。
绘图代码如下
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = 'Times New Roman'
G = nx.barabasi_albert_graph(200, 2, seed=42)
degrees = dict(G.degree())
# 选出最富有的20个节点
rich_nodes = sorted(degrees, key=degrees.get, reverse=True)[:20]
# 提取富人之间的连边
rich_edges = []
for u, v in G.edges():
if u in rich_nodes and v in rich_nodes:
rich_edges.append((u, v))
rc = nx.rich_club_coefficient(G, normalized=False)
rc_degrees = list(rc.keys())
rc_values = list(rc.values())
# 子图1:网络拓扑与富人俱乐部高亮
ax1 = plt.subplot(121)
pos = nx.spring_layout(G, seed=42) # 布局算法
normal_nodes = [n for n in G.nodes() if n not in rich_nodes]
nx.draw_networkx_nodes(G, pos, nodelist=normal_nodes, node_size=20, node_color='lightgray', alpha=0.6, ax=ax1)
nx.draw_networkx_edges(G, pos, edge_color='lightgray', alpha=0.3, width=0.5, ax=ax1)
# 富人节点和富人边
nx.draw_networkx_nodes(G, pos, nodelist=rich_nodes, node_size=100, node_color='red', edgecolors='darkred', linewidths=1.5, ax=ax1)
nx.draw_networkx_edges(G, pos, edgelist=rich_edges, edge_color='gold', width=1.5, alpha=0.9, ax=ax1)
ax1.axis('off')
# 子图2 系数变化
ax2 = plt.subplot(122)
ax2.plot(rc_degrees, rc_values, marker='o', linestyle='-', color='b', markersize=4)
ax2.set_xlabel('Degree Threshold $k$')
ax2.set_ylabel('rich club coefficient $\Phi(k)$')
ax2.grid(True, linestyle='--', alpha=0.6)
plt.tight_layout()
plt.show()

599

被折叠的 条评论
为什么被折叠?



