📜  图论中的聚类系数

📅  最后修改于: 2021-05-08 16:54:37             🧑  作者: Mango

在图论中,聚类系数是图形中节点趋于聚在一起的程度的度量。有证据表明,在大多数现实世界的网络中,特别是在社交网络中,节点倾向于创建紧密联系的群体,其特征是相对较高的联系密度。这种可能性往往大于两个节点之间随机建立平局的平均概率(Holland和Leinhardt,1971; Watts和Strogatz,1998)。

存在此度量的两个版本:全局度量和局部度量。全局版本旨在提供网络群集的总体指示,而本地版本则指示单个节点的嵌入性。

全局聚类系数

全局聚类系数基于节点的三元组。一个三元组由三个连接的节点组成。因此,三角形包含三个封闭的三元组,一个在每个节点上居中(nb,这意味着三角形中的三个三元组来自节点的重叠选择)。全局聚类系数是封闭的三元组(或3个三角形)在三元组总数(开放和封闭的总数)中的数量。 Luce和Perry(1949)进行了首次测量。该措施可以指示整个网络(全局)中的群集,并且可以应用于无向和有向的网络。

局部聚类系数

G=(V,E)形式上由一组顶点V和它们之间的一组边E组成。优势e_{ij}连接顶点v_{i}带顶点v_{j}

邻里N_{i}为一个顶点v_{i}定义为其直接连接的邻居,如下所示:

N_i = \{v_j : e_{ij} \in E \or e_{ji} \in E\}

我们定义k_{i}作为顶点数, |N_{i}| ,在附近, N_{i} ,一个顶点。

局部聚类系数C_{i}为一个顶点v_{i}然后通过邻域内顶点之间的链接比例除以它们之间可能存在的链接数量得出。对于有向图, e_{ij}有别于e_{{ji}} ,因此对于每个邻域N_{i}k_{i}(k_{i}-1)邻域内顶点之间可能存在的链接( k_{i}是顶点的邻居数)。因此,有向图的局部聚类系数为[2]

C_{i}={\frac  {|\{e_{{jk}}:v_{j},v_{k}\in N_{i},e_{{jk}}\in E\}|}{k_{i}(k_{i}-1)}}
无向图的性质是e_{ij}e_{{ji}}被认为是相同的。因此,如果一个顶点 v_{i}具有 k_{i}邻居, {\frac  {k_{i}(k_{i}-1)}{2}}邻域内的顶点之间可能存在边。因此,无向图的局部聚类系数可以定义为

C_{i}={\frac  {2|\{e_{{jk}}:v_{j},v_{k}\in N_{i},e_{{jk}}\in E\}|}{k_{i}(k_{i}-1)}}
\lambda _{G}(v)是上的三角形数v\in V(G)对于无向图G。也就是说,  \lambda _{G}(v)是具有3个边和3个顶点的G的子图的数量,其中之一是v。 \tau _{G}(v)是三元组的数量v\in G 。那是, \tau _{G}(v)是具有2个边缘和3个顶点的子图的数量(不一定要诱导),其中一个是v,并且v入射到两个边缘。然后我们也可以将聚类系数定义为
e
C_{i}={\frac  {\lambda _{G}(v)}{\tau _{G}(v)}}
可以很容易地证明前面两个定义是相同的,因为

\tau _{G}(v)=C({k_{i}},2)={\frac  {1}{2}}k_{i}(k_{i}-1)
如果每个邻居都连接到这些措施,则这些措施为1 v_{i}也连接到邻域内的所有其他顶点,如果没有连接到的顶点则为0 v_{i}连接到任何其他已连接到的顶点v_{i}

抄送

无向图上的示例局部聚类系数。将绿色节点的局部聚类系数计算为其邻居之间的连接比例。

这是在图中实现上述聚类系数的代码。它是networkx库的一部分,可以使用它直接访问。

def average_clustering(G, trials=1000):
    """Estimates the average clustering coefficient of G.
  
    The local clustering of each node in `G` is the 
    fraction of triangles that actually exist over 
    all possible triangles in its neighborhood.
    The average clustering coefficient of a graph 
    `G` is the mean of local clusterings.
  
    This function finds an approximate average 
    clustering coefficient for G by repeating `n` 
    times (defined in `trials`) the following
    experiment: choose a node at random, choose 
    two of its neighbors at random, and check if
    they are connected. The approximate coefficient 
    is the fraction of triangles found over the 
    number of trials [1]_.
  
    Parameters
    ----------
    G : NetworkX graph
  
    trials : integer
        Number of trials to perform (default 1000).
  
    Returns
    -------
    c : float
        Approximated average clustering coefficient.
  
     
  
    """
    n = len(G)
    triangles = 0
    nodes = G.nodes()
    for i in [int(random.random() * n) for i in range(trials)]:
        nbrs = list(G[nodes[i]])
        if len(nbrs) < 2:
            continue
        u, v = random.sample(nbrs, 2)
        if u in G[v]:
            triangles += 1
    return triangles / float(trials)

注意:上面的代码对非定向网络有效,而对定向网络无效。
以下代码已在IDLE(Windows的Python IDE)上运行。在运行此代码之前,您需要下载networkx库。花括号内的部分代表输出。它几乎与Ipython(适用于Ububtu用户)相似。

>>> import networkx as nx
>>> G=nx.erdos_renyi_graph(10,0.4)
>>> cc=nx.average_clustering(G)
>>> cc
#Output of Global CC
0.08333333333333333 
>>> c=nx.clustering(G)
>>> c 
# Output of local CC
{0: 0.0, 1: 0.3333333333333333, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0, 6: 0.0,
 7: 0.3333333333333333, 8: 0.0, 9: 0.16666666666666666} 

上面的两个值为我们提供了网络的全局聚类系数以及网络的局部聚类系数。

在本系列的下一篇文章中,我们将讨论针对任何给定网络的另一种集中度度量。

参考
您可以在以下位置阅读更多有关此内容的信息

  • https://zh.wikipedia.org/wiki/集群系数
  • http://networkx.readthedocs.io/en/networkx-1.10/index.html