Learn R Programming

sparsesvd (version 0.2-2)

sparsesvd: Singular Value Decomposition of a Sparse Matrix.

Description

Compute the (usually truncated) singular value decomposition (SVD) of a sparse real matrix. This function is a shallow wrapper around the SVDLIBC implementation of Berry's (1992) single Lanczos algorithm.

Usage

sparsesvd(M, rank=0L, tol=1e-15, kappa=1e-6)

Value

The truncated SVD decomposition

$$ M_r = U_r D V_r^T $$

where \(M_r\) is the optimal rank \(r\) approximation of \(M\). Note that \(r\) may be smaller than the requested number rank of singular components.

The returned value is a list with components

d

a vector containing the first \(r\) singular values of M

u

a column matrix of the first \(r\) left singular vectors of M

v

a column matrix of the first \(r\) right singular vectors of M

Arguments

M

a sparse real matrix in Matrix package format. The preferred format is a dgCMatrix and other storage formats will automatically be converted if possible.

rank

an integer specifying the desired number of singular components, i.e. the rank of the truncated SVD. Specify 0 to return all singular values of magnitude larger than tol (default).

tol

exclude singular values whose magnitude is smaller than tol

kappa

accuracy parameter \(\kappa\) of the SVD algorithm (with SVDLIBC default)

References

The SVDLIBC homepage http://tedlab.mit.edu/~dr/SVDLIBC/ seems to be no longer available. A copy of the source code can be obtained from https://github.com/lucasmaystre/svdlibc.

Berry, Michael~W. (1992). Large scale sparse singular value computations. International Journal of Supercomputer Applications, 6, 13--49.

See Also

svd, sparseMatrix

Examples

Run this code
M <- rbind(
  c(20, 10, 15,  0,  2),
  c(10,  5,  8,  1,  0),
  c( 0,  1,  2,  6,  3),
  c( 1,  0,  0, 10,  5))
M <- Matrix::Matrix(M, sparse=TRUE)
print(M)

res <- sparsesvd(M, rank=2L) # compute first 2 singular components
print(res, digits=3)

M2 <- res$u %*% diag(res$d) %*% t(res$v) # rank-2 approximation
print(M2, digits=1)

print(as.matrix(M) - M2, digits=2) # approximation error

Run the code above in your browser using DataLab