按图索骥可以调一下 --max-ppsize
之类的内存参数。
不过这可能并没什么用,单是在内存创建两个稠密的 40000 * 40000 矩阵就大概占用 35G 左右了,更不用说再去制造一些中间变量做矩阵运算特征值分解之类的,所以做好在未来把内存加到 64G 甚至 128G 的心理准备 😂
接下来用一个1/10规模的问题测下具体的性能瓶颈:
library("msaenet")
library("MASS")
library("profvis")
dat <- msaenet.sim.binomial(n = 1000, p = 4000, p.train = 0.6, seed = 2020)
profvis({
fit <- lda(x = dat$x.tr, grouping = as.factor(dat$y.tr))
})
可以看到特征值分解明显是花时间的,但更多空白处的时间花在各种矩阵操作上了。所以在考虑加内存的同时,自己重写 LDA 也是必须的。好在这并不困难,只涉及到几步纯矩阵运算:简单矩阵运算部分可以用 RcppArmadillo 或者 Rfast 之类的来写,SVD 部分可以用轩哥的 RSpectra 来做。实现得好说不定不用加内存也可以。
另外,这种高维问题输入数据的接口不要使用 data.frame 和 formula,用 matrix 的效率高得多。
最后,高维问题也可以试试各种 regularized LDA。