📜  图论中的聚类系数(1)

📅  最后修改于: 2023-12-03 15:23:05.521000             🧑  作者: Mango

图论中的聚类系数

图论中的聚类系数是用来描述 图中节点之间紧密程度的一个指标。在单个节点看来,它的聚类系数(clustering coefficient)是它相邻节点之间边的实际数量与其最大数量之比,最大数量取决于该节点的度数。而整张图的聚类系数则是所有节点聚类系数的平均值。

简介

聚类系数是描述节点间关系紧密程度的一个指标,起源于社会学。在图论中,聚类系数是用来度量节点之间的平均密切程度的。在一个网络图中,一个节点的邻居们之间存在有大量边,那么这个节点的聚类系数就很高。

从一个节点看,假设它有 K 个邻居,它们之间共有 E 条边。当所有这 K 个邻居们之间都存在 E 条边时,那么这个节点的聚类系数就为 1。如果它的邻居们中有一些并不互相连接,那么它的聚类系数就较小。在一个网络图中,所有节点的聚类系数之和除以节点个数即为图的聚类系数。

在计算聚类系数时,最大程度上地考虑到了图中从数据上看具有紧密关系的节点群。例如,在社交网络中,很多朋友之间是存在关联的,而一些朋友之间会相互介绍认识,从而形成一个朋友圈。那么,这个朋友圈的聚类系数就是一个表示紧密度的指标。

计算方法

以一个节点为例,计算它的聚类系数可以分成以下几个步骤:

  1. 计算 K 值,即该节点的度数。

  2. 计算 E 值,即该节点与邻居们之间的边数。

  3. 计算最大边数。因为一个节点最多与 K*(K-1)/2 个邻居顶点相连,所以它的最大边数就是这个值。

  4. 计算聚类系数:聚类系数 = 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,然后将其传入函数中即可。