![Create React App Officially Deprecated Amid React 19 Compatibility Issues](https://cdn.sanity.io/images/cgdhsj6q/production/04fa08cf844d798abc0e1a6391c129363cc7e2ab-1024x1024.webp?w=400&fit=max&auto=format)
Security News
Create React App Officially Deprecated Amid React 19 Compatibility Issues
Create React App is officially deprecated due to React 19 issues and lack of maintenance—developers should switch to Vite or other modern alternatives.
communities
is a Python library for detecting community structure in graphs. It implements the following algorithms:
You can also use communities
to visualize these algorithms. For example, here's a visualization of the Louvain method applied to the karate club graph:
communities
can be installed with pip
:
$ pip install communities
Each algorithm expects an adjacency matrix representing an undirected graph, which can be weighted or unweighted. This matrix should be a 2D numpy
array. Once you have this, simply import the algorithm you want to use from communities.algorithms
and plug in the matrix, like so:
import numpy as np
from communities.algorithms import louvain_method
adj_matrix = np.array([[0, 1, 1, 0, 0, 0],
[1, 0, 1, 0, 0, 0],
[1, 1, 0, 1, 0, 0],
[0, 0, 1, 0, 1, 1],
[0, 0, 0, 1, 0, 1],
[0, 0, 0, 1, 1, 0]])
communities, _ = louvain_method(adj_matrix)
# >>> [{0, 1, 2}, {3, 4, 5}]
The output of each algorithm is a list of communities, where each community is a set of nodes. Each node is referred to by the index of its row in the adjacency matrix.
Some algorithms, like louvain_method
and girvan_newman
, will return two values: the list of communities and data to plug into a visualization algorithm. More on this in the Visualization section.
louvain_method(adj_matrix : numpy.ndarray, n : int = None) -> list
Implementation of the Louvain method, from Fast unfolding of communities in large networks. This algorithm does a greedy search for the communities that maximize the modularity of the graph. A graph is said to be modular if it has a high density of intra-community edges and a low density of inter-community edges.
Louvain's method runs in O(nᆞlog2n) time, where n is the number of nodes in the graph.
Parameters:
adj_matrix
(numpy.ndarray): Adjacency matrix representation of your graphn
(int or None, optional (default=None)): Terminates the search once this number of communities is detected; if None
, then the algorithm will behave normally and terminate once modularity is maximizedExample Usage:
from communities.algorithms import louvain_method
adj_matrix = [...]
communities, _ = louvain_method(adj_matrix)
girvan_newman(adj_matrix : numpy.ndarray, n : int = None) -> list
Implementation of the Girvan-Newman algorithm, from Community structure in social and biological networks. This algorithm iteratively removes edges to create more connected components. Each component is considered a community, and the algorithm stops removing edges when no more gains in modularity can be made. Edges with the highest betweenness centralities (i.e. those that lie between many pairs of nodes) are removed. Formally, edge betweenness centrality is defined as:
where
The Girvan-Newman algorithm runs in O(m2n) time, where m is the number of edges in the graph and n is the number of nodes.
Parameters:
adj_matrix
(numpy.ndarray): Adjacency matrix representation of your graph
n
(int or None, optional (default=None)): Terminates the search once this number of communities is detected; if None
, then the algorithm will behave normally and terminate once modularity is maximizedExample Usage:
from communities.algorithms import girvan_newman
adj_matrix = [...]
communities, _ = girvan_newman(adj_matrix)
hierarchical_clustering(adj_matrix : numpy.ndarray, metric : str = "cosine", linkage : str = "single", n : int = None) -> list
Implementation of a bottom-up, hierarchical clustering algorithm. Each node starts in its own community. Then, the most similar pairs of communities are merged as the hierarchy is built up. Communities are merged until no further gains in modularity can be made.
There are multiple schemes for measuring the similarity between two communities, C1 and C2:
where sim(i, j) is the similarity between nodes i and j, defined as either the cosine similarity or inverse Euclidean distance between their row vectors in the adjacency matrix, Ai and Aj.
This algorithm runs in O(n3) time, where n is the number of nodes in the graph.
Parameters:
adj_matrix
(numpy.ndarray): Adjacency matrix representation of your graphmetric
(str, optional (default="cosine")): Scheme for measuring node similarity; options are "cosine", for cosine similarity, or "euclidean", for inverse Euclidean distancelinkage
(str, optional (default="single")): Scheme for measuring community similarity; options are "single", "complete", and "mean"n
(int or None, optional (default=None)): Terminates the search once this number of communities is detected; if None
, then the algorithm will behave normally and terminate once modularity is maximizedExample Usage:
from communities.algorithms import hierarchical_clustering
adj_matrix = [...]
communities = hierarchical_clustering(adj_matrix, metric="euclidean", linkage="complete")
spectral_clustering(adj_matrix : numpy.ndarray, k : int) -> list
Implementation of a spectral clustering algorithm. This type of algorithm assumes the eigenvalues of the adjacency matrix hold information about community structure. Here's how it works:
This algorithm is NP-hard.
Parameters:
adj_matrix
(numpy.ndarray): Adjacency matrix representation of your graphk
(int): Number of communities to cluster nodes intoExample Usage:
from communities.algorithms import spectral_clustering
adj_matrix = [...]
communities = spectral_clustering(adj_matrix, k=5)
bron_kerbosch(adj_matrix : numpy.ndarray, pivot : bool = False) -> list
Implementation of the Bron-Kerbosch algorithm for maximal clique detection. A maximal clique in a graph is a subset of nodes that forms a complete graph and would no longer be complete if any other node was added to the subset. Treating maximal cliques as communities is reasonable, as cliques are the most densely connected groups of nodes in a graph. Because a node can be a member of more than one clique, this algorithm will sometimes identify overlapping communities.
If your input graph has less than 3n/3 maximal cliques, then this algorithm runs in O(3n/3) time (assuming pivot=True
).
Parameters:
adj_matrix
(numpy.ndarray): Adjacency matrix representation of your graph
pivot
(bool, optional (default=False)): If True
, the pivot variant of the algorithm (described here) will be used
Example Usage:
from communities.algorithms import bron_kerbosch
adj_matrix = [...]
communities = bron_kerbosch(adj_matrix, pivot=True)
draw_communities(adj_matrix : numpy.ndarray, communities : list, dark : bool = False, filename : str = None, seed : int = 1)
Visualize your graph such that nodes are grouped into their communities and color-coded.
Returns a matplotlib.axes.Axes
representing the plot.
Parameters:
adj_matrix
(numpy.ndarray): Adjacency matrix representation of your graphdark
(bool, optional (default=False)): If True
, the plot will have a dark background and color scheme, else it will have a light color schemefilename
(str or None, optional (default=None)): If you want to save the plot as a PNG, filename
is the path of the file to save it as; set to None
to display the plot interactivelydpi
(int or None, optional (default=None)): Dots per inch (controls the resolution of the image)seed
(int, optional (default=2)): Random seedExample Usage:
from communities.algorithms import louvain_method
from communities.visualization import draw_communities
adj_matrix = [...]
communities, frames = louvain_method(adj_matrix)
draw_communities(adj_matrix, communities)
louvain_animation(adj_matrix : numpy.ndarray, frames : list, dark : bool = False, duration : int = 15, filename : str = None, dpi : int = None, seed : int = 2)
Use this to animate the application of the Louvain method to your graph. In this animation, the color of each node represents the community it's assigned to, and nodes in the same community are clustered together. Each step of the animation will show a node changing color (i.e. being assigned to a different community) and being moved to a new cluster, and the corresponding update to the graph's modularity.
This function returns a matplotlib.animation.FuncAnimation
object representing the animation.
Parameters:
adj_matrix
(numpy.ndarray): Adjacency matrix representation of your graphframes
(list): List of dictionaries representing each iteration of the algorithm
"C"
, which holds a node-to-community lookup table, and "Q"
, the modularity value of the graphlouvain_method
dark
(bool, optional (default=False)): If True
, the animation will have a dark background and color scheme, else it will have a light color schemeduration
(int, optional (default=15)): The desired duration of the animation in secondsfilename
(str or None, optional (default=None)): If you want to save the animation as a GIF, filename
is the path of the file to save it as; set to None
to display the animation as an interactive plotdpi
(int or None, optional (default=None)): Dots per inch (controls the resolution of the animation)seed
(int, optional (default=2)): Random seedExample Usage:
from communities.algorithms import louvain_method
from communities.visualization import louvain_animation
adj_matrix = [...]
communities, frames = louvain_method(adj_matrix)
louvain_animation(adj_matrix, frames)
intercommunity_matrix(adj_matrix : numpy.ndarray, communities : list, aggr : Callable = sum) -> numpy.ndarray
Creates an inter-community adjacency matrix. Each node in this matrix represents a community in communities
, and each edge between nodes i and j is created by aggregating (e.g. summing) the weights of edges between nodes in communities[i]
and nodes in communities[j]
.
Parameters:
adj_matrix
(numpy.ndarray): Adjacency matrix representation of the graph from which communities were extractedcommunities
(list): List of communitiesaggr
(Callable, optional (default=sum)): Function that takes a list of inter-community edge weights and combines them into a single edge weightExample Usage:
from statistics import mean
from communities.algorithms import louvain_method
from communities.utilities import intercommunity_matrix
adj_matrix = [...]
communities = louvain_method(adj_matrix)
intercomm_adj_matrix = intercommunity_matrix(adj_matrix, communities, mean)
laplacian_matrix(adj_matrix : numpy.ndarray) -> numpy.ndarray
Computes the graph Laplacian. This matrix is used in the spectral_clustering
algorithm, and is generally useful for revealing properties of a graph. It is defined as L = D - A, where A is the adjacency matrix of the graph, and D is the degree matrix, defined as:
where wik is the edge weight between a node i and its neighbor k.
Parameters:
adj_matrix
(numpy.ndarray): Adjacency matrix representation of your graphExample Usage:
from communities.utilities import laplacian_matrix
adj_matrix = [...]
L = laplacian_matrix(adj_matrix)
modularity_matrix(adj_matrix : numpy.ndarray) -> numpy.ndarray
Computes the modularity matrix for a graph. The modularity matrix is defined as:
where
Parameters:
adj_matrix
(numpy.ndarray): Adjacency matrix representation of your graphmodularity(mod_matrix : numpy.ndarray, communities : list) -> float
Computes modularity of a partitioned graph. Modularity is defined as:
where
Parameters:
mod_matrix
(numpy.ndarray): Modularity matrix computed from the adjacency matrix representation of your graphcommunities
(list): List of (non-overlapping) communities identified in the graphExample Usage:
from communities.algorithms import louvain_method
from communities.utilities import modularity_matrix, modularity
adj_matrix = [...]
communities = louvain_method(adj_matrix)
mod_matrix = modularity_matrix(adj_matrix)
Q = modularity(mod_matrix, communities)
FAQs
Library for detecting community structure in graphs
We found that communities demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Create React App is officially deprecated due to React 19 issues and lack of maintenance—developers should switch to Vite or other modern alternatives.
Security News
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
Security News
The Linux Foundation is warning open source developers that compliance with global sanctions is mandatory, highlighting legal risks and restrictions on contributions.