Esempio n. 1
0
def vnge_naive(adjacency):
    """Computes Von Neumann Graph Entropy (VNGE) with full eigendecomposition.

  Args:
    adjacency (spmatrix): Input sparse adjacency matrix of a graph.

  Returns:
    float: Von Neumann entropy of the graph.
  """
    density = laplacian(adjacency, normalized=False)
    density.data /= np.sum(density.diagonal())
    eigenvalues, _ = scipy.linalg.eigh(density.todense())
    return -np.where(eigenvalues > 0, eigenvalues * np.log(eigenvalues),
                     0).sum()
Esempio n. 2
0
def netlsd_naive(adjacency, timescales=np.logspace(-2, 2, 256)):
    """Computes NetLSD with full eigendecomposition, in a naïve way.

  Args:
    adjacency (spmatrix): Input sparse adjacency matrix of a graph.
    timescales (np.ndarray): A 1D array with the timescale parameter of NetLSD.
      Default value is the one used in both NetLSD and SLaQ papers.

  Returns:
    np.ndarray: NetLSD descriptors of the graph.
  """
    lap = laplacian(adjacency)
    lambdas, _ = scipy.linalg.eigh(lap.todense())
    return np.exp(-np.outer(timescales, lambdas)).sum(axis=-1)
Esempio n. 3
0
def vnge(adjacency, lanczos_steps=10, nvectors=100):
    """Computes Von Neumann Graph Entropy (VNGE) using SLaQ.

  Args:
    adjacency (scipy.sparse.base.spmatrix): Input adjacency matrix of a graph.
    lanczos_steps (int): Number of Lanczos steps. Setting lanczos_steps=10 is
      the default from SLaQ.
    nvectors (int): Number of random vectors for stochastic estimation. Setting
      nvectors=10 is the default values from the SLaQ paper.

  Returns:
    float: Approximated VNGE.
  """
    if adjacency.nnz == 0:  # By convention, if x=0, x*log(x)=0.
        return 0
    density = laplacian(adjacency, False)
    density.data /= np.sum(density.diagonal()).astype(np.float32)
    return _slq_red_var_vnge(density, lanczos_steps, nvectors)
Esempio n. 4
0
def netlsd(adjacency,
           timescales=np.logspace(-2, 2, 256),
           lanczos_steps=10,
           nvectors=100,
           normalization=None):
    """Computes NetLSD descriptors using SLaQ.

  Args:
    adjacency (sparse matrix): Input adjacency matrix of a graph.
    timescales (np.ndarray): Timescale parameter for NetLSD computation. Default
      value is the one used in both NetLSD and SLaQ papers.
    lanczos_steps (int): Number of Lanczos steps. Setting lanczos_steps=10 is
      the default from SLaQ.
    nvectors (int): Number of random vectors for stochastic estimation. Setting
      nvectors=10 is the default values from the SLaQ paper.
    normalization (str): Normalization type for NetLSD.

  Returns:
    np.ndarray: Approximated NetLSD descriptors.
  """
    lap = laplacian(adjacency, True)
    hkt = _slq_red_var_netlsd(
        lap, lanczos_steps, nvectors,
        timescales)  # Approximated Heat Kernel Trace (hkt).
    if normalization is None:
        return hkt
    n = lap.shape[0]
    if normalization == 'empty':
        return hkt / n
    elif normalization == 'complete':
        return hkt / (1 + (n - 1) * np.exp(-timescales))
    elif normalization is None:
        return hkt
    else:
        raise ValueError(
            "Unknown normalization type: expected one of [None, 'empty', 'complete'], got",
            normalization)