Skip to main content

Louvain is a general algorithm for methods of community detection in large networks.

Project description

INTRODUCTION
============

This package implements the louvain algorithm [1] in ``C++`` and exposes it to
``python``. It relies on (python-)``igraph`` for it to function. Besides the
relative flexibility of the implementation, it also scales well, and can be run
on graphs of millions of nodes (as long as they can fit in memory). The core
function is ``find_partition`` which finds the optimal partition using the
louvain algorithm for a number of different methods. The original implementation
is available from https://sites.google.com/site/findcommunities/. The methods
currently implemented are:

Modularity
This method compares the actual graph to the expected graph, taking into
account the degree of the nodes [2]. The expected graph is based on a
configuration null-model.

RBConfiguration
This is an extension of modularity which includes a resolution parameter [3].
In general, a higher resolution parameter will lead to smaller communities.

RBER
A variant of the previous method that instead of a configuration null-model
uses a Erdös-Rényi null-model in which each edge has the same probability of
appearing [3].

CPM
This method compares to a fixed resolution parameter, so that it finds
communities that have an internal density higher than the resolution
parameter, and is separated from other communities with a density lowerer than
the resolution parameter [4].

Significance
This is a probabilistic method based on the idea of assessing the probability
of finding such dense subgraphs in an (ER) random graph [5].

Surprise
Another probabilistic method, but rather than the probability of finding dense
subgraphs, it focuses on the probability of so many edges within communities
[6, 7].


INSTALLATION
============

In short, for Unix: ``sudo pip install louvain``.
For Windows: download the binary installers.

For Unix like systems it is possible to install from source. For Windows this is
overly complicated, and you are recommended to use the binary installation files.
There are two things that are needed by this package: the igraph c core library
and the python-igraph python package. For both, please see http://igraph.org.

There are basically two installation modes, similar to the python-igraph package
itself (from which most of the setup.py comes).

1. No C core library is installed yet. The packages will be compiled and linked
statically to an automatically downloaded version of the C core library of
igraph.
2. A C core library is already installed. In this case, the package will link
dynamically to the already installed version. This is probably also the
version that is used by the igraph package, but you may want to double check
this.

In case the python-igraph package is already installed before, make sure that
both use the **same versions**.

The cleanest setup it to install and compile the C core library yourself (make
sure that the header files are also included, e.g. install also the development
package from igraph). Then both the python-igraph package, as well as this
package are compiled and (dynamically) linked to the same C core library.

TROUBLESHOOTING
===============

In case of any problems, best to start over with a clean environment. Make sure
you remove the python-igraph package completely, remove the C core library and
remove the louvain package. Then, do a complete reinstall starting from ``pip
install louvain``. In case you want a dynamic library be sure to then install
the C core library from source before. Make sure you **install the same
versions**.

USAGE
=====

There is no standalone version of louvain-igraph, and you will always need
python to access it. There are no plans for developing a standalone version or R
support. So, use python. Please refer to the documentation within the python
package for more details on function calls and parameters.

To start, make sure to import the packages:
```python
import louvain
import igraph as ig
```

We'll create a random graph for testing purposes:
```python
G = ig.Graph.Erdos_Renyi(100, 0.1);
```

For simply finding a partition use:
```python
part = louvain.find_partition(G, method='Modularity');
```

Notice that ``part`` now contains an additional variable, ``part.quality`` which
stores the quality of the partition as calculated by the used method. You can
always get the quality of the partition using another method by calling
```python
part.significance = louvain.quality(G, partition, method='Significance');
```

You can also find partition for multiplex graphs. For each layer you then
specify the objective function, and the overall objective function is simply the
sum over all layers, weighted by some weight. If we denote by ``q_k`` the quality
of layer ``k`` and the weight by ``w_k``, the overall quality is then ``q = sum_k
w_k q_k``. This can also be useful in case you have negative links. In
principle, this could also be used to detect temporal communities in a dynamic
setting, cf. [8].

