| """ |
| Spectral bipartivity measure. |
| """ |
|
|
| import networkx as nx |
|
|
| __all__ = ["spectral_bipartivity"] |
|
|
|
|
| @nx._dispatchable(edge_attrs="weight") |
| def spectral_bipartivity(G, nodes=None, weight="weight"): |
| """Returns the spectral bipartivity. |
| |
| Parameters |
| ---------- |
| G : NetworkX graph |
| |
| nodes : list or container optional(default is all nodes) |
| Nodes to return value of spectral bipartivity contribution. |
| |
| weight : string or None optional (default = 'weight') |
| Edge data key to use for edge weights. If None, weights set to 1. |
| |
| Returns |
| ------- |
| sb : float or dict |
| A single number if the keyword nodes is not specified, or |
| a dictionary keyed by node with the spectral bipartivity contribution |
| of that node as the value. |
| |
| Examples |
| -------- |
| >>> from networkx.algorithms import bipartite |
| >>> G = nx.path_graph(4) |
| >>> bipartite.spectral_bipartivity(G) |
| 1.0 |
| |
| Notes |
| ----- |
| This implementation uses Numpy (dense) matrices which are not efficient |
| for storing large sparse graphs. |
| |
| See Also |
| -------- |
| color |
| |
| References |
| ---------- |
| .. [1] E. Estrada and J. A. Rodríguez-Velázquez, "Spectral measures of |
| bipartivity in complex networks", PhysRev E 72, 046105 (2005) |
| """ |
| import scipy as sp |
|
|
| nodelist = list(G) |
| A = nx.to_numpy_array(G, nodelist, weight=weight) |
| expA = sp.linalg.expm(A) |
| expmA = sp.linalg.expm(-A) |
| coshA = 0.5 * (expA + expmA) |
| if nodes is None: |
| |
| return float(coshA.diagonal().sum() / expA.diagonal().sum()) |
| else: |
| |
| index = dict(zip(nodelist, range(len(nodelist)))) |
| sb = {} |
| for n in nodes: |
| i = index[n] |
| sb[n] = coshA.item(i, i) / expA.item(i, i) |
| return sb |
|
|