我正在构建一个电影推荐引擎,下面的代码计算相似度矩阵。
data <- read.csv('movie_test.csv')
similarity <- matrix(NA, nrow(data), nrow(data))
for (i in 1:nrow(data)) {
for (j in 1:nrow(data)) {
if (i != j) {
similarity[i, j] <- sum((data[i,] * data[j,]), na.rm = TRUE) /
(sqrt((sum(((data[i,] - data[j,] + data[j,]) * data[i,]), na.rm = TRUE))) *
sqrt((sum(((data[j,] - data[i,] + data[i,]) * data[j,]), na.rm = TRUE))))
}
}
}
对于小型数据集,这非常有效。但对于900个用户和1000部电影,这不能扩展。我听说应用函数集的工作速度更快,但我怀疑即使这样也会扩展。有没有其他方法可以在不使用for循环的情况下完成上述任务?
非常感谢你的建议!!!
答案 0 :(得分:2)
这应该很快:
m <- as.matrix(data)
m[is.na(m)] <- 0
z <- m %*% t(m)
d <- sqrt(diag(z))
similarity <- t(t(z) / d) / d
对角线将包含1
,这似乎比NA
更合适,但如果您愿意,可以随时执行:
diag(similarity) <- NA