对于某个范围,我希望标识,在哪里发生分发更改,和,其中该值是最大的。目前,我正在对使用内核最大差异测试,范围内的每个值都是,并且在该值之前和之后取200个值,然后提取mmd统计值最大的位置。但这是非常计算密集型的计算,在R中请注意,我正在使用内核计算kmmd。我想知道是否有办法更快地做到这一点?或者你有什么建议。任何帮助都将不胜感激。
我的代码是:
cvg<-seq(1,2000)
cvg<-cvg^3-2*cvg^2+5*cvg
myRange<-seq(400:(length(cvg)-400))
kernel<-"splinedot"
cvg[201:(length(cvg)-200)]->cvg
myRange<-seq(400:(length(cvg)-400))
lapply(myRange, function(x) mmdstats(kmmd((as.matrix(cvg[(x+1):(x+400)])), (as.matrix(cvg[(x+801):(x+1200)])), kernel=kernel)))->kmm.ls
as.data.frame(as.matrix(kmm.ls))->kmm.ls
lapply(kmm.ls, function(x) which.max(mmdstats(x)))->store.max发布于 2021-04-20 09:25:00
我声明我不是kernlab方面的专家,所以我无法判断您分析的正确性或改进您的代码。但是,我可以建议您将lapply调用转换为并行版本,如sfLapply、parLapply、mclapply future_lapply ecc。在这里,我用sfLapply发布了一个来自snowfall包的示例(这是非常简单的,imo):
#your original lapply call took 500 seconds on my PC
system.time(kmm.ls <- lapply(myRange, function(x) mmdstats(kmmd((as.matrix(cvg[(x+1):
(x+400)])), (as.matrix(cvg[(x+801):(x+1200)])), kernel=kernel))))
library(kernlab)
library(snowfall)
sfInit(parallel=TRUE,cpus = parallel::detectCores()-1)
# Load the required packages inside the cluster
sfLibrary(kernlab)
#export all variable in all the cluster
sfExportAll()
# Run parallelized lapply with custom function
#sfLapply took 22 second on my 48 cores PC
system.time(kmm.ls <- sfLapply(myRange, function(x)
mmdstats(kmmd((as.matrix(cvg[(x+1):(x+400)])), (as.matrix(cvg[(x+801):(x+1200)])),
kernel=kernel))))
#stop cluster
sfStop()这是一个示例,您的代码中只有第一个lapply调用,但同样的思想可以应用于第二个调用(当我试图运行您的代码时,第二个lapply调用给了我一个错误)。
函数中的
错误(类、fdef、mtable):无法为函数‘mmdstats’找到用于签名‘list’的继承方法
这似乎不是一个关键的错误,但正如我所说的,我没有准备好建议如何修复它。
https://stackoverflow.com/questions/67169469
复制相似问题