Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从多元正态分布加速嵌套绘图,其中每个绘图在r中具有不同的平均向量_R_Lapply - Fatal编程技术网

从多元正态分布加速嵌套绘图,其中每个绘图在r中具有不同的平均向量

从多元正态分布加速嵌套绘图,其中每个绘图在r中具有不同的平均向量,r,lapply,R,Lapply,作为模型拟合算法的一部分,我需要从多元正态分布中提取多个数据 绘图具有嵌套结构,因此对于模型拟合算法,我需要为5个单位绘制1000个绘图,每个单位包含500个单位。在这个例子中,总共有1000*5*500张图。对于1000张图纸中的每一张,多元分布的协方差矩阵sigma将不同。对于1000次绘制中的5*500个单位,平均向量mu将不同 我在下面编写了一个示例,首先设置我感兴趣的结构的示例数据,然后以我需要的格式生成绘图 #set up library(mvnfast) #for rmvn fun

作为模型拟合算法的一部分,我需要从多元正态分布中提取多个数据

绘图具有嵌套结构,因此对于模型拟合算法,我需要为5个单位绘制1000个绘图,每个单位包含500个单位。在这个例子中,总共有1000*5*500张图。对于1000张图纸中的每一张,多元分布的协方差矩阵
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