2019-09-16 09:28:06 +00:00
|
|
|
# library(CVEpureR)
|
|
|
|
# path <- '~/Projects/CVE/tmp/logger.R.pdf'
|
|
|
|
|
|
|
|
library(CVE)
|
2019-09-16 09:57:10 +00:00
|
|
|
path <- '~/Projects/CVE/tmp/logger.C.pdf'
|
2019-09-16 09:28:06 +00:00
|
|
|
|
|
|
|
epochs <- 100
|
|
|
|
attempts <- 25
|
|
|
|
|
|
|
|
# Define the logger for the `cve()` method.
|
|
|
|
logger <- function(env) {
|
|
|
|
# Note the `<<-` assignement!
|
|
|
|
loss.history[env$epoch + 1, env$attempt] <<- env$loss
|
|
|
|
error.history[env$epoch + 1, env$attempt] <<- env$error
|
|
|
|
tau.history[env$epoch + 1, env$attempt] <<- env$tau
|
|
|
|
# Compute true error by comparing to the true `B`
|
|
|
|
B.est <- null(env$V) # Function provided by CVE
|
|
|
|
P.est <- B.est %*% solve(t(B.est) %*% B.est) %*% t(B.est)
|
|
|
|
true.error <- norm(P - P.est, 'F') / sqrt(2 * k)
|
|
|
|
true.error.history[env$epoch + 1, env$attempt] <<- true.error
|
|
|
|
}
|
|
|
|
|
|
|
|
pdf(path)
|
|
|
|
par(mfrow = c(2, 2))
|
|
|
|
|
|
|
|
for (name in paste0("M", seq(5))) {
|
|
|
|
# Seed random number generator
|
|
|
|
set.seed(42)
|
|
|
|
|
|
|
|
# Create a dataset
|
|
|
|
ds <- dataset(name)
|
|
|
|
X <- ds$X
|
|
|
|
Y <- ds$Y
|
|
|
|
B <- ds$B # the true `B`
|
|
|
|
k <- ncol(ds$B)
|
|
|
|
# True projection matrix.
|
|
|
|
P <- B %*% solve(t(B) %*% B) %*% t(B)
|
|
|
|
|
|
|
|
# Setup histories.
|
|
|
|
loss.history <- matrix(NA, epochs + 1, attempts)
|
|
|
|
error.history <- matrix(NA, epochs + 1, attempts)
|
|
|
|
tau.history <- matrix(NA, epochs + 1, attempts)
|
|
|
|
true.error.history <- matrix(NA, epochs + 1, attempts)
|
|
|
|
|
|
|
|
dr <- cve(Y ~ X, k = k, logger = logger, epochs = epochs, attempts = attempts)
|
|
|
|
|
|
|
|
# Plot history's
|
|
|
|
matplot(loss.history, type = 'l', log = 'y', xlab = 'i (iteration)',
|
|
|
|
main = paste('loss', name),
|
|
|
|
ylab = expression(L(V[i])))
|
|
|
|
matplot(true.error.history, type = 'l', log = 'y', xlab = 'i (iteration)',
|
|
|
|
main = paste('true error', name),
|
|
|
|
ylab = expression(group('|', B * B^T - B[i] * B[i]^T, '|')[F] / sqrt(2 * k)))
|
|
|
|
matplot(error.history, type = 'l', log = 'y', xlab = 'i (iteration)',
|
|
|
|
main = paste('error', name),
|
|
|
|
ylab = expression(group('|', V[i-1] * V[i-1]^T - V[i] * V[i]^T, '|')[F]))
|
|
|
|
matplot(tau.history, type = 'l', log = 'y', xlab = 'i (iteration)',
|
|
|
|
main = paste('learning rate', name),
|
|
|
|
ylab = expression(tau[i]))
|
|
|
|
}
|