从多元正态分布加速嵌套绘图,其中每个绘图在r中具有不同的平均向量
作为模型拟合算法的一部分,我需要从多元正态分布中提取多个数据 绘图具有嵌套结构,因此对于模型拟合算法,我需要为5个单位绘制1000个绘图,每个单位包含500个单位。在这个例子中,总共有1000*5*500张图。对于1000张图纸中的每一张,多元分布的协方差矩阵从多元正态分布加速嵌套绘图,其中每个绘图在r中具有不同的平均向量,r,lapply,R,Lapply,作为模型拟合算法的一部分,我需要从多元正态分布中提取多个数据 绘图具有嵌套结构,因此对于模型拟合算法,我需要为5个单位绘制1000个绘图,每个单位包含500个单位。在这个例子中,总共有1000*5*500张图。对于1000张图纸中的每一张,多元分布的协方差矩阵sigma将不同。对于1000次绘制中的5*500个单位,平均向量mu将不同 我在下面编写了一个示例,首先设置我感兴趣的结构的示例数据,然后以我需要的格式生成绘图 #set up library(mvnfast) #for rmvn fun
sigma
将不同。对于1000次绘制中的5*500个单位,平均向量mu
将不同
我在下面编写了一个示例,首先设置我感兴趣的结构的示例数据,然后以我需要的格式生成绘图
#set up
library(mvnfast) #for rmvn function
nPar<-1000
K<-5
n<-rep(500,K)
mu<-lapply(1:nPar,function(u){
lapply(1:K,function(v){
do.call(rbind,lapply(1:n[v],function(w){
runif(1)*c(0.3,0.5)
}))
})
})
sigmamats<-lapply(1:nPar,function(u){
runif(1)*matrix(c(0.5,0.1,0.1,0.5),nrow=2,ncol=2)
})
#code needing speeding up
system.time(test<-lapply(1:nPar,function(u){
lapply(1:K,function(v){
do.call(rbind,lapply(1:n[v],function(w){
rmvn(n=1,
mu=mu[[u]][[v]][w,],
sigma=sigmamats[[u]])
}))
})
}))
# user system elapsed
# 122.01 78.49 204.06
编辑#2-理想情况下,这段代码最终会进入一个包,因此我需要一种加速这一过程的方法,它可以出现在有助于R包的代码中例如,您可以使用
furr
包对代码进行最小更改,从而获得并行解决方案
#code needing speeding up
library(furrr)
plan(multisession)
system.time(test<-future_map(1:nPar,function(u){
lapply(1:K,function(v){
do.call(rbind,lapply(1:n[v],function(w){
rmvn(n=1,
mu=mu[[u]][[v]][w,],
sigma=sigmamats[[u]])
}))
})
}))
在你以前的版本中,在我的电脑上
user system elapsed
30.608 1.399 32.017
结果在很大程度上取决于CPU的内核数量,但一般来说,您应该有一个性能改进,因为与任务的计算时间相比,并行化带来的开销非常小,即,您在内核之间“拆分”任务的时间稍微多一点,但是,每个核心只执行任务的一小部分所节省的时间要重要得多。您是否分析了代码以检查哪个部分花费的时间最长?这将回答与实现相关的问题。根据您的硬件,您可以并行运行绘图,因为一切都可以独立完成。请记住,您正在运行一个250万次的任务,它所需的时间有一个下限,但按时间划分为多个独立的块听起来是最合理的方法。我恐怕不太熟悉分析,但这里有一些我刚刚运行的代码-请参阅主节中的编辑将使用计划()如果代码的目的地是R包,则会出现问题吗?在plan In future package中的帮助文件中,在package developers部分下,它说“不要在代码中调用plan()”?我建议不要在包中使用
plan()
,主要是因为您不知道正在使用哪种会话、操作系统和硬件。或者,如果未指定plan()
,furr
将按顺序运行(这是您的初始实现)。因此,您可以在软件包中使用future\u map
,并告诉用户在文档中选择plan()
。除了furr
中的plan()
之外,您是否建议在软件包中使用另一个用于并行计算的软件包,我认为更适合包的是foreach
,但实现起来应该有点麻烦。caret
包是R中最流行的机器学习包之一,它使用foreach
进行并行化。它还要求用户设置通信层(通常只是一个简单的函数调用,就像furr
上的plan()
)。有关更多信息,请访问有用的链接:
user system elapsed
0.815 0.163 14.501
user system elapsed
30.608 1.399 32.017