R 的 cmdscale() 的大 O 缩放

机器算法验证 r 算法 多维尺度
2022-03-15 22:31:10

我正在尝试cmdscale在大约 2,200 个变量(即 2,200x2,200 距离矩阵)上运行 R 的多维缩放算法。它需要永远(到目前为止大约一天)。我不太了解幕后使用的算法。它的大 O 符号是什么?是否有更有效的(即使只是近似的)易于设置和使用的算法?

2个回答

您应该能够通过 Monte Carlo 在您的系统上对此进行测试。例如:

try.cmdscale <- function(n) {
    x <- matrix(rnorm(n*n) ** 2,nrow=n,ncol=n);
    took.time <- system.time(cmdscale(x))
}

#repeat multiple times and take the median of the user.self + sys.self
#probably a better way to do timing?
multi.cmdscale <- function(n,ntrial = 11) {
    all.times <- replicate(ntrial,try.cmdscale(n))
    median(all.times[1,] + all.times[2,])
}

nvals <- c(8,16,32,64,128,256,512,1024)
tvals <- sapply(nvals,multi.cmdscale)
#ack! wish I could do a fit plot in logspace
plot(nvals,tvals,log="xy")

还没有这么丰富的信息:如果我能在这个图上做某种拟合,我可以估计大 O。(对 R 还不是很精通,但正在学习)。 时间缩放与样本量

具有讽刺意味的是,MDS 实际上不是我的问题。我正在做的预处理是问题所在。我习惯于使用低级语言进行编码,忘记了 R 中的循环有多慢。我使用向量操作重写了预处理代码,而 MDS 实际上只需要几秒钟。