Foreach Parallel - 多个输出的组合功能

时间:2016-07-04 17:17:15

标签: r foreach

我有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循环结束时是空的。

可以编写哪些自定义组合功能来输出预测评级矩阵和类似用户列表?

1 个答案:

答案 0 :(得分:3)

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

相关问题