The goal of invertiforms is to provide composable, invertible transformations of sparse matrices. These transformations are primarily useful for network analysis. For example, we provide transforms to row and column center a graph adjacency matrix. This transformation could then be composed with a degree-normalized transformation, and so on. The original adjacency matrix can be recovered by applying inverse transformation. Primarily, this package is for other developers working on spectral matrix packages, but it may also be useful for advanced users who don’t want to go to the hassle of coding up matrix transformations on their own.
You can install the released version of invertiforms from CRAN with:
install.packages("invertiforms")
You can install the development version from GitHub with:
# install.packages("devtools")
::install_github("RoheLab/invertiforms") devtools
At the moment, we provide convenient tools to:
a matrix. Similarly, we provide tools to transform a graph adjacency matrix into the:
Here we show how invertiforms
might help you quickly
perform regularized spectral clustering. First we grab some network data
and quickly visualize the adjacency matrix.
library(invertiforms)
#> Loading required package: Matrix
#>
#> Attaching package: 'invertiforms'
#> The following object is masked from 'package:base':
#>
#> transform
library(igraph)
#>
#> Attaching package: 'igraph'
#> The following objects are masked from 'package:stats':
#>
#> decompose, spectrum
#> The following object is masked from 'package:base':
#>
#> union
library(igraphdata)
data("karate", package = "igraphdata")
<- get.adjacency(karate)
A image(A)
Now we construct the regularized degree normalized graph Laplacian and visualize it.
<- RegularizedLaplacian(A, tau_row = 35, tau_col = 35)
iform
<- transform(iform, A)
L image(L)
Recovering A
from L
is straightforward:
<- inverse_transform(iform, L)
A_recovered
all.equal(A, A_recovered, check.attributes = FALSE)
#> [1] TRUE
Once we have L
we can do spectral tricks with it. Here
we estimate k = 2
clusters.
set.seed(27)
<- 2
k <- svd(L, k)
L_svd
<- function(x, eps = 1e-10) {
safe_project_sphere_rowwise <- drop(apply(x, 1L, function(y) sum(y^2)))
sc < eps] <- 1
sc[sc / sqrt(sc)
x
}
<- safe_project_sphere_rowwise(L_svd$u)
U <- kmeans(U, k, nstart = 50)
km
V(karate)$color <- km$cluster
plot(karate)
recipes
provides non-invertible, composable transformations for tabular data. softImpute
provides an Incomplete
S4 Matrix class that can be used for
double centering sparse matrices.