使用apply函数替换嵌套for循环

时间:2014-05-05 23:45:58

标签: r loops apply

我正在构建一个电影推荐引擎,下面的代码计算相似度矩阵。

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循环的情况下完成上述任务?

非常感谢你的建议!!!

1 个答案:

答案 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