For example, assuming you have a graph with positive weights ``G_positive`` and
a graph with negative weights ``G_negative``, and you want to use Modularity for
finding a partition, you can use
```python
membership, quality = louvain.find_partition_multiplex([
louvain.Layer(graph=G_positive, method='Modularity', layer_weight=1.0),
louvain.Layer(graph=G_negative, method='Modularity', layer_weight=-1.0)])
```

Notice the negative layer weight is ``-1.0`` for the negative graph, since we
want those edges to fall between communities rather than within. One particular
problem when using negative links, is that the optimal community is no longer
guaranteed to be connected (it may be a multipartite partition). You may
therefore need the options consider_comms=ALL_COMMS to improve the quality of
the partition. Notice that this runs much slower than only considering
neighbouring communities (which is the default).

Various methods (such as Reichardt and Bornholdt's Potts model, or CPM) support
a (linear) resolution parameter, which can be effectively bisected, cf. [5]. You
can do this by calling:
```python
res_parts = louvain.bisect(G, method='CPM', resolution_range=[0,1]);
```
Notice this may take some time to run, as it effectively calls
louvain.find_partition for various resolution parameters (depending on the
settings possibly hundreds of times).

Then ``res_parts`` is a dictionary containing as keys the resolution, and as
values a ``NamedTuple`` with variables ``partition`` and ``bisect_value``, which
contains the partition and the value at which the resolution was bisected (the
value of the ``bisect_func`` of the ``bisect`` function). You could for example
plot the bisection value of all the found partitions by using:
```python
import pandas as pd
import matplotlib.pyplot as plt
res_df = pd.DataFrame({
'resolution': res_parts.keys(),
'bisect_value': [bisect.bisect_value for bisect in res_parts.values()]});
plt.step(res_df['resolution'], res_df['bisect_value']);
plt.xscale('log');
```

REFERENCES
==========

Please cite the references appropriately in case they are used.

1. Blondel, V. D., Guillaume, J.-L., Lambiotte, R. & Lefebvre, E. Fast unfolding
of communities in large networks. J. Stat. Mech. 2008, P10008 (2008).
2. Newman, M. & Girvan, M. Finding and evaluating community structure in networks.
Physical Review E 69, 026113 (2004).
3. Reichardt, J. & Bornholdt, S. Partitioning and modularity of graphs with arbitrary
degree distribution. Physical Review E 76, 015102 (2007).
4. Traag, V. A., Van Dooren, P. & Nesterov, Y. Narrow scope for resolution-limit-free
community detection. Physical Review E 84, 016114 (2011).
5. Traag, V. A., Krings, G. & Van Dooren, P. Significant scales in community structure.
Scientific Reports 3, 2930 (2013).
6. Aldecoa, R. & Marín, I. Surprise maximization reveals the community structure
of complex networks. Scientific reports 3, 1060 (2013).
7. Traag, V.A., Aldecoa, R. & Delvenne, J.-C. Detecting communities using Asymptotical
Surprise. Forthcoming (2015).
8. Mucha, P. J., Richardson, T., Macon, K., Porter, M. A. & Onnela, J.-P.
Community structure in time-dependent, multiscale, and multiplex networks.
Science 328, 876–8 (2010).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

louvain-0.5.2.tar.gz (45.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

louvain-0.5.2.win-amd64-py3.4.msi (139.3 kB view details)

Uploaded Source

louvain-0.5.2.win-amd64-py2.7.msi (420.4 kB view details)

Uploaded Source

louvain-0.5.2.win32-py3.4.msi (128.0 kB view details)

Uploaded Source

louvain-0.5.2.win32-py2.7.msi (390.7 kB view details)

Uploaded Source

louvain-0.5.2-py3.4-linux-x86_64.egg (371.3 kB view details)

Uploaded Egg

louvain-0.5.2-py2.7-linux-x86_64.egg (370.8 kB view details)

Uploaded Egg

File details

Details for the file louvain-0.5.2.tar.gz.

File metadata

  • Download URL: louvain-0.5.2.tar.gz
  • Upload date:
  • Size: 45.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for louvain-0.5.2.tar.gz
Algorithm Hash digest
SHA256 472c0c4fe7dabebe7ceb0a434008a016d74e583449aab6878e90c8ef7e76a2e1
MD5 3e191dc012f55f8983651ff9aed514d3
BLAKE2b-256 3499f2a701c4fd24992a8747db50052018cc3bba5f5bd19890358e326d163d3a

See more details on using hashes here.

File details

Details for the file louvain-0.5.2.win-amd64-py3.4.msi.

File metadata

File hashes

Hashes for louvain-0.5.2.win-amd64-py3.4.msi
Algorithm Hash digest
SHA256 1d96c36fa516e97fa5a91fc75f9bd5de7790a697542b69a995651efd82f5c9b4
MD5 1d1199d391e531f29d49bab79e728d3a
BLAKE2b-256 ddf4b0b7a76701ca0fcb596ab719349e869cc569a1a582c4fe6249742433233e

See more details on using hashes here.

File details

Details for the file louvain-0.5.2.win-amd64-py2.7.msi.

File metadata

File hashes

Hashes for louvain-0.5.2.win-amd64-py2.7.msi
Algorithm Hash digest
SHA256 3b5035316e45119f40c7289fd5998ed7e8b60e2fa463b7c0df31183d71d0b87c
MD5 a2c1318c0f448cf974232dab97379b7a
BLAKE2b-256 48577ff16483735a2b2f5152ec5a7d6bbae2c7dd38a8716b01c7121efa3bb466

See more details on using hashes here.

File details

Details for the file louvain-0.5.2.win32-py3.4.msi.

File metadata

File hashes

Hashes for louvain-0.5.2.win32-py3.4.msi
Algorithm Hash digest
SHA256 100db787f285788f9a60e41172a5aeebc93118915141fa929c61fc84794bcd30
MD5 102d68e754aa32906286b42250337f6b
BLAKE2b-256 0d14a7d146f3586e7b120fa95eaa8a291960b7171e301f9ba6a1e71e3dab87a0

See more details on using hashes here.

File details

Details for the file louvain-0.5.2.win32-py2.7.msi.

File metadata

File hashes

Hashes for louvain-0.5.2.win32-py2.7.msi
Algorithm Hash digest
SHA256 93fb56285153d82d0dfe6da4f3ae86fcc3a94f94720fd16c1a4ab43e471934f3
MD5 8144c6a3cf2c5451de4f2ca53b5c8057
BLAKE2b-256 73ec9f693a49b24a7ab3c3dad50da47d6dddd8527cd54a39f04f4a199481c850

See more details on using hashes here.

File details

Details for the file louvain-0.5.2-py3.4-linux-x86_64.egg.

File metadata

File hashes

Hashes for louvain-0.5.2-py3.4-linux-x86_64.egg
Algorithm Hash digest
SHA256 ec1b01781f5383163978589a198b1a8571953bf99ad97f97db6061446ab65219
MD5 c75a5b3b9407362664ed4d83b02ddce8
BLAKE2b-256 d58be842ceda48069f430ac7583897f37e188c3f8818f0167cc2152b7f8a3ed0

See more details on using hashes here.

File details

Details for the file louvain-0.5.2-py2.7-linux-x86_64.egg.

File metadata

File hashes

Hashes for louvain-0.5.2-py2.7-linux-x86_64.egg
Algorithm Hash digest
SHA256 269c9c83a768f060a86d0632747426d18b1b0e82c7a12310ef8f7de579c2d263
MD5 95946dc597344612ae5af6ea0f036fc0
BLAKE2b-256 2b5b44fb427436db28e9da2072cf4428c272b14e9dd696daaa6061fe5ad55e45

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page