Learn R Programming

rsvd (version 1.0.5)

rrpca: Randomized robust principal component analysis (rrpca).

Description

Robust principal components analysis separates a matrix into a low-rank plus sparse component.

Usage

rrpca(
  A,
  lambda = NULL,
  maxiter = 50,
  tol = 1e-05,
  p = 10,
  q = 2,
  trace = FALSE,
  rand = TRUE
)

Arguments

A

array_like; a real \((m, n)\) input matrix (or data frame) to be decomposed. na.omit is applied, if the data contain \(NA\)s.

lambda

scalar, optional; tuning parameter (default \(lambda = max(m,n)^-0.5\)).

maxiter

integer, optional; maximum number of iterations (default \(maxiter = 50\)).

tol

scalar, optional; precision parameter (default \(tol = 1.0e-5\)).

p

integer, optional; oversampling parameter for \(rsvd\) (default \(p=10\)), see rsvd.

q

integer, optional; number of additional power iterations for \(rsvd\) (default \(q=2\)), see rsvd.

trace

bool, optional; print progress.

rand

bool, optional; if (\(TRUE\)), the \(rsvd\) routine is used, otherwise \(svd\) is used.

Value

rrpca returns a list containing the following components:

L

array_like; low-rank component; \((m, n)\) dimensional array.

S

array_like sparse component; \((m, n)\) dimensional array.

Details

Robust principal component analysis (RPCA) is a method for the robust seperation of a a rectangular \((m,n)\) matrix \(A\) into a low-rank component \(L\) and a sparse comonent \(S\):

$$A = L + S$$

To decompose the matrix, we use the inexact augmented Lagrange multiplier method (IALM). The algorithm can be used in combination with either the randomized or deterministic SVD.

References

  • [1] N. B. Erichson, S. Voronin, S. L. Brunton and J. N. Kutz. 2019. Randomized Matrix Decompositions Using R. Journal of Statistical Software, 89(11), 1-48. 10.18637/jss.v089.i11.

  • [2] Lin, Zhouchen, Minming Chen, and Yi Ma. "The augmented lagrange multiplier method for exact recovery of corrupted low-rank matrices." (2010). (available at arXiv https://arxiv.org/abs/1009.5055).

Examples

Run this code
# NOT RUN {
library('rsvd')

# Create toy video
# background frame
xy <- seq(-50, 50, length.out=100)
mgrid <- list( x=outer(xy*0,xy,FUN="+"), y=outer(xy,xy*0,FUN="+") )
bg <- 0.1*exp(sin(-mgrid$x**2-mgrid$y**2))
toyVideo <- matrix(rep(c(bg), 100), 100*100, 100)

# add moving object
for(i in 1:90) {
  mobject <- matrix(0, 100, 100)
  mobject[i:(10+i), 45:55] <- 0.2
  toyVideo[,i] =  toyVideo[,i] + c( mobject )
}

# Foreground/Background separation
out <- rrpca(toyVideo, trace=TRUE)

# Display results of the seperation for the 10th frame
par(mfrow=c(1,4))
image(matrix(bg, ncol=100, nrow=100)) #true background
image(matrix(toyVideo[,10], ncol=100, nrow=100)) # frame
image(matrix(out$L[,10], ncol=100, nrow=100)) # seperated background
image(matrix(out$S[,10], ncol=100, nrow=100)) #seperated foreground
# }

Run the code above in your browser using DataLab