diff --git a/LaTeX/main.bib b/LaTeX/main.bib index 09b7a8c..93b171c 100644 --- a/LaTeX/main.bib +++ b/LaTeX/main.bib @@ -1,12 +1,16 @@ @book{AbadirMagnus2005, - author = {Abadir, Karim M. and Magnus, Jan R.}, - year = {2005}, - title = {Matrix Algebra}, - publisher = {Cambridge University Press}, - doi = {10.1017/CBO9780511810800}, - collection = {Econometric Exercises}, - place = {Cambridge}, - series = {Econometric Exercises} + author = {Abadir, Karim M. and Magnus, Jan R.}, + year = {2005}, + title = {Matrix algebra}, + volume = {1}, + pages = {xxx+434}, + publisher = {Cambridge University Press, Cambridge}, + doi = {10.1017/CBO9780511810800}, + url = {https://doi.org/10.1017/CBO9780511810800}, + isbn = {978-0-521-53746-9; 0-521-53746-0}, + mrclass = {15-01 (91B02)}, + mrnumber = {2408356}, + series = {Econometric Exercises} } @book{AbsilEtAl2007, @@ -47,15 +51,16 @@ } @book{Arnold1981, - author = {Arnold, Steven F}, - year = {1981}, - title = {The theory of linear models and multivariate analysis}, - publisher = {Wiley}, - address = {New York, NY [u.a.]}, - isbn = {0471050652}, - keywords = {Multivariate Analyse}, - language = {eng}, - series = {Wiley series in probability and mathematical statistics : Probability and mathematical statistics} + author = {Arnold, Steven F.}, + year = {1981}, + title = {The theory of linear models and multivariate analysis}, + pages = {xvi+475}, + publisher = {John Wiley \& Sons, Inc., New York}, + isbn = {0-471-05065-2}, + mrclass = {62-01 (62J05)}, + mrnumber = {606011}, + mrreviewer = {Pi-Erh\ Lin}, + series = {Wiley Series in Probability and Mathematical Statistics} } @article{BanerjeeEtAl2008, @@ -438,11 +443,19 @@ } @book{Cook1998, - author = {Cook, Dennis R.}, - year = {1998}, - title = {Regression Graphics: Ideas for studying regressions through graphics}, - publisher = {Wiley}, - address = {New York} + author = {Cook, R. Dennis}, + year = {1998}, + title = {Regression graphics}, + pages = {xviii+349}, + publisher = {John Wiley \& Sons, Inc., New York}, + doi = {10.1002/9780470316931}, + url = {https://doi.org/10.1002/9780470316931}, + isbn = {0-471-19365-8}, + mrclass = {62-01 (62J05)}, + mrnumber = {1645673}, + mrreviewer = {Jon\ Stene}, + note = {Ideas for studying regressions through graphics, A Wiley-Interscience Publication}, + series = {Wiley Series in Probability and Statistics: Probability and Statistics} } @article{Cook2000, @@ -590,17 +603,19 @@ } @article{CoxWermuth1994, - author = {D. R. Cox and Nanny Wermuth}, - year = {1994}, - title = {A Note on the Quadratic Exponential Binary Distribution}, - journal = {Biometrika}, - volume = {81}, - number = {2}, - pages = {403--408}, - publisher = {[Oxford University Press, Biometrika Trust]}, - issn = {00063444}, - url = {http://www.jstor.org/stable/2336971}, - urldate = {2024-04-11} + author = {Cox, D. R. and Wermuth, Nanny}, + year = {1994}, + title = {A note on the quadratic exponential binary distribution}, + journal = {Biometrika}, + volume = {81}, + number = {2}, + pages = {403--408}, + issn = {0006-3444,1464-3510}, + doi = {10.1093/biomet/81.2.403}, + url = {https://doi.org/10.1093/biomet/81.2.403}, + fjournal = {Biometrika}, + mrclass = {62E15}, + mrnumber = {1294901} } @book{Dai2012, @@ -721,11 +736,20 @@ } @article{DrtonEtAl2020, - author = {Mathias Drton and Satoshi Kuriki and Peter D. Hoff}, - year = {2020}, - title = {Existence and uniqueness of the Kronecker covariance MLE}, - journal = {The Annals of Statistics}, - url = {https://api.semanticscholar.org/CorpusID:212718000} + author = {Drton, Mathias and Kuriki, Satoshi and Hoff, Peter}, + year = {2021}, + title = {Existence and uniqueness of the {K}ronecker covariance {MLE}}, + journal = {Ann. Statist.}, + volume = {49}, + number = {5}, + pages = {2721--2754}, + issn = {0090-5364,2168-8966}, + doi = {10.1214/21-aos2052}, + url = {https://doi.org/10.1214/21-aos2052}, + fjournal = {The Annals of Statistics}, + mrclass = {62H12 (62R01)}, + mrnumber = {4338381}, + mrreviewer = {Burcu\ H.\ Ucer} } @article{DrydenEtAl2009, diff --git a/LaTeX/paper.tex b/LaTeX/paper.tex index 8919c38..8e80308 100644 --- a/LaTeX/paper.tex +++ b/LaTeX/paper.tex @@ -5,13 +5,9 @@ \usepackage[utf8]{inputenc} \usepackage[LSF, T1]{fontenc} \usepackage{chessfss} -% \usepackage{fullpage} \usepackage{amsmath, amssymb, amstext, amsthm, scalerel, bm, pifont} \usepackage[dvipsnames]{xcolor} % dvipsnames loads more named colors \usepackage{graphicx} % colors, images and graphics -\usepackage{tikz} % TikZ (TeX ist kein Zeichenprogramm) -\usepackage{environ} % for dynamic TikZ picture scaling -\usepackage{algorithm, algpseudocode} % Pseudo Codes / Algorithms \usepackage[ style = authoryear, % citation style isbn = false, % show isbn? @@ -32,13 +28,9 @@ doi = true, bibencoding = utf8 ]{biblatex} - - \usepackage[pdftex, colorlinks, allcolors=blue]{hyperref} % Load as last package! Redefines commands \usepackage[noabbrev, capitalize, nameinlink]{cleveref} % but this after hyperref -\usetikzlibrary{calc, perspective, datavisualization} - \setcounter{MaxMatrixCols}{20} % Sets the max nr. of columns in AMSmath's matrix envs to 20 % Document meta into @@ -119,21 +111,21 @@ % \newcommand*{\ten}[1]{\mathcal{#1}} % \DeclareMathOperator{\sym}{sym} \renewcommand*{\vec}{\operatorname{vec}} -\newcommand*{\unvec}{\operatorname{vec^{-1}}} -\newcommand*{\reshape}[1]{\operatorname{reshape}_{#1}} +% \newcommand*{\unvec}{\operatorname{vec^{-1}}} +% \newcommand*{\reshape}[1]{\operatorname{reshape}_{#1}} \newcommand*{\vech}{\operatorname{vech}} \newcommand*{\rank}{\operatorname{rank}} \newcommand*{\diag}{\operatorname{diag}} -\newcommand*{\perm}[1]{\mathfrak{S}_{#1}} % set of permutations of size #1 -\newcommand*{\len}[1]{\#{#1}} % length of #1 -\DeclareMathOperator*{\ttt}{\circledast} +% \newcommand*{\perm}[1]{\mathfrak{S}_{#1}} % set of permutations of size #1 +% \newcommand*{\len}[1]{\#{#1}} % length of #1 +% \DeclareMathOperator*{\ttt}{\circledast} \DeclareMathOperator{\tr}{tr} \DeclareMathOperator{\var}{Var} \DeclareMathOperator{\cov}{Cov} \DeclareMathOperator{\Span}{span} \DeclareMathOperator{\E}{\operatorname{\mathbb{E}}} % \DeclareMathOperator{\independent}{{\bot\!\!\!\bot}} -\DeclareMathOperator*{\argmin}{{arg\,min}} +% \DeclareMathOperator*{\argmin}{{arg\,min}} \DeclareMathOperator*{\argmax}{{arg\,max}} \newcommand*{\D}{\textnormal{D}} % derivative \renewcommand*{\H}{\textnormal{H}} % hessian @@ -146,21 +138,21 @@ \renewcommand{\checkmark}{{\color{Green}\ding{51}}} \newcommand{\xmark}{{\color{Red!70}\ding{55}}} -% Pseudo Code Commands -\newcommand{\algorithmicbreak}{\textbf{break}} -\newcommand{\Break}{\State \algorithmicbreak} +% % Pseudo Code Commands +% \newcommand{\algorithmicbreak}{\textbf{break}} +% \newcommand{\Break}{\State \algorithmicbreak} % Special Matrix Sets (Manifolds) -\newcommand{\MatMani}[2]{\mathbb{R}^{{#1}\times {#2}}} +% \newcommand{\MatMani}[2]{\mathbb{R}^{{#1}\times {#2}}} \newcommand{\StiefelNonCompact}[2]{\mathbb{R}_{*}^{{#1}\times {#2}}} \newcommand{\Stiefel}[2]{\mathrm{St}^{{#1}\times {#2}}} -\newcommand{\MatRankMani}[3]{\mathbb{R}_{\rank={#1}}^{{#2}\times {#3}}} -\newcommand{\DiagZeroMat}[1]{\mathbb{R}_{\diag=0}^{{#1}\times {#1}}} +% \newcommand{\MatRankMani}[3]{\mathbb{R}_{\rank={#1}}^{{#2}\times {#3}}} +% \newcommand{\DiagZeroMat}[1]{\mathbb{R}_{\diag=0}^{{#1}\times {#1}}} \newcommand{\SymMat}[1]{\mathrm{Sym}^{{#1}\times {#1}}} -\newcommand{\SkewSymMat}[1]{\mathrm{Skew}^{{#1}\times {#1}}} +% \newcommand{\SkewSymMat}[1]{\mathrm{Skew}^{{#1}\times {#1}}} \newcommand{\SymPosDefMat}[1]{\mathrm{Sym}_{++}^{{#1}\times {#1}}} -\newcommand{\SymDiagZeroMat}[1]{\mathrm{Sym}_{\diag=0}^{p\times p}} -\newcommand{\SymBand}[2]{\mathrm{SymBand}^{{#1}\times {#1}}_{#2}} +% \newcommand{\SymDiagZeroMat}[1]{\mathrm{Sym}_{\diag=0}^{p\times p}} +% \newcommand{\SymBand}[2]{\mathrm{SymBand}^{{#1}\times {#1}}_{#2}} \newcommand{\OrthogonalGrp}[1]{\mathrm{O}(#1)} \newcommand{\SpecialOrthogonalGrp}[1]{\mathrm{SO}(#1)} @@ -233,23 +225,6 @@ \makeatother -%%% Scaling TikZ pictures using the `environ' package -% see: https://tex.stackexchange.com/questions/6388/how-to-scale-a-tikzpicture-to-textwidth -\makeatletter -\newsavebox{\measure@tikzpicture} -\NewEnviron{scaletikzpicturetowidth}[1]{% - \def\tikz@width{#1}% - \def\tikzscale{1}\begin{lrbox}{\measure@tikzpicture}% - \BODY - \end{lrbox}% - \pgfmathparse{#1/\wd\measure@tikzpicture}% - \edef\tikzscale{\pgfmathresult}% - \BODY -} -\makeatother - - - \newcommand{\smoothFunc}[2][\infty]{{C^{#2}(#1)}} \newcommand{\localSmoothFunc}[3][\infty]{{C^{#3}_{#1}(#2)}} \newcommand{\tangentSpace}[2]{\ensuremath{T_{#1}{#2}}} @@ -450,9 +425,7 @@ The reduction in vectorized form is $\vec\ten{R}(\ten{X})=\t{\mat{B}}\vec(\ten{X \begin{figure} \centering - \begin{scaletikzpicturetowidth}{0.5\textwidth} - \input{images/reduction.tex} - \end{scaletikzpicturetowidth} + \includegraphics{images/reduction.pdf} \caption{\label{fig:SDRvisual}Visual depiction of the sufficient reduction in \cref{thm:sdr}.} \end{figure} diff --git a/dataAnalysis/eeg/03_eeg_3d.R b/dataAnalysis/eeg/03_eeg_3d.R index ce7d384..8663966 100644 --- a/dataAnalysis/eeg/03_eeg_3d.R +++ b/dataAnalysis/eeg/03_eeg_3d.R @@ -44,7 +44,6 @@ auc.sd <- function(y.true, y.pred) { sqrt(pROC::var(pROC::roc(y.true, y.pred, quiet = TRUE, direction = "<"))) } - #' Leave-one-out prediction using TSIR #' #' @param method reduction method to be applied @@ -91,14 +90,21 @@ c(X, y) %<-% readRDS("eeg_data_3d.rds") ##################################### GMLM ##################################### +proj.fft <- function(beta1, nr.freq = 5L) { + F <- fft(beta1) + Re(fft(`[<-`(F, head(order(abs(F)), -nr.freq), 0+0i), inverse = TRUE)) / length(F) +} + # perform preprocessed (reduced) and raw (not reduced) leave-one-out prediction y.hat.3.4 <- loo.predict(gmlm_tensor_normal, preprocess(X, 3, 4, 3), y) y.hat.15.15 <- loo.predict(gmlm_tensor_normal, preprocess(X, 15, 15, 3), y) y.hat.20.30 <- loo.predict(gmlm_tensor_normal, preprocess(X, 20, 30, 3), y) y.hat <- loo.predict(gmlm_tensor_normal, X, y) y.hat.fft <- loo.predict(gmlm_tensor_normal, X, y, proj.betas = list(proj.fft, NULL, NULL)) +y.hat.fft <- loo.predict(gmlm_tensor_normal, X, y, proj.betas = list(proj.fft, NULL, NULL)) # classification performance measures table by leave-one-out cross-validation +(loo.cv <- apply(cbind(y.hat.3.4, y.hat.15.15, y.hat.20.30, y.hat, y.hat.fft), 2, function(y.pred) { (loo.cv <- apply(cbind(y.hat.3.4, y.hat.15.15, y.hat.20.30, y.hat, y.hat.fft), 2, function(y.pred) { sapply(c("acc", "err", "fpr", "tpr", "fnr", "tnr", "auc", "auc.sd"), function(FUN) { match.fun(FUN)(as.integer(y) - 1L, y.pred) }) diff --git a/tensorPredictors/R/TSIR.R b/tensorPredictors/R/TSIR.R index 4ee49a8..fe0ec2f 100644 --- a/tensorPredictors/R/TSIR.R +++ b/tensorPredictors/R/TSIR.R @@ -6,7 +6,8 @@ TSIR <- function(X, y, sample.axis = 1L, nr.slices = 10L, # default slices, ignored if y is a factor or integer max.iter = 50L, - cond.threshold = Inf, eps = sqrt(.Machine$double.eps), + reg.threshold = Inf, reg.factor = 0.2, + eps = 1e-6, slice.method = c("cut", "ecdf"), # ignored if y is a factor or integer logger = NULL ) { @@ -122,13 +123,13 @@ TSIR <- function(X, y, Omegas <- Map(function(k) prod(dim(X)[-k])^-1 * mcrossprod(X, mode = k), modes) # Check condition of sample covariances and perform regularization if needed - if (is.finite(cond.threshold)) { + if (is.finite(reg.threshold)) { for (j in seq_along(Omegas)) { # Compute min and max eigen values min_max <- range(eigen(Omegas[[j]], TRUE, TRUE)$values) - # The condition is approximately `kappa(Omegas[[j]]) > cond.threshold` - if (min_max[2] > cond.threshold * min_max[1]) { - Omegas[[j]] <- Omegas[[j]] + diag(0.2 * min_max[2], nrow(Omegas[[j]])) + # The condition is approximately `kappa(Omegas[[j]]) > reg.threshold` + if (min_max[2] > reg.threshold * min_max[1]) { + diag(Omegas[[j]]) <- diag(Omegas[[j]]) + reg.factor * min_max[2] } } } diff --git a/tensorPredictors/R/gmlm_tensor_normal.R b/tensorPredictors/R/gmlm_tensor_normal.R index b0ce71d..a567389 100644 --- a/tensorPredictors/R/gmlm_tensor_normal.R +++ b/tensorPredictors/R/gmlm_tensor_normal.R @@ -5,7 +5,8 @@ #' @export gmlm_tensor_normal <- function(X, F, sample.axis = length(dim(X)), max.iter = 100L, proj.betas = NULL, proj.Omegas = NULL, logger = NULL, - cond.threshold = 25, eps = 1e-6 + reg.threshold = 25, reg.factor = 0.2, + eps = 1e-6 ) { # Special case for `F` being vector valued, add dims of size 1 if (is.null(dim(F))) { @@ -25,13 +26,13 @@ gmlm_tensor_normal <- function(X, F, sample.axis = length(dim(X)), dimF <- head(dim(F), -1) modes <- seq_along(dimX) - # Ensure the Omega and beta projections lists are lists - if (!is.list(proj.Omegas)) { - proj.Omegas <- rep(NULL, length(modes)) - } - if (!is.list(proj.betas)) { - proj.betas <- rep(NULL, length(modes)) - } + # # Ensure the Omega and beta projections lists are lists + # if (!is.list(proj.Omegas)) { + # proj.Omegas <- rep(NULL, length(modes)) # thats just NULL, which it already is + # } + # if (!is.list(proj.betas)) { + # proj.betas <- rep(NULL, length(modes)) + # } ### Phase 1: Computing initial values (`dim<-` ensures we have an "array") @@ -106,12 +107,13 @@ gmlm_tensor_normal <- function(X, F, sample.axis = length(dim(X)), # with regularization of the j'th mode covariance estimate `Sigma_j` for (j in seq_along(Sigmas)) { # Regularize Covariances - if (is.finite(cond.threshold)) { + if (is.finite(reg.threshold)) { # Compute min and max eigen values min_max <- range(eigen(Sigmas[[j]], TRUE, TRUE)$values) - # The condition is approximately `kappa(Sigmas[[j]]) > cond.threshold` - if (min_max[2] > cond.threshold * min_max[1]) { - Sigmas[[j]] <- Sigmas[[j]] + diag(0.2 * min_max[2], nrow(Sigmas[[j]])) + # The condition is approximately `kappa(Sigmas[[j]]) > reg.threshold` + if (min_max[2] > reg.threshold * min_max[1]) { + cat(sprintf("\033[2mReg (%d): cond(Sigma_%d) = %f\033[0m\n", iter, j, min_max[2] / min_max[1])) + diag(Sigmas[[j]]) <- diag(Sigmas[[j]]) + reg.factor * min_max[2] } } # Compute (unconstraint) Omega_j's as covariance inverse