Foreach并行-多个输出的合并功能

RUser

我为45000位用户和40部奇幻电影设置了一套评级。我需要根据每个用户与其他用户的皮尔逊相关性,为每个用户预测新的评分。我还需要为每个用户-电影组合存储一组相似的用户及其相似性。我正在使用foreach包并行执行循环。我设法编写的代码是这样的:

library(foreach)

x <- matrix(rnorm(1:1000), nrow = 100 , ncol =10 )
df = list()

# correlation matrix
cor_mat <- cor(t(x))
cor_mat = abs(cor_mat)
# similarity limits
upper = 1
lower = 0.04


# Initiating parallel environment
cl = makeCluster(3)
registerDoParallel(cl)

res <- foreach(i = 1:nrow(x) , .combine = rbind,.packages=     c('base','foreach')) %dopar%{
      foreach(j = 1:ncol(x) , .combine = c, .packages = c('base','foreach')) %do%{

sim_user = which(cor_mat[i,] >= lower & cor_mat[i,] < upper)

 bx = as.numeric(t(x[sim_user,j]) %*%  
  cor_mat[sim_user,j]/sum(cor_mat[sim_user,j]))
 df[[length(df)+1]] = data.frame(i,j,sim_user,cor_mat[sim_user,j])

 return(bx)

  }
 }
stopCluster(cl)

我能够完成一半的任务,即从foreach输出“ res”创建预测收视率矩阵。但是我要添加类似用户列表的列表df在foreach循环的末尾是空的。

可以编写哪些定制的组合函数以输出预测收视率矩阵和相似用户列表?

乔比

对于多个输出函数,最好返回列表中的所有内容。在这种情况下,这意味着您需要指定自己的函数来组合数据。在这里,我每次都返回两个元素:bx和df。因此,我的Combine函数分别组合了这两个元素中的每一个,并将它们返回到length-2列表中。

combine_custom_j <- function(LL1, LL2) {

  bx <- c(LL1$bx, LL2$bx)
  dfs <- c(LL1$df, LL2$df)
  return(list(bx = bx, df = dfs))
}

combine_custom_i <- function(LL1, LL2) {

  bx <- rbind(LL1$bx, LL2$bx)
  dfs <- c(LL1$df, LL2$df) 
  return(list(bx = bx, df = dfs))

}

res <- foreach(i = 1:nrow(x) , .combine = combine_custom_i,.packages= c('base','foreach')) %dopar%{
  foreach(j = 1:ncol(x) , .combine = combine_custom_j, .packages = c('base','foreach')) %do%{

    sim_user = which(cor_mat[i,] >= lower & cor_mat[i,] < upper)

    bx = as.numeric(t(x[sim_user,j]) %*%  
                      cor_mat[sim_user,j]/sum(cor_mat[sim_user,j]))

    return(list(bx = bx, df = data.frame(i,j,sim_user,cor_mat[sim_user,j])))

  }
}

尽管我已经按照建议的代码将数据框返回到列表中,但我相信您可能想要rbind它们?在这种情况下,你可以简单地替换c(LL1$df, LL2$df)rbind(LL1$df, LL2$df)两个结合的功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

doParallel和foreach无法并行化合并操作

来自分类Dev

火花流是否并行运行多个foreach

来自分类Dev

火花流是否并行运行多个foreach

来自分类Dev

foreach() 将多个图并行保存到磁盘

来自分类Dev

R foreach具有未导出功能的并行处理(以C50为例)

来自分类Dev

C#LINQ,转换嵌套在foreach中的多个并行for循环

来自分类Dev

使用 Parallel.ForEach 并行创建多个请求并放入列表中

来自分类Dev

Python并行化代码以合并多个图像

来自分类Dev

R:Foreach并行化

来自分类Dev

并行forEach搜索文件

来自分类Dev

并行ForEach丢失数据

来自分类Dev

EventHub ForEach 并行异步

来自分类Dev

在bash中捕获多个并行的grep输出

来自分类Dev

在foreach中导出多个输出

来自分类Dev

并行Autofac DI.foreach

来自分类Dev

“无限”异步并行foreach循环

来自分类Dev

C#并行Foreach +异步

来自分类Dev

并行Foreach引发ApartmentState异常

来自分类Dev

Foreach 循环中的并行处理

来自分类Dev

dopar foreach(运行并行 for 循环)

来自分类Dev

基于多个字段匹配/不匹配的awk合并行

来自分类Dev

根据多个条件合并行,然后对一列求和

来自分类Dev

功能和输出foreach结果与HTML

来自分类Dev

在Excel中合并行

来自分类Dev

在MySQL中合并行

来自分类Dev

按组合并行

来自分类Dev

PostgreSQL合并行

来自分类Dev

使用函数合并行

来自分类Dev

我的SQL合并行