#devtools::use_package("testthat")
#library('testthat')
context("Randomized PCA")
#Load rsvd library
library(rsvd)
#Set seed
set.seed(1234)
#Set p, q
p=5
q=1
#Accuray
atol_float64 <- 1e-8
#*************************************************************************************
# Test: Randomized PCA - center = TRUE, scale. = TRUE
#*************************************************************************************
#Create real random test matrix of dimension m x n with target rank k
m = 50
n = 30
k = 10
testMat <- matrix(runif(m*k), m, k)
testMat <- testMat %*% t(testMat)
testMat <- testMat[,1:n]
#Deterministic PCA
pca_out <- prcomp(testMat, center = TRUE, scale. = TRUE)
#Randomized PCA
rpca_out <- rpca(testMat, k=k)
testthat::test_that("Test 1: standard", {
testthat::expect_equal(pca_out$sdev[1:k], rpca_out$sdev[1:k])
testthat::expect_equal(sum(diag(1,k,k) - H(rpca_out$rotation)%*%rpca_out$rotation), 0 )
})
#Randomized PCA
rpca_out <- rpca(testMat, k=k-5, p=5, q=0)
testthat::test_that("Test 2: standard 2", {
testthat::expect_equal(pca_out$sdev[1:(k-5)], rpca_out$sdev[1:(k-5)])
testthat::expect_equal(sum(diag(1,k-5,k-5) - H(rpca_out$rotation)%*%rpca_out$rotation), 0 )
})
#Randomized PCA
rpca_out <- rpca(testMat, k=k)
cum_var = cumsum(rpca_out$sdev**2 / rpca_out$var)
testthat::test_that("Test 3: cumsum", {
testthat::expect_equal(cum_var[k], 1)
})
#*************************************************************************************
# Test: Randomized PCA Complex - center = TRUE, scale. = TRUE
#*************************************************************************************
testMat <- matrix(runif(m*k), m, k) + 1i* matrix(runif(m*k), m, k)
#Deterministic PCA
pca_out <- prcomp(testMat, center = TRUE, scale. = TRUE)
#Randomized PCA
rpca_out <- rpca(testMat, k=k)
testthat::test_that("Test 4: Complex", {
testthat::expect_equal(pca_out$sdev[1:k], rpca_out$sdev[1:k])
testthat::expect_equal(abs(sum(diag(1,k,k) - H(rpca_out$rotation)%*%rpca_out$rotation)), 0 )
})
#Randomized PCA
rpca_out <- rpca(testMat, k=k, p=5, q=0)
testthat::test_that("Test 5: Complex", {
testthat::expect_equal(pca_out$sdev[1:(k)], rpca_out$sdev[1:(k)])
testthat::expect_equal(abs(sum(diag(1,k,k) - H(rpca_out$rotation)%*%rpca_out$rotation)), 0 )
})
#Randomized PCA
rpca_out <- rpca(testMat, k=k)
cum_var = cumsum(rpca_out$sdev**2 / rpca_out$var)
testthat::test_that("Test 6: Complex", {
testthat::expect_equal(cum_var[k], 1)
})
#*************************************************************************************
# Test: Randomized PCA - center = T, scale. = F
#*************************************************************************************
#Deterministic PCA
pca_out <- prcomp(testMat, center = TRUE, scale. = FALSE)
#Randomized PCA
rpca_out <- rpca(testMat, k=k, center = TRUE, scale = FALSE)
testthat::test_that("Test 7: Complex", {
testthat::expect_equal(pca_out$sdev[1:k], rpca_out$sdev[1:k])
testthat::expect_equal(abs(sum(diag(1,k,k) - H(rpca_out$rotation)%*%rpca_out$rotation)), 0 )
})
#Randomized PCA
rpca_out <- rpca(testMat, k=k, p=5, q=0, center = TRUE, scale = FALSE)
testthat::test_that("Test 8: Complex", {
testthat::expect_equal(pca_out$sdev[1:(k)], rpca_out$sdev[1:(k)])
testthat::expect_equal(abs(sum(diag(1,k,k) - H(rpca_out$rotation)%*%rpca_out$rotation)), 0 )
})
#Randomized PCA
rpca_out <- rpca(testMat, k=k, center = TRUE, scale = FALSE)
cum_var = cumsum(rpca_out$sdev**2 / rpca_out$var)
testthat::test_that("Test 9: Complex", {
testthat::expect_equal(cum_var[k], 1)
})
#*************************************************************************************
# Test: Randomized PCA - Predict complex
#*************************************************************************************
#Deterministic PCA
pca_out <- prcomp(testMat, center = TRUE, scale. = FALSE)
#Randomized PCA
rpca_out <- rpca(testMat, k=k, retx=TRUE, center = TRUE, scale = FALSE)
testthat::test_that("Test 10: rPCA Predict 1", {
testthat::expect_equal(rpca_out$x %*% H(rpca_out$rotation), pca_out$x %*% H(pca_out$rotation))
})
#Randomized PCA
rpca_out <- rpca(testMat, k=k, retx=TRUE, center = TRUE, scale = FALSE)
preds <- predict(rpca_out, newdata = testMat)
testthat::test_that("Test 11: rPCA Predict 2", {
testthat::expect_equal(preds %*% H(rpca_out$rotation), rpca_out$x %*% H(rpca_out$rotation) )
})
#*************************************************************************************
# Test: Randomized PCA - Predict real
#*************************************************************************************
testMat <- matrix(runif(m*k), m, k)
#Deterministic PCA
pca_out <- prcomp(testMat, center = FALSE, scale. = FALSE)
#Randomized PCA
rpca_out <- rpca(testMat, k=k, retx=TRUE, center = FALSE, scale = FALSE)
testthat::test_that("Test 12: rPCA Predict 3", {
testthat::expect_equal(rpca_out$x %*% H(rpca_out$rotation), pca_out$x %*% H(pca_out$rotation))
})
#Randomized PCA
rpca_out <- rpca(testMat, k=k, retx=FALSE, center = FALSE, scale = FALSE)
preds <- predict(rpca_out, newdata = testMat)
testthat::test_that("Test 13: rPCA Predict 5", {
testthat::expect_equal(preds %*% H(rpca_out$rotation), pca_out$x %*% H(pca_out$rotation) )
})
#Deterministic PCA
pca_out <- prcomp(testMat, center = TRUE, scale. = FALSE)
#Randomized PCA
rpca_out <- rpca(testMat, k=k, retx=TRUE, center = TRUE, scale = FALSE)
testthat::test_that("Test 14: rPCA Predict 6", {
testthat::expect_equal(rpca_out$x %*% H(rpca_out$rotation), pca_out$x %*% H(pca_out$rotation))
})
#Randomized PCA
rpca_out <- rpca(testMat, k=k, retx=FALSE, center = TRUE, scale = FALSE)
preds <- predict(rpca_out, newdata = testMat)
testthat::test_that("Test 15: rPCA Predict 7", {
testthat::expect_equal(preds %*% H(rpca_out$rotation), pca_out$x %*% H(pca_out$rotation) )
})
#Deterministic PCA
pca_out <- prcomp(testMat, center = TRUE, scale. = TRUE)
#Randomized PCA
rpca_out <- rpca(testMat, k=k, retx=TRUE, center = TRUE, scale = TRUE)
testthat::test_that("Test 16: rPCA Predict 8", {
testthat::expect_equal(rpca_out$x %*% H(rpca_out$rotation), pca_out$x %*% H(pca_out$rotation))
})
#Randomized PCA
rpca_out <- rpca(testMat, k=k, retx=FALSE, center = TRUE, scale = TRUE)
preds <- predict(rpca_out, newdata = testMat)
testthat::test_that("Test 17: rPCA Predict 9", {
testthat::expect_equal(preds %*% H(rpca_out$rotation), pca_out$x %*% H(pca_out$rotation) )
})
#*************************************************************************************
# Test: Randomized PCA - Reconstruction error - real matrix
#*************************************************************************************
testMat <- matrix(runif(m*k), m, k)
#Randomized PCA
rpca_out <- rpca(testMat, k=k, retx=TRUE, center = FALSE, scale = FALSE)
Re <- t(t(rpca_out$x %*% t(rpca_out$rotation)) + rpca_out$center)
testthat::test_that("Test 18: rPCA reconstruction 1", {
testthat::expect_equal(Re, testMat )
})
#Deterministic PCA
pca_out <- prcomp(testMat, center = TRUE, scale. = FALSE)
Re <- t(t(pca_out$x %*% H(pca_out$rotation)) + pca_out$center)
rpca_out <- rpca(testMat, k=k, retx=TRUE, center = TRUE, scale = FALSE)
Re2 <- t(t(rpca_out$x %*% H(rpca_out$rotation)) + pca_out$center)
testthat::test_that("Test 19: rPCA reconstruction 2", {
testthat::expect_equal(Re, Re2 )
})
#Deterministic PCA
pca_out <- prcomp(testMat, center = TRUE, scale. = TRUE)
Re <- t(t(pca_out$x %*% H(pca_out$rotation)) + pca_out$center)
rpca_out <- rpca(testMat, k=k, retx=TRUE, center = TRUE, scale = TRUE)
Re2 <- t(t(rpca_out$x %*% H(rpca_out$rotation)) + pca_out$center)
testthat::test_that("Test 20: rPCA reconstruction 3", {
testthat::expect_equal(Re, Re2 )
})
#*************************************************************************************
# Test: Randomized PCA - Reconstruction error
#*************************************************************************************
testMat <- matrix(runif(m*k), m, k) + 1i * matrix(runif(m*k), m, k)
#Deterministic PCA
pca_out <- prcomp(testMat, center = FALSE, scale. = FALSE)
Re <- pca_out$x %*% H(pca_out$rotation)
#Randomized PCA
rpca_out <- rpca(testMat, k=k, retx=TRUE, center = FALSE, scale = FALSE)
Re2 <- rpca_out$x %*% H(rpca_out$rotation)
testthat::test_that("Test 21: rPCA reconstruction 4", {
testthat::expect_equal(Re, Re2 )
})
#*************************************************************************************
# Test: Randomized PCA - Transposed input matrix
#*************************************************************************************
testMat <- H(testMat)
#Deterministic PCA
pca_out <- prcomp(testMat, center = TRUE, scale. = TRUE)
#Randomized PCA
rpca_out <- rpca(testMat, k=k)
testthat::test_that("Test 22: Randomized SVD k=n", {
testthat::expect_equal(pca_out$sdev[1:k], rpca_out$sdev[1:k])
testthat::expect_equal(H(pca_out$rotation)%*%pca_out$rotation, H(rpca_out$rotation)%*%rpca_out$rotation)
})
#*************************************************************************************
# Test: Randomized PCA - Transposed input matrix
#*************************************************************************************
testMat <- matrix(runif(m*k), m, k) + 1i* matrix(runif(m*k), m, k)
testMat <- H(testMat)
#Deterministic PCA
pca_out <- prcomp(testMat, center = TRUE, scale. = TRUE)
#Randomized PCA
rpca_out <- rpca(testMat, k=k)
testthat::test_that("Test 23: Randomized SVD k=n", {
testthat::expect_equal(pca_out$sdev[1:k], rpca_out$sdev[1:k])
testthat::expect_equal(H(pca_out$rotation)%*%pca_out$rotation, H(rpca_out$rotation)%*%rpca_out$rotation)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.