首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使基于内核函数的程序运行得更快

使基于内核函数的程序运行得更快
EN

Stack Overflow用户
提问于 2021-04-19 21:18:33
回答 1查看 103关注 0票数 0

对于某个范围,我希望标识,在哪里发生分发更改,,其中该值是最大的。目前,我正在对使用内核最大差异测试,范围内的每个值都是,并且在该值之前和之后取200个值,然后提取mmd统计值最大的位置。但这是非常计算密集型的计算,在R中请注意,我正在使用内核计算kmmd。我想知道是否有办法更快地做到这一点?或者你有什么建议。任何帮助都将不胜感激。

我的代码是:

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-20 09:25:00

我声明我不是kernlab方面的专家,所以我无法判断您分析的正确性或改进您的代码。但是,我可以建议您将lapply调用转换为并行版本,如sfLapplyparLapplymclapply future_lapply ecc。在这里,我用sfLapply发布了一个来自snowfall包的示例(这是非常简单的,imo):

代码语言:javascript
复制
#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’的继承方法

这似乎不是一个关键的错误,但正如我所说的,我没有准备好建议如何修复它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67169469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档