首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于多输出的前置并行组合函数

用于多输出的前置并行组合函数
EN

Stack Overflow用户
提问于 2016-07-04 17:17:15
回答 1查看 3.1K关注 0票数 2

我有一套收视率为45000用户和40多部电影。我需要根据每个用户与其他用户的pearson相关性来预测每个用户的新评分。我还需要为每个用户-电影组合存储一组相似的用户及其相似之处,我正在使用foreach包并行执行这些循环。我编写的代码如下:

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

我能够完成一半的任务,即从预测输出“res”中创建一个预测评级矩阵。但是,我的列表df (我在其中附加了类似用户的列表)在foreach循环的末尾是空的。

哪些定制的组合功能可以用来输出预测评分矩阵和类似用户的列表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-04 17:57:47

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

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

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

https://stackoverflow.com/questions/38189614

复制
相关文章

相似问题

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