📅  最后修改于: 2023-12-03 15:23:05.521000             🧑  作者: Mango
图论中的聚类系数是用来描述 图中节点之间紧密程度的一个指标。在单个节点看来,它的聚类系数(clustering coefficient)是它相邻节点之间边的实际数量与其最大数量之比,最大数量取决于该节点的度数。而整张图的聚类系数则是所有节点聚类系数的平均值。
聚类系数是描述节点间关系紧密程度的一个指标,起源于社会学。在图论中,聚类系数是用来度量节点之间的平均密切程度的。在一个网络图中,一个节点的邻居们之间存在有大量边,那么这个节点的聚类系数就很高。
从一个节点看,假设它有 K 个邻居,它们之间共有 E 条边。当所有这 K 个邻居们之间都存在 E 条边时,那么这个节点的聚类系数就为 1。如果它的邻居们中有一些并不互相连接,那么它的聚类系数就较小。在一个网络图中,所有节点的聚类系数之和除以节点个数即为图的聚类系数。
在计算聚类系数时,最大程度上地考虑到了图中从数据上看具有紧密关系的节点群。例如,在社交网络中,很多朋友之间是存在关联的,而一些朋友之间会相互介绍认识,从而形成一个朋友圈。那么,这个朋友圈的聚类系数就是一个表示紧密度的指标。
以一个节点为例,计算它的聚类系数可以分成以下几个步骤:
计算 K 值,即该节点的度数。
计算 E 值,即该节点与邻居们之间的边数。
计算最大边数。因为一个节点最多与 K*(K-1)/2 个邻居顶点相连,所以它的最大边数就是这个值。
计算聚类系数:聚类系数 = E / max_edges
在实际操作时,通过循环遍历计算每个节点的聚类系数,最后求各个节点的聚类系数平均值。
对于一个简化的无向图,我们可以采用邻接矩阵的方式进行计算。以下是计算图的聚类系数的 Python 代码示例:
import numpy as np
def clustering_coefficient(graph):
"""
计算图的聚类系数
:param graph: 邻接矩阵形式表示的图
:return: 图的聚类系数
"""
num_nodes = len(graph)
max_edges = num_nodes * (num_nodes - 1) / 2
cc_sum = 0
for i in range(num_nodes):
num_edges = 0
neighbors = np.where(graph[i] == 1)[0]
# 统计节点 i 邻居们之间的边数
for j in range(len(neighbors)):
for k in range(j + 1, len(neighbors)):
if graph[neighbors[j]][neighbors[k]] == 1:
num_edges += 1
# 若邻居少于两个,则无法形成三角形
if len(neighbors) < 2:
continue
cc_sum += num_edges / (len(neighbors) * (len(neighbors) - 1) / 2)
return cc_sum / num_nodes
此函数接收一个邻接矩阵形式表示的图,返回该图的聚类系数。
如果需要使用此函数,可以先创建一个该图的邻接矩阵 graph,然后将其传入函数中即可。