networkx学习与使用——(5)节点和边的属性:聚集系数和邻里重叠度
- 节点和边的属性:割点、割边、聚集系数和邻里重叠度
- 节点的凝聚力表现:聚集系数
- 例子生成
- 实际计算
- 边的联系强度属性:邻里重叠度
- 例子生成
- 实际计算
- 完整代码资源
- 参考
节点和边的属性:割点、割边、聚集系数和邻里重叠度
在networkx学习与使用——(2)度、邻居和搜索算法中,我们知道一个节点可以有度和邻居等直接的属性,一个度大的节点看上去比一个度小的节点重要。但我们如何用更多的属性去衡量节点或者边的重要性呢?我们不妨反过来思考,如果这个图少了这个节点或者这条边会发生什么呢?在networkx学习与使用——(4)连通性与连通分量,我们探索了图的连通性的属性。从中我们得到启发,如果从图中删除某个节点或者删除某条边,导致图的连通性发生了变化,那我们认为该节点或边是重要的,因此我们可以通过移除点或边后计算图的连通分支数来寻找割点和割边:如果从图中删除某个节点(与该点连接的某条边也一并删除)或者某条边,导致图的连通分量增加,则称该点为割点或者称该边为割边。
当然割点和割边只是节点和边的一种属性,这里介绍社交网络中节点和边的另一种属性。
节点的凝聚力表现:聚集系数
聚集系数定义为某一节点的任意两个邻居彼此也是邻居的概率。
例子生成
import networkx as nx #载入networkx包
import matplotlib.pyplot as plt #用于画图
#生成图
G1 = nx.Graph()
G2 = nx.Graph() #无向图
G1_edges = [('A','B'),('A','C'),('A','D'),('A','E'),
('B','F'),('B','G'),('C','D'),('E','F')]
G2_edges = [('A','B'),('A','C'),('A','D'),('A','E'),
('B','C'),('B','F'),('B','G'),('C','D'),
('D','G'),('D','E'),('E','F'),('F','G')]
G1.add_edges_from(G1_edges)
G2.add_edges_from(G2_edges)
pos={'A': [3,1.6], 'B': [2.5, 3], 'C': [4.5, 2], 'D': [3.4, 0.5],
'E': [1.6,0.5], 'F': [1.1,1.9], 'G': [1.1, 3.3]}
labels={}
for node in G1.nodes():
labels[node]=node
#画图
plt.rcParams['figure.figsize']= (10, 4) # 设置画布大小
ax1 = plt.subplot(1,2,1)
nx.draw_networkx_nodes(G1,pos) # 画节点
nx.draw_networkx_edges(G1,pos) # 画边
nx.draw_networkx_labels(G1,pos,labels) # 画标签
plt.axis('off') # 去掉坐标刻度
ax1 = plt.subplot(1,2,2)
nx.draw_networkx_nodes(G2,pos) # 画节点
nx.draw_networkx_edges(G2,pos) # 画边
nx.draw_networkx_labels(G2,pos,labels) # 画标签
plt.axis('off') # 去掉坐标刻度
plt.show()
实际计算
上图中,我们先手算A点的聚集系数,A有4个邻居,四个邻居间最多有3+2+1=6条边,左图的邻居间连边仅有DC,因此聚集系数为1/6;右图邻居间连边有BC、CD、DE三条边,因此聚集系数为3/6=1/2。下面用networkx计算:
print(nx.clustering(G1,'A'))
print(nx.clustering(G2,'A'))
out:
0.16666666666666666
0.5
边的联系强度属性:邻里重叠度
邻里重叠度是社会网络中判断某点是否能够通过某条边更便利的到达另一点时对该边的属性的刻画:具体的边(A-B)的邻里重叠度公式为。我没有networkx中找到这个函数,书上写的是neighborhood overlap:在参考文档中没有搜索到。不过我们可以根据已有的手段来进行计算。
例子生成
#图生成
G3 = nx.Graph()
G3_edges = [('A','B'),('A','C'),('A','D'),('A','E'),('A','F'),
('B','H'),('B','I'),('B','L'),('B','M'),('C','D'),
('C','E'),('C','F'),('D','E'),('F','J'),('F','G'),
('G','H'),('G','J'),('G','K'),('H','I'),('H','K'),
('I','L'),('I','M'),('L','M')]
G3.add_edges_from(G3_edges)
pos={'A': [2.1,1.7], 'B': [3.7,1.7], 'C': [0.6,1.7], 'D': [0.6,0.4],
'E': [2.1,0.4], 'F': [1.3,2.8], 'G': [2.9,3.7], 'H': [4.4,2.8],
'I': [5.2,1.7], 'J': [1.3,3.7], 'K': [4.4,3.7], 'L': [3.7,0.4],
'M': [5.2,0.4]}
labels={}
for node in G3.nodes():
labels[node]=node
#画图
plt.rcParams['figure.figsize']= (6, 4) # 设置画布大小
nx.draw_networkx_nodes(G3,pos) # 画节点
nx.draw_networkx_edges(G3,pos) # 画边
nx.draw_networkx_labels(G3,pos,labels) # 画标签
plt.axis('off') # 去掉坐标刻度
plt.show()
实际计算
首先我们手算一下AF的邻里重叠度,A除了F以外有4个邻居,F除了A以外有3个邻居,AF的共同邻居仅有C,所以边AF的邻里重叠度为。
由于networkx没找到这个函数,我们按定义计算:
可以参考networkx学习与使用——(2)度、邻居和搜索算法对邻居函数的使用。
def neighborhood_overlap(G, u, v):
u_n = G.degree()[u]
v_n = G.degree()[v]
C_n = len(list(nx.common_neighbors(G,u,v)))
if u_n-1+v_n-1-C_n==0:
return 0
else:
return C_n/(u_n-1+v_n-1-C_n)
print(neighborhood_overlap(G3,'A','F'))
print(neighborhood_overlap(G3,'A','E'))
out:
0.16666666666666666
0.4
这里分别计算出AF和AE的邻里重叠度为1/6和0.4,按照定义邻里重叠度小的更接近与捷径概念,因此AF比AE更接近于捷径。从图中也能体现出这样的概念。
完整代码资源
networkx学习(5)
参考
networkx官网地址:https://networkx.org/