Clustering Coefficient in Graph Theory

In graph theory, a clustering coefficient is a measure of the degree to which nodes in a graph tend to cluster together. Evidence suggests that in most real-world networks, and in particular social networks, nodes tend to create tightly knit groups characterized by a relatively high density of ties; this likelihood tends to be greater than the average probability of a tie randomly established between two nodes (Holland and Leinhardt, 1971; Watts and Strogatz, 1998).

Two versions of this measure exist: the global and the local. The global version was designed to give an overall indication of the clustering in the network, whereas the local gives an indication of the embeddedness of single nodes.

Global clustering coefficient

The global clustering coefficient is based on triplets of nodes. A triplet consists of three connected nodes. A triangle therefore includes three closed triplets, one centered on each of the nodes (n.b. this means the three triplets in a triangle come from overlapping selections of nodes). The global clustering coefficient is the number of closed triplets (or 3 x triangles) over the total number of triplets (both open and closed). The first attempt to measure it was made by Luce and Perry (1949). This measure gives an indication of the clustering in the whole network (global), and can be applied to both undirected and directed networks.

Local clustering coefficient



A graph G=(V,E) formally consists of a set of vertices V and a set of edges E between them. An edge e_{ij} connects vertex v_{i} with vertex v_{j}.

The neighborhood N_{i} for a vertex v_{i} is defined as its immediately connected neighbors as follows:

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

We define k_{i} as the number of vertices, |N_{i}|, in the neighbourhood, N_{i}, of a vertex.

The local clustering coefficient C_{i} for a vertexv_{i} is then given by the proportion of links between the vertices within its neighborhood divided by the number of links that could possibly exist between them. For a directed graph, e_{ij} is distinct from e_{{ji}} , and therefore for each neighborhood N_{i} there are k_{i}(k_{i}-1)links that could exist among the vertices within the neighborhood ( k_{i} is the number of neighbors of a vertex). Thus, the local clustering coefficient for directed graphs is given as [2]

C_{i}={\frac  {|\{e_{{jk}}:v_{j},v_{k}\in N_{i},e_{{jk}}\in E\}|}{k_{i}(k_{i}-1)}}.
An undirected graph has the property that e_{ij} and e_{{ji}} are considered identical. Therefore, if a vertex  v_{i} has  k_{i} neighbors, {\frac  {k_{i}(k_{i}-1)}{2}} edges could exist among the vertices within the neighborhood. Thus, the local clustering coefficient for undirected graphs can be defined as

C_{i}={\frac  {2|\{e_{{jk}}:v_{j},v_{k}\in N_{i},e_{{jk}}\in E\}|}{k_{i}(k_{i}-1)}}.
Let \lambda _{G}(v) be the number of triangles on v\in V(G) for undirected graph G. That is,  \lambda _{G}(v) is the number of sub-graphs of G with 3 edges and 3 vertices, one of which is v. Let \tau _{G}(v) be the number of triples on v\in G . That is, \tau _{G}(v) is the number of sub-graphs (not necessarily induced) with 2 edges and 3 vertices, one of which is v and such that v is incident to both edges. Then we can also define the clustering coefficient as
lue
C_{i}={\frac  {\lambda _{G}(v)}{\tau _{G}(v)}} .
It is simple to show that the two preceding definitions are the same, since

\tau _{G}(v)=C({k_{i}},2)={\frac  {1}{2}}k_{i}(k_{i}-1) .
These measures are 1 if every neighbor connected to v_{i} is also connected to every other vertex within the neighborhood, and 0 if no vertex that is connected to v_{i} connects to any other vertex that is connected to v_{i}.

cc

Example local clustering coefficient on an undirected graph. The local clustering coefficient of the green node is computed as the proportion of connections among its neighbours.



Here is the code to implement the above clustering coefficient in a graph. It is a part of the networkx library and can be directly accessed using it.

filter_none

edit
close

play_arrow

link
brightness_4
code

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)

chevron_right


Note: The above code is valid for undirected networks and not for the directed networks.
The code below has been run on IDLE(Python IDE of windows). You would need to download the networkx library before you run this code. The part inside the curly braces represent the output. It is almost similar as Ipython(for Ububtu users).

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


The above two values give us the global clustering coefficient of a network as well as local clustering coefficient of a network.

Next into this series, we will talk about another centrality measure for any given network.

References
You can read more about the same at

  • https://en.wikipedia.org/wiki/Clustering_coefficient
  • http://networkx.readthedocs.io/en/networkx-1.10/index.html
  • .

    This article is contributed by Jayant Bisht. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

    Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



    My Personal Notes arrow_drop_up


    Article Tags :
    Practice Tags :


    1


    Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.