图论中的聚类系数(Clustering coefficient)简单介绍

前言

在GraphSage论文的理论分析部分,涉及到一个概念叫做“Clustering coefficient”,直译过来就是聚类系数,解释为“节点的一跳邻域内封闭的三角形的比例”,本文对其做一个简单的介绍。本文参考了 Wiki百科-Clustering coefficient

更:关于GraphSage论文详解,请参见博文《GraphSage-《Inductive Representation Learning on Large Graphs》论文详解

介绍

在图论中,聚类系数是图中节点倾向于聚类在一起的程度的度量。相关论文表明1 2,在大多数现实世界的网络中,尤其是社交网络中,节点倾向于创建紧密结合的群体,其特征是联系密度相对较高;这种可能性往往大于两个节点之间随机建立联系的平均概率。

聚类系数主要有两种度量方式:局部和全局。


局部聚类系数

一个节点的局部聚类系数量化了它的邻居节点离成为(clique,即每两个不同的顶点都是相邻的。参见wiki百科-clique)有多近,简单来说就是,节点的一跳邻域内封闭的三角形的比例。

举个例子说明:
在这里插入图片描述

图1 无向图上的局部聚类系数计算示例

图中的灰色线表示节点A与邻居的连接,黑实线是邻居之间的连接,红色表示图1(2)和(3)相比于图1(1)去掉的连接。
节点 A 的局部聚类系数计算为:其邻居之间实际实现的连接与所有可能连接的数量的比例,或者为节点A的一跳邻居内封闭的三角形的比例。

  • 邻居之间实际实现的连接与所有可能连接的数量的比例: 如图1所示,A的邻居为(P1,P2,P3),P1,P2,P3之间最多可以有3个连接,图1中的(1)(2)(3)的P1,P2,P3之间分别有3个,1个和0个连接,所以聚类系数 C C C 分别为 1,1/3和0。

  • 邻居内封闭的三角形的比例: 如图1所示,A的邻居为(P1,P2,P3)与A最多形成3个三角形: Δ A P 1 P 2 \Delta AP_1P_2 ΔAP1P2, Δ A P 2 P 3 \Delta AP_2P_3 ΔAP2P3, Δ P 1 P 2 P 3 \Delta P_1P_2P_3 ΔP1P2P3,图1中的(1)(2)(3)符合条件的三角形分别有3个,1个和0个,所以聚类系数 C C C 分别为 1,1/3和0。

全局聚类系数

全局聚类系数是封闭三元组(或3个三角形)在三元组(开放和封闭)总数上的数量。

这部分待更新…


  1. P. W. Holland & S. Leinhardt (1971). “Transitivity in structural models of small groups”. Comparative Group Studies. 2 (2): 107–124. doi:10.1177/104649647100200201. S2CID 145544488 ↩︎

  2. D. J. Watts & Steven Strogatz (June 1998). “Collective dynamics of ‘small-world’ networks”. Nature. 393 (6684): 440–442. Bibcode:1998Natur.393…440W ↩︎

  • 16
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用Python进行图论k聚类,需要用到networkx和scikit-learn库。以下是一个简单的示例: 首先,导入必要的库: ```python import networkx as nx import numpy as np from sklearn.cluster import KMeans ``` 接下来,创建一个。这里使用networkx库创建了一个简单。你可以使用不同的方法创建不同的,具体取决于你的需求。 ```python G = nx.Graph() G.add_edges_from([(1,2), (1,3), (2,3), (2,4), (3,4), (4,5), (5,6), (5,7), (6,7)]) ``` 然后,计算节点之间的距离。这里使用networkx库提供的最短路径算法来计算节点之间的距离。 ```python dist_matrix = np.zeros((len(G.nodes()), len(G.nodes()))) for i in range(len(G.nodes())): for j in range(i+1, len(G.nodes())): dist = nx.shortest_path_length(G, source=i+1, target=j+1) dist_matrix[i][j] = dist dist_matrix[j][i] = dist ``` 接下来,使用scikit-learn库的KMeans算法来进行聚类。这里将的节点分成3类。 ```python kmeans = KMeans(n_clusters=3, random_state=0).fit(dist_matrix) ``` 最后,将聚类结果可视化。这里使用networkx库提供的绘功能来绘制形,并根据聚类结果将节点分成不同的颜色。 ```python colors = ['r', 'g', 'b'] pos = nx.spring_layout(G) for i in range(len(G.nodes())): nx.draw_networkx_nodes(G, pos, nodelist=[i+1], node_color=colors[kmeans.labels_[i]]) nx.draw_networkx_edges(G, pos) nx.draw_networkx_labels(G, pos) plt.show() ``` 这个示例演示了如何使用Python进行图论k聚类。当然,这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值