我为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] 删除。
我来说两句