1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- """
- Spectral bipartivity measure.
- """
- import networkx as nx
- __all__ = ["spectral_bipartivity"]
- 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
- import scipy.linalg # call as sp.linalg
- nodelist = list(G) # ordering of nodes in matrix
- 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 single number for entire graph
- return coshA.diagonal().sum() / expA.diagonal().sum()
- else:
- # contribution for individual nodes
- index = dict(zip(nodelist, range(len(nodelist))))
- sb = {}
- for n in nodes:
- i = index[n]
- sb[n] = coshA[i, i] / expA[i, i]
- return sb
|