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)])
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.