我有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循环结束时是空的。
可以编写哪些自定义组合功能来输出预测评级矩阵和类似用户列表?
答案 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)
。