R/embedding.R

Defines functions spectral_embedding laplacian

Documented in laplacian spectral_embedding

laplacian <- function(graph, normed = FALSE) {
  diag(graph) <- 0

  w <- rowSums(graph)
  if (normed) {
    isolated_node_mask <- (w == 0)
    w <- sqrt(w)
    w[isolated_node_mask] <- 1
    graph <- graph / w
    graph <- t(t(graph) / w)
    w <- 1 - isolated_node_mask
  }

  graph <- graph * -1
  diag(graph) <- w

  return(graph)
}

spectral_embedding <- function(adjacency, n_components = 8) {

  # Laplacian
  laplacian <- laplacian(adjacency, normed = TRUE)

  # Eigenvector
  # Only one solver: LAPACK
  # TODO: Add more solvers
  embedding <- eigen(laplacian, symmetric = TRUE)$vectors

  # http://www.di.fc.ul.pt/~jpn/r/spectralclustering/spectralclustering.html#using-r-kernlab-package
  return(embedding[, (ncol(embedding)-n_components+1):ncol(embedding)])
}
arthans/SpectralClustering documentation built on Dec. 19, 2021, 4:41 a.m.