我有一套收视率为45000用户和40多部电影。我需要根据每个用户与其他用户的pearson相关性来预测每个用户的新评分。我还需要为每个用户-电影组合存储一组相似的用户及其相似之处,我正在使用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)我能够完成一半的任务,即从预测输出“res”中创建一个预测评级矩阵。但是,我的列表df (我在其中附加了类似用户的列表)在foreach循环的末尾是空的。
哪些定制的组合功能可以用来输出预测评分矩阵和类似用户的列表?
发布于 2016-07-04 17:57:47
对于多个输出函数,最好返回列表中的所有内容。在这种情况下,这意味着您需要指定自己的函数来组合数据。这里,我每次返回两个元素: bx和df。因此,我的组合函数将这两个元素中的每一个单独组合起来,并在一个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)。
https://stackoverflow.com/questions/38189614
复制相似问题