Spaces:
Running
Running
""" | |
Communicability. | |
""" | |
import networkx as nx | |
from networkx.utils import not_implemented_for | |
__all__ = ["communicability", "communicability_exp"] | |
def communicability(G): | |
r"""Returns communicability between all pairs of nodes in G. | |
The communicability between pairs of nodes in G is the sum of | |
walks of different lengths starting at node u and ending at node v. | |
Parameters | |
---------- | |
G: graph | |
Returns | |
------- | |
comm: dictionary of dictionaries | |
Dictionary of dictionaries keyed by nodes with communicability | |
as the value. | |
Raises | |
------ | |
NetworkXError | |
If the graph is not undirected and simple. | |
See Also | |
-------- | |
communicability_exp: | |
Communicability between all pairs of nodes in G using spectral | |
decomposition. | |
communicability_betweenness_centrality: | |
Communicability betweenness centrality for each node in G. | |
Notes | |
----- | |
This algorithm uses a spectral decomposition of the adjacency matrix. | |
Let G=(V,E) be a simple undirected graph. Using the connection between | |
the powers of the adjacency matrix and the number of walks in the graph, | |
the communicability between nodes `u` and `v` based on the graph spectrum | |
is [1]_ | |
.. math:: | |
C(u,v)=\sum_{j=1}^{n}\phi_{j}(u)\phi_{j}(v)e^{\lambda_{j}}, | |
where `\phi_{j}(u)` is the `u\rm{th}` element of the `j\rm{th}` orthonormal | |
eigenvector of the adjacency matrix associated with the eigenvalue | |
`\lambda_{j}`. | |
References | |
---------- | |
.. [1] Ernesto Estrada, Naomichi Hatano, | |
"Communicability in complex networks", | |
Phys. Rev. E 77, 036111 (2008). | |
https://arxiv.org/abs/0707.0756 | |
Examples | |
-------- | |
>>> G = nx.Graph([(0, 1), (1, 2), (1, 5), (5, 4), (2, 4), (2, 3), (4, 3), (3, 6)]) | |
>>> c = nx.communicability(G) | |
""" | |
import numpy as np | |
nodelist = list(G) # ordering of nodes in matrix | |
A = nx.to_numpy_array(G, nodelist) | |
# convert to 0-1 matrix | |
A[A != 0.0] = 1 | |
w, vec = np.linalg.eigh(A) | |
expw = np.exp(w) | |
mapping = dict(zip(nodelist, range(len(nodelist)))) | |
c = {} | |
# computing communicabilities | |
for u in G: | |
c[u] = {} | |
for v in G: | |
s = 0 | |
p = mapping[u] | |
q = mapping[v] | |
for j in range(len(nodelist)): | |
s += vec[:, j][p] * vec[:, j][q] * expw[j] | |
c[u][v] = float(s) | |
return c | |
def communicability_exp(G): | |
r"""Returns communicability between all pairs of nodes in G. | |
Communicability between pair of node (u,v) of node in G is the sum of | |
walks of different lengths starting at node u and ending at node v. | |
Parameters | |
---------- | |
G: graph | |
Returns | |
------- | |
comm: dictionary of dictionaries | |
Dictionary of dictionaries keyed by nodes with communicability | |
as the value. | |
Raises | |
------ | |
NetworkXError | |
If the graph is not undirected and simple. | |
See Also | |
-------- | |
communicability: | |
Communicability between pairs of nodes in G. | |
communicability_betweenness_centrality: | |
Communicability betweenness centrality for each node in G. | |
Notes | |
----- | |
This algorithm uses matrix exponentiation of the adjacency matrix. | |
Let G=(V,E) be a simple undirected graph. Using the connection between | |
the powers of the adjacency matrix and the number of walks in the graph, | |
the communicability between nodes u and v is [1]_, | |
.. math:: | |
C(u,v) = (e^A)_{uv}, | |
where `A` is the adjacency matrix of G. | |
References | |
---------- | |
.. [1] Ernesto Estrada, Naomichi Hatano, | |
"Communicability in complex networks", | |
Phys. Rev. E 77, 036111 (2008). | |
https://arxiv.org/abs/0707.0756 | |
Examples | |
-------- | |
>>> G = nx.Graph([(0, 1), (1, 2), (1, 5), (5, 4), (2, 4), (2, 3), (4, 3), (3, 6)]) | |
>>> c = nx.communicability_exp(G) | |
""" | |
import scipy as sp | |
nodelist = list(G) # ordering of nodes in matrix | |
A = nx.to_numpy_array(G, nodelist) | |
# convert to 0-1 matrix | |
A[A != 0.0] = 1 | |
# communicability matrix | |
expA = sp.linalg.expm(A) | |
mapping = dict(zip(nodelist, range(len(nodelist)))) | |
c = {} | |
for u in G: | |
c[u] = {} | |
for v in G: | |
c[u][v] = float(expA[mapping[u], mapping[v]]) | |
return c | |