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()

网络、群体与市场P33图3.2

实际计算

上图中,我们先手算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)的邻里重叠度公式为 与 A 、 B 均 为 邻 居 的 节 点 数 与 A 、 B 中 至 少 一 个 为 邻 居 的 节 点 数 \frac{与A、B均为邻居的节点数}{与A、B中至少一个为邻居的节点数} ABAB。我没有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()

网络、群体与市场P35图3.4

实际计算

首先我们手算一下AF的邻里重叠度,A除了F以外有4个邻居,F除了A以外有3个邻居,AF的共同邻居仅有C,所以边AF的邻里重叠度为 1 4 + 3 − 1 = 1 6 \frac{1}{4+3-1}=\frac{1}{6} 4+311=61
由于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/

  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的手机半斤重

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值