我正在制作电影推荐人预测用户对看不见的电影的电影评级。大部分工作已完成,我创建了一个7000x3000矩阵 userRatingsNew ,其中包含7000个用户及其3000部电影的评级,用预测的评级替换所有缺失值。
我提供了另外两个文件,映射和 test ,并使用read.csv()将它们加载到以下格式的矩阵中。
映射是一个8,400,000x3矩阵,其中包含 id,user,movie ,其中 id 基本上是与用户关联的事务ID&# 39;对电影x的评分。
test 是一个8,400,000x2矩阵,其中包含 id,rating ,其中rating是与 id 关联的该电影的用户评分。 rating 列中的值为空,我需要使用我已计算的预测值填充这些值。
这是我的代码
writeResult <- function(userRatingsNew, mapping, test, writeToFile = FALSE){
start <- Sys.time()
result <- test
entries <- nrow(test)
for (i in 1:entries){
result[i,2] <- userRatingsNew[mapping[i,2], mapping[i,3]]
}
if (writeToFile)
write.csv(result, "result.csv", row.names=FALSE)
print(Sys.time()-start)
return(result)
}
我的问题是,对于i = 1:100,需要约7秒。因此,为了处理所有840万个条目,它需要大约163个小时。我尝试使用doMC()并实现并行处理,但我遇到了计算机内存不足的问题。我究竟能做些什么来加快这个过程?
答案 0 :(得分:2)
您可以使用另一个矩阵索引矩阵,如:
M <- matrix(1:25,nc=5,nr=5)
M
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 6 11 16 21
# [2,] 2 7 12 17 22
# [3,] 3 8 13 18 23
# [4,] 4 9 14 19 24
# [5,] 5 10 15 20 25
m <- cbind(1:5,5:1)
m
# [,1] [,2]
# [1,] 1 5
# [2,] 2 4
# [3,] 3 3
# [4,] 4 2
# [5,] 5 1
M[m]
# [1] 21 17 13 9 5
所以试试
result[,2] <- userRatingsNew[mapping[,2:3]]
你不应该需要循环。
答案 1 :(得分:1)
一个想法:
对于每个用户,您可以在一系列2d数据点中附加一个数组,该数组指定数组中的电影ID /数字/位置及其评级,而不是直接连接到7000大小维度的3000大小尺寸。据推测,大多数用户不会评价所有3000部电影。让我们说他们平均评价20部电影,现在20个案例中每个都通过正确引用阵列中的位置来调用电影名称数组,那么现在你只需要(7000)x(20x2 + 20) )事情正在发生,其中20x2指的是20个评级加上对电影的引用,另外20个是检索电影名称的事实。您可以首先使用数组位置编译所有报告,并附加指向电影名称数组的名称